diff --git a/glm/gtx/bit.inl b/glm/gtx/bit.inl index c136d501..7f15dea7 100644 --- a/glm/gtx/bit.inl +++ b/glm/gtx/bit.inl @@ -8,766 +8,596 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// #include "../core/_detail.hpp" +#include "../core/_vectorize.hpp" -namespace glm{ - -template -GLM_FUNC_QUALIFIER genIType mask -( - genIType const & count -) -{ - return ((genIType(1) << (count)) - genIType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 mask -( - detail::tvec2 const & count -) -{ - return detail::tvec2( - mask(count[0]), - mask(count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 mask -( - detail::tvec3 const & count -) -{ - return detail::tvec3( - mask(count[0]), - mask(count[1]), - mask(count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 mask -( - detail::tvec4 const & count -) -{ - return detail::tvec4( - mask(count[0]), - mask(count[1]), - mask(count[2]), - mask(count[3])); -} - -// extractField -template -GLM_FUNC_QUALIFIER genIType extractField -( - half const & value, - genIType const & first, - genIType const & count -) -{ - assert(first + count < sizeof(half)); - return (value._data() << first) >> ((sizeof(half) << 3) - count); -} - -template -GLM_FUNC_QUALIFIER genIType extractField -( - float const & value, - genIType const & first, - genIType const & count -) -{ - assert(first + count < sizeof(float)); - return (detail::uif32(value).i << first) >> ((sizeof(float) << 3) - count); -} - -template -GLM_FUNC_QUALIFIER genIType extractField -( - double const & value, - genIType const & first, - genIType const & count -) +namespace glm { - assert(first + count < sizeof(double)); - return (detail::uif64(value).i << first) >> ((sizeof(double) << genIType(3)) - count); -} - -template -GLM_FUNC_QUALIFIER genIUType extractField -( - genIUType const & Value, - sizeType const & First, - sizeType const & Count -) -{ - sizeType GenSize = sizeof(genIUType) << 3; + template + GLM_FUNC_QUALIFIER genIType mask + ( + genIType const & count + ) + { + return ((genIType(1) << (count)) - genIType(1)); + } - assert(First + Count <= GenSize); + VECTORIZE_VEC(mask) - genIUType ShiftLeft = Count ? Value << (GenSize - (Count + First)) : 0; - genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Count); + // extractField + template + GLM_FUNC_QUALIFIER genIType extractField + ( + half const & value, + genIType const & first, + genIType const & count + ) + { + assert(first + count < sizeof(half)); + return (value._data() << first) >> ((sizeof(half) << 3) - count); + } - return ShiftBack; -} + template + GLM_FUNC_QUALIFIER genIType extractField + ( + float const & value, + genIType const & first, + genIType const & count + ) + { + assert(first + count < sizeof(float)); + return (detail::uif32(value).i << first) >> ((sizeof(float) << 3) - count); + } -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - detail::tvec2 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec2( - extractField(value[0], first, count), - extractField(value[1], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - detail::tvec3 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec3( - extractField(value[0], first, count), - extractField(value[1], first, count), - extractField(value[2], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - detail::tvec4 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec4( - extractField(value[0], first, count), - extractField(value[1], first, count), - extractField(value[2], first, count), - extractField(value[3], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - detail::tvec2 const & value, - detail::tvec2 const & first, - detail::tvec2 const & count -) -{ - return detail::tvec2( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - detail::tvec3 const & value, - detail::tvec3 const & first, - detail::tvec3 const & count -) -{ - return detail::tvec3( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1]), - extractField(value[2], first[2], count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - detail::tvec4 const & value, - detail::tvec4 const & first, - detail::tvec4 const & count -) -{ - return detail::tvec4( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1]), - extractField(value[2], first[2], count[2]), - extractField(value[3], first[3], count[3])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - genIUType const & value, - detail::tvec2 const & first, - detail::tvec2 const & count -) -{ - return detail::tvec2( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - genIUType const & value, - detail::tvec3 const & first, - detail::tvec3 const & count -) -{ - return detail::tvec3( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1]), - extractField(value, first[2], count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - genIUType const & value, - detail::tvec4 const & first, - detail::tvec4 const & count -) -{ - return detail::tvec4( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1]), - extractField(value, first[2], count[2]), - extractField(value, first[3], count[3])); -} - -// lowestBit -template -GLM_FUNC_QUALIFIER int lowestBit -( - genType const & Value -) -{ - assert(Value != genType(0)); // not valid call - - genType Bit; - for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){} - return Bit; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 lowestBit -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - lowestBit(value[0]), - lowestBit(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 lowestBit -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - lowestBit(value[0]), - lowestBit(value[1]), - lowestBit(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 lowestBit -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - lowestBit(value[0]), - lowestBit(value[1]), - lowestBit(value[2]), - lowestBit(value[3])); -} - -// highestBit -template -GLM_FUNC_QUALIFIER int highestBit -( - genType const & value -) -{ - assert(value != genType(0)); // not valid call - - genType bit = genType(-1); - for(genType tmp = value; tmp; tmp >>= 1, ++bit){} - return bit; -} - -//template <> -//GLM_FUNC_QUALIFIER int highestBit -//( -// int value -//) -//{ -// int bit = -1; -// for(int tmp = value; tmp; tmp >>= 1, ++bit); -// return bit; -//} - -template -GLM_FUNC_QUALIFIER detail::tvec2 highestBit -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - highestBit(value[0]), - highestBit(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 highestBit -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - highestBit(value[0]), - highestBit(value[1]), - highestBit(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 highestBit -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - highestBit(value[0]), - highestBit(value[1]), - highestBit(value[2]), - highestBit(value[3])); -} - -// highestBitValue -template -GLM_FUNC_QUALIFIER genType highestBitValue -( - genType const & value -) -{ - genType tmp = value; - genType result = genType(0); - while(tmp) + template + GLM_FUNC_QUALIFIER genIType extractField + ( + double const & value, + genIType const & first, + genIType const & count + ) { - result = (tmp & (~tmp + 1)); // grab lowest bit - tmp &= ~result; // clear lowest bit + assert(first + count < sizeof(double)); + return (detail::uif64(value).i << first) >> ((sizeof(double) << genIType(3)) - count); } - return result; -} -template -GLM_FUNC_QUALIFIER detail::tvec2 highestBitValue -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - highestBitValue(value[0]), - highestBitValue(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 highestBitValue -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - highestBitValue(value[0]), - highestBitValue(value[1]), - highestBitValue(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 highestBitValue -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - highestBitValue(value[0]), - highestBitValue(value[1]), - highestBitValue(value[2]), - highestBitValue(value[3])); -} - -// isPowerOfTwo -template -GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const & Value) -{ - //detail::If::is_signed>::apply(abs, Value); - //return !(Value & (Value - 1)); - - // For old complier? - genType Result = Value; - if(std::numeric_limits::is_signed) - Result = abs(Result); - return !(Result & (Result - 1)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 isPowerOfTwo -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 isPowerOfTwo -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1]), - isPowerOfTwo(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 isPowerOfTwo -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1]), - isPowerOfTwo(value[2]), - isPowerOfTwo(value[3])); -} - -// powerOfTwoAbove -template -GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const & value) -{ - return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoAbove -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoAbove -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1]), - powerOfTwoAbove(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoAbove -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1]), - powerOfTwoAbove(value[2]), - powerOfTwoAbove(value[3])); -} - -// powerOfTwoBelow -template -GLM_FUNC_QUALIFIER genType powerOfTwoBelow -( - genType const & value -) -{ - return isPowerOfTwo(value) ? value : highestBitValue(value); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoBelow -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoBelow -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1]), - powerOfTwoBelow(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoBelow -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1]), - powerOfTwoBelow(value[2]), - powerOfTwoBelow(value[3])); -} - -// powerOfTwoNearest -template -GLM_FUNC_QUALIFIER genType powerOfTwoNearest -( - genType const & value -) -{ - if(isPowerOfTwo(value)) - return value; - - genType prev = highestBitValue(value); - genType next = prev << 1; - return (next - value) < (value - prev) ? next : prev; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoNearest -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoNearest -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1]), - powerOfTwoNearest(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoNearest -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1]), - powerOfTwoNearest(value[2]), - powerOfTwoNearest(value[3])); -} - -template -GLM_FUNC_QUALIFIER genType bitRevert(genType const & In) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRevert' only accept integer values"); - - genType Out = 0; - std::size_t BitSize = sizeof(genType) * 8; - for(std::size_t i = 0; i < BitSize; ++i) - if(In & (genType(1) << i)) - Out |= genType(1) << (BitSize - 1 - i); - return Out; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRevert -( - detail::tvec2 const & Value -) -{ - return detail::tvec2( - bitRevert(Value[0]), - bitRevert(Value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRevert -( - detail::tvec3 const & Value -) -{ - return detail::tvec3( - bitRevert(Value[0]), - bitRevert(Value[1]), - bitRevert(Value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRevert -( - detail::tvec4 const & Value -) -{ - return detail::tvec4( - bitRevert(Value[0]), - bitRevert(Value[1]), - bitRevert(Value[2]), - bitRevert(Value[3])); -} - -template -GLM_FUNC_QUALIFIER genType bitRotateRight(genType const & In, std::size_t Shift) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateRight' only accept integer values"); - - std::size_t BitSize = sizeof(genType) * 8; - return (In << Shift) | (In >> (BitSize - Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRotateRight -( - detail::tvec2 const & Value, - std::size_t Shift -) -{ - return detail::tvec2( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRotateRight -( - detail::tvec3 const & Value, - std::size_t Shift -) -{ - return detail::tvec3( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift), - bitRotateRight(Value[2], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRotateRight -( - detail::tvec4 const & Value, - std::size_t Shift -) -{ - return detail::tvec4( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift), - bitRotateRight(Value[2], Shift), - bitRotateRight(Value[3], Shift)); -} - -template -GLM_FUNC_QUALIFIER genType bitRotateLeft(genType const & In, std::size_t Shift) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateLeft' only accept integer values"); - - std::size_t BitSize = sizeof(genType) * 8; - return (In >> Shift) | (In << (BitSize - Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRotateLeft -( - detail::tvec2 const & Value, - std::size_t Shift -) -{ - return detail::tvec2( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRotateLeft -( - detail::tvec3 const & Value, - std::size_t Shift -) -{ - return detail::tvec3( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift), - bitRotateLeft(Value[2], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRotateLeft -( - detail::tvec4 const & Value, - std::size_t Shift -) -{ - return detail::tvec4( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift), - bitRotateLeft(Value[2], Shift), - bitRotateLeft(Value[3], Shift)); -} - -template -GLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne -( - genIUType const & Value, - int const & FromBit, - int const & ToBit -) -{ - assert(FromBit <= ToBit); - assert(ToBit <= sizeof(genIUType) * std::size_t(8)); - - genIUType Result = Value; - for(std::size_t i = 0; i <= ToBit; ++i) - Result |= (1 << i); - return Result; -} - -template -GLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero -( - genIUType const & Value, - int const & FromBit, - int const & ToBit -) -{ - assert(FromBit <= ToBit); - assert(ToBit <= sizeof(genIUType) * std::size_t(8)); + template + GLM_FUNC_QUALIFIER genIUType extractField + ( + genIUType const & Value, + sizeType const & First, + sizeType const & Count + ) + { + sizeType GenSize = sizeof(genIUType) << 3; + + assert(First + Count <= GenSize); + + genIUType ShiftLeft = Count ? Value << (GenSize - (Count + First)) : 0; + genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Count); + + return ShiftBack; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 extractField + ( + detail::tvec2 const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec2( + extractField(value[0], first, count), + extractField(value[1], first, count)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 extractField + ( + detail::tvec3 const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec3( + extractField(value[0], first, count), + extractField(value[1], first, count), + extractField(value[2], first, count)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 extractField + ( + detail::tvec4 const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec4( + extractField(value[0], first, count), + extractField(value[1], first, count), + extractField(value[2], first, count), + extractField(value[3], first, count)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 extractField + ( + detail::tvec2 const & value, + detail::tvec2 const & first, + detail::tvec2 const & count + ) + { + return detail::tvec2( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 extractField + ( + detail::tvec3 const & value, + detail::tvec3 const & first, + detail::tvec3 const & count + ) + { + return detail::tvec3( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1]), + extractField(value[2], first[2], count[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 extractField + ( + detail::tvec4 const & value, + detail::tvec4 const & first, + detail::tvec4 const & count + ) + { + return detail::tvec4( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1]), + extractField(value[2], first[2], count[2]), + extractField(value[3], first[3], count[3])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 extractField + ( + genIUType const & value, + detail::tvec2 const & first, + detail::tvec2 const & count + ) + { + return detail::tvec2( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 extractField + ( + genIUType const & value, + detail::tvec3 const & first, + detail::tvec3 const & count + ) + { + return detail::tvec3( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1]), + extractField(value, first[2], count[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 extractField + ( + genIUType const & value, + detail::tvec4 const & first, + detail::tvec4 const & count + ) + { + return detail::tvec4( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1]), + extractField(value, first[2], count[2]), + extractField(value, first[3], count[3])); + } + + // lowestBit + template + GLM_FUNC_QUALIFIER int lowestBit + ( + genType const & Value + ) + { + assert(Value != genType(0)); // not valid call + + genType Bit; + for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){} + return Bit; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 lowestBit + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + lowestBit(value[0]), + lowestBit(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 lowestBit + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + lowestBit(value[0]), + lowestBit(value[1]), + lowestBit(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 lowestBit + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + lowestBit(value[0]), + lowestBit(value[1]), + lowestBit(value[2]), + lowestBit(value[3])); + } + + // highestBit + template + GLM_FUNC_QUALIFIER int highestBit + ( + genType const & value + ) + { + assert(value != genType(0)); // not valid call + + genType bit = genType(-1); + for(genType tmp = value; tmp; tmp >>= 1, ++bit){} + return bit; + } + + //template <> + //GLM_FUNC_QUALIFIER int highestBit + //( + // int value + //) + //{ + // int bit = -1; + // for(int tmp = value; tmp; tmp >>= 1, ++bit); + // return bit; + //} + + template + GLM_FUNC_QUALIFIER detail::tvec2 highestBit + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + highestBit(value[0]), + highestBit(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 highestBit + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + highestBit(value[0]), + highestBit(value[1]), + highestBit(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 highestBit + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + highestBit(value[0]), + highestBit(value[1]), + highestBit(value[2]), + highestBit(value[3])); + } + + // highestBitValue + template + GLM_FUNC_QUALIFIER genType highestBitValue + ( + genType const & value + ) + { + genType tmp = value; + genType result = genType(0); + while(tmp) + { + result = (tmp & (~tmp + 1)); // grab lowest bit + tmp &= ~result; // clear lowest bit + } + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 highestBitValue + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + highestBitValue(value[0]), + highestBitValue(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 highestBitValue + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + highestBitValue(value[0]), + highestBitValue(value[1]), + highestBitValue(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 highestBitValue + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + highestBitValue(value[0]), + highestBitValue(value[1]), + highestBitValue(value[2]), + highestBitValue(value[3])); + } + + // isPowerOfTwo + template + GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const & Value) + { + //detail::If::is_signed>::apply(abs, Value); + //return !(Value & (Value - 1)); + + // For old complier? + genType Result = Value; + if(std::numeric_limits::is_signed) + Result = abs(Result); + return !(Result & (Result - 1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 isPowerOfTwo + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 isPowerOfTwo + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1]), + isPowerOfTwo(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 isPowerOfTwo + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1]), + isPowerOfTwo(value[2]), + isPowerOfTwo(value[3])); + } - genIUType Result = Value; - for(std::size_t i = 0; i <= ToBit; ++i) - Result &= ~(1 << i); - return Result; -} + // powerOfTwoAbove + template + GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const & value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; + } + + VECTORIZE_VEC(powerOfTwoAbove) + + // powerOfTwoBelow + template + GLM_FUNC_QUALIFIER genType powerOfTwoBelow + ( + genType const & value + ) + { + return isPowerOfTwo(value) ? value : highestBitValue(value); + } + + VECTORIZE_VEC(powerOfTwoBelow) + // powerOfTwoNearest + template + GLM_FUNC_QUALIFIER genType powerOfTwoNearest + ( + genType const & value + ) + { + if(isPowerOfTwo(value)) + return value; + + genType prev = highestBitValue(value); + genType next = prev << 1; + return (next - value) < (value - prev) ? next : prev; + } + + VECTORIZE_VEC(powerOfTwoNearest) + + template + GLM_FUNC_QUALIFIER genType bitRevert(genType const & In) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRevert' only accept integer values"); + + genType Out = 0; + std::size_t BitSize = sizeof(genType) * 8; + for(std::size_t i = 0; i < BitSize; ++i) + if(In & (genType(1) << i)) + Out |= genType(1) << (BitSize - 1 - i); + return Out; + } + + VECTORIZE_VEC(bitRevert) + + template + GLM_FUNC_QUALIFIER genType bitRotateRight(genType const & In, std::size_t Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateRight' only accept integer values"); + + std::size_t BitSize = sizeof(genType) * 8; + return (In << Shift) | (In >> (BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitRotateRight + ( + detail::tvec2 const & Value, + std::size_t Shift + ) + { + return detail::tvec2( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitRotateRight + ( + detail::tvec3 const & Value, + std::size_t Shift + ) + { + return detail::tvec3( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift), + bitRotateRight(Value[2], Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitRotateRight + ( + detail::tvec4 const & Value, + std::size_t Shift + ) + { + return detail::tvec4( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift), + bitRotateRight(Value[2], Shift), + bitRotateRight(Value[3], Shift)); + } + + template + GLM_FUNC_QUALIFIER genType bitRotateLeft(genType const & In, std::size_t Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateLeft' only accept integer values"); + + std::size_t BitSize = sizeof(genType) * 8; + return (In >> Shift) | (In << (BitSize - Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitRotateLeft + ( + detail::tvec2 const & Value, + std::size_t Shift + ) + { + return detail::tvec2( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitRotateLeft + ( + detail::tvec3 const & Value, + std::size_t Shift + ) + { + return detail::tvec3( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift), + bitRotateLeft(Value[2], Shift)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitRotateLeft + ( + detail::tvec4 const & Value, + std::size_t Shift + ) + { + return detail::tvec4( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift), + bitRotateLeft(Value[2], Shift), + bitRotateLeft(Value[3], Shift)); + } + + template + GLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne + ( + genIUType const & Value, + int const & FromBit, + int const & ToBit + ) + { + assert(FromBit <= ToBit); + assert(ToBit <= sizeof(genIUType) * std::size_t(8)); + + genIUType Result = Value; + for(std::size_t i = 0; i <= ToBit; ++i) + Result |= (1 << i); + return Result; + } + + template + GLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero + ( + genIUType const & Value, + int const & FromBit, + int const & ToBit + ) + { + assert(FromBit <= ToBit); + assert(ToBit <= sizeof(genIUType) * std::size_t(8)); + + genIUType Result = Value; + for(std::size_t i = 0; i <= ToBit; ++i) + Result &= ~(1 << i); + return Result; + } }//namespace glm diff --git a/glm/gtx/closest_point.inl b/glm/gtx/closest_point.inl index 5d19d7cc..91aaed2c 100644 --- a/glm/gtx/closest_point.inl +++ b/glm/gtx/closest_point.inl @@ -10,28 +10,27 @@ #ifndef glm_gtx_closest_point #define glm_gtx_closest_point -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec3 closestPointOnLine -( - detail::tvec3 const & point, - detail::tvec3 const & a, - detail::tvec3 const & b -) +namespace glm { - valType LineLength = distance(a, b); - detail::tvec3 Vector = point - a; - detail::tvec3 LineDirection = (b - a) / LineLength; - - // Project Vector to LineDirection to get the distance of point from a - valType Distance = dot(Vector, LineDirection); + template + GLM_FUNC_QUALIFIER detail::tvec3 closestPointOnLine + ( + detail::tvec3 const & point, + detail::tvec3 const & a, + detail::tvec3 const & b + ) + { + valType LineLength = distance(a, b); + detail::tvec3 Vector = point - a; + detail::tvec3 LineDirection = (b - a) / LineLength; - if(Distance <= valType(0)) return a; - if(Distance >= LineLength) return b; - return a + LineDirection * Distance; -} + // Project Vector to LineDirection to get the distance of point from a + valType Distance = dot(Vector, LineDirection); + if(Distance <= valType(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } }//namespace glm #endif//glm_gtx_closest_point diff --git a/glm/gtx/color_cast.inl b/glm/gtx/color_cast.inl index ddfbcc0c..27eb6727 100644 --- a/glm/gtx/color_cast.inl +++ b/glm/gtx/color_cast.inl @@ -7,728 +7,727 @@ // File : glm/gtx/color_cast.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER uint8 u8channel_cast(T a) -{ - return static_cast(a * T(255)); -} - -template -GLM_FUNC_QUALIFIER uint16 u16channel_cast(T a) -{ - return static_cast(a * T(65535)); -} - -template -GLM_FUNC_QUALIFIER uint32 u32_rgbx_cast(const detail::tvec3& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(255)) << 0; - result += static_cast(c.y * detail::tvec3::value_type(255)) << 8; - result += static_cast(c.z * detail::tvec3::value_type(255)) << 16; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_xrgb_cast(const detail::tvec3& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(255)) << 8; - result += static_cast(c.y * detail::tvec3::value_type(255)) << 16; - result += static_cast(c.z * detail::tvec3::value_type(255)) << 24; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_bgrx_cast(const detail::tvec3& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(255)) << 16; - result += static_cast(c.y * detail::tvec3::value_type(255)) << 8; - result += static_cast(c.z * detail::tvec3::value_type(255)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_xbgr_cast(const detail::tvec3& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(255)) << 24; - result += static_cast(c.y * detail::tvec3::value_type(255)) << 16; - result += static_cast(c.z * detail::tvec3::value_type(255)) << 8; - result += static_cast(c.w * detail::tvec3::value_type(255)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_rgba_cast(const detail::tvec4& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(255)) << 0; - result += static_cast(c.y * detail::tvec4::value_type(255)) << 8; - result += static_cast(c.z * detail::tvec4::value_type(255)) << 16; - result += static_cast(c.w * detail::tvec4::value_type(255)) << 24; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_argb_cast(const detail::tvec4& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(255)) << 8; - result += static_cast(c.y * detail::tvec4::value_type(255)) << 16; - result += static_cast(c.z * detail::tvec4::value_type(255)) << 24; - result += static_cast(c.w * detail::tvec4::value_type(255)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_bgra_cast(const detail::tvec4& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(255)) << 16; - result += static_cast(c.y * detail::tvec4::value_type(255)) << 8; - result += static_cast(c.z * detail::tvec4::value_type(255)) << 0; - result += static_cast(c.w * detail::tvec4::value_type(255)) << 24; - return result; -} - -template -GLM_FUNC_QUALIFIER uint32 u32_abgr_cast(const detail::tvec4& c) -{ - uint32 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(255)) << 24; - result += static_cast(c.y * detail::tvec4::value_type(255)) << 16; - result += static_cast(c.z * detail::tvec4::value_type(255)) << 8; - result += static_cast(c.w * detail::tvec4::value_type(255)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u64_rgbx_cast(const detail::tvec3& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(65535)) << 0; - result += static_cast(c.y * detail::tvec3::value_type(65535)) << 16; - result += static_cast(c.z * detail::tvec3::value_type(65535)) << 32; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u32_xrgb_cast(const detail::tvec3& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(65535)) << 16; - result += static_cast(c.y * detail::tvec3::value_type(65535)) << 32; - result += static_cast(c.z * detail::tvec3::value_type(65535)) << 48; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u32_bgrx_cast(const detail::tvec3& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(65535)) << 32; - result += static_cast(c.y * detail::tvec3::value_type(65535)) << 16; - result += static_cast(c.z * detail::tvec3::value_type(65535)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u32_xbgr_cast(const detail::tvec3& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec3::value_type(65535)) << 48; - result += static_cast(c.y * detail::tvec3::value_type(65535)) << 32; - result += static_cast(c.z * detail::tvec3::value_type(65535)) << 16; - result += static_cast(c.w * detail::tvec3::value_type(65535)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u64_rgba_cast(const detail::tvec4& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(65535)) << 0; - result += static_cast(c.y * detail::tvec4::value_type(65535)) << 16; - result += static_cast(c.z * detail::tvec4::value_type(65535)) << 32; - result += static_cast(c.w * detail::tvec4::value_type(65535)) << 48; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u64_argb_cast(const detail::tvec4& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(65535)) << 16; - result += static_cast(c.y * detail::tvec4::value_type(65535)) << 32; - result += static_cast(c.z * detail::tvec4::value_type(65535)) << 48; - result += static_cast(c.w * detail::tvec4::value_type(65535)) << 0; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u64_bgra_cast(const detail::tvec4& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(65535)) << 32; - result += static_cast(c.y * detail::tvec4::value_type(65535)) << 16; - result += static_cast(c.z * detail::tvec4::value_type(65535)) << 0; - result += static_cast(c.w * detail::tvec4::value_type(65535)) << 48; - return result; -} - -template -GLM_FUNC_QUALIFIER uint64 u64_abgr_cast(const detail::tvec4& c) -{ - uint64 result = 0; - result += static_cast(c.x * detail::tvec4::value_type(65535)) << 48; - result += static_cast(c.y * detail::tvec4::value_type(65535)) << 32; - result += static_cast(c.z * detail::tvec4::value_type(65535)) << 16; - result += static_cast(c.w * detail::tvec4::value_type(65535)) << 0; - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16 f16_channel_cast(uint32 color) -{ - return f16(static_cast(color >> 0) / static_cast(255)); -} - -template <> -GLM_FUNC_QUALIFIER f16vec3 f16_rgbx_cast(uint32 color) -{ - f16vec3 result; - result.x = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec3 f16_xrgb_cast(uint32 color) -{ - f16vec3 result; - result.x = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec3 f16_bgrx_cast(uint32 color) -{ - f16vec3 result; - result.x = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec3 f16_xbgr_cast(uint32 color) -{ - f16vec3 result; - result.x = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec4 f16_rgba_cast(uint32 color) -{ - f16vec4 result; - result.x = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.w = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec4 f16_argb_cast(uint32 color) -{ - f16vec4 result; - result.x = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - result.w = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec4 f16_bgra_cast(uint32 color) -{ - f16vec4 result; - result.x = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - result.w = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER f16vec4 f16_abgr_cast(uint32 color) -{ - f16vec4 result; - result.x = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); - result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); - result.z = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); - result.w = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER float f32_channel_cast(uint8 color) -{ - return static_cast(color >> 0) / static_cast(255); -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_rgbx_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_xrgb_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_bgrx_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_xbgr_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_rgba_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_argb_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_bgra_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_abgr_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER double f64_channel_cast(uint8 color) -{ - return static_cast(color >> 0) / static_cast(255); -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_rgbx_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_xrgb_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_bgrx_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_xbgr_cast(uint32 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_rgba_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_argb_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_bgra_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_abgr_cast(uint32 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); - result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); - result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); - result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::thalf f16_channel_cast(uint16 color) -{ - return detail::thalf(static_cast(color >> 0) / static_cast(65535)); -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f16_rgbx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f16_xrgb_cast(uint64 color) -{ - detail::tvec3 result; - result.x = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f16_bgrx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f16_xbgr_cast(uint64 color) -{ - detail::tvec3 result; - result.x = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f16_rgba_cast(uint64 color) -{ - detail::tvec4 result; - result.x = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.w = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f16_argb_cast(uint64 color) -{ - detail::tvec4 result; - result.x = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - result.w = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f16_bgra_cast(uint64 color) -{ - detail::tvec4 result; - result.x = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - result.w = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f16_abgr_cast(uint64 color) -{ - detail::tvec4 result; - result.x = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); - result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); - result.z = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); - result.w = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); - return result; -} - -template <> -GLM_FUNC_QUALIFIER float f32_channel_cast(uint16 color) -{ - return static_cast(color >> 0) / static_cast(65535); -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_rgbx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_xrgb_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_bgrx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f32_xbgr_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_rgba_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_argb_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_bgra_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f32_abgr_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER double f64_channel_cast(uint16 color) -{ - return static_cast(color >> 0) / static_cast(65535); -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_rgbx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_xrgb_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_bgrx_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec3 f64_xbgr_cast(uint64 color) -{ - detail::tvec3 result; - result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_rgba_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_argb_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_bgra_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - return result; -} - -template <> -GLM_FUNC_QUALIFIER detail::tvec4 f64_abgr_cast(uint64 color) -{ - detail::tvec4 result; - result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); - result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); - result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); - result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); - return result; -} - +namespace glm +{ + template + GLM_FUNC_QUALIFIER uint8 u8channel_cast(T a) + { + return static_cast(a * T(255)); + } + + template + GLM_FUNC_QUALIFIER uint16 u16channel_cast(T a) + { + return static_cast(a * T(65535)); + } + + template + GLM_FUNC_QUALIFIER uint32 u32_rgbx_cast(const detail::tvec3& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(255)) << 0; + result += static_cast(c.y * detail::tvec3::value_type(255)) << 8; + result += static_cast(c.z * detail::tvec3::value_type(255)) << 16; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_xrgb_cast(const detail::tvec3& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(255)) << 8; + result += static_cast(c.y * detail::tvec3::value_type(255)) << 16; + result += static_cast(c.z * detail::tvec3::value_type(255)) << 24; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_bgrx_cast(const detail::tvec3& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(255)) << 16; + result += static_cast(c.y * detail::tvec3::value_type(255)) << 8; + result += static_cast(c.z * detail::tvec3::value_type(255)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_xbgr_cast(const detail::tvec3& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(255)) << 24; + result += static_cast(c.y * detail::tvec3::value_type(255)) << 16; + result += static_cast(c.z * detail::tvec3::value_type(255)) << 8; + result += static_cast(c.w * detail::tvec3::value_type(255)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_rgba_cast(const detail::tvec4& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(255)) << 0; + result += static_cast(c.y * detail::tvec4::value_type(255)) << 8; + result += static_cast(c.z * detail::tvec4::value_type(255)) << 16; + result += static_cast(c.w * detail::tvec4::value_type(255)) << 24; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_argb_cast(const detail::tvec4& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(255)) << 8; + result += static_cast(c.y * detail::tvec4::value_type(255)) << 16; + result += static_cast(c.z * detail::tvec4::value_type(255)) << 24; + result += static_cast(c.w * detail::tvec4::value_type(255)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_bgra_cast(const detail::tvec4& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(255)) << 16; + result += static_cast(c.y * detail::tvec4::value_type(255)) << 8; + result += static_cast(c.z * detail::tvec4::value_type(255)) << 0; + result += static_cast(c.w * detail::tvec4::value_type(255)) << 24; + return result; + } + + template + GLM_FUNC_QUALIFIER uint32 u32_abgr_cast(const detail::tvec4& c) + { + uint32 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(255)) << 24; + result += static_cast(c.y * detail::tvec4::value_type(255)) << 16; + result += static_cast(c.z * detail::tvec4::value_type(255)) << 8; + result += static_cast(c.w * detail::tvec4::value_type(255)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u64_rgbx_cast(const detail::tvec3& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(65535)) << 0; + result += static_cast(c.y * detail::tvec3::value_type(65535)) << 16; + result += static_cast(c.z * detail::tvec3::value_type(65535)) << 32; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u32_xrgb_cast(const detail::tvec3& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(65535)) << 16; + result += static_cast(c.y * detail::tvec3::value_type(65535)) << 32; + result += static_cast(c.z * detail::tvec3::value_type(65535)) << 48; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u32_bgrx_cast(const detail::tvec3& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(65535)) << 32; + result += static_cast(c.y * detail::tvec3::value_type(65535)) << 16; + result += static_cast(c.z * detail::tvec3::value_type(65535)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u32_xbgr_cast(const detail::tvec3& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec3::value_type(65535)) << 48; + result += static_cast(c.y * detail::tvec3::value_type(65535)) << 32; + result += static_cast(c.z * detail::tvec3::value_type(65535)) << 16; + result += static_cast(c.w * detail::tvec3::value_type(65535)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u64_rgba_cast(const detail::tvec4& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(65535)) << 0; + result += static_cast(c.y * detail::tvec4::value_type(65535)) << 16; + result += static_cast(c.z * detail::tvec4::value_type(65535)) << 32; + result += static_cast(c.w * detail::tvec4::value_type(65535)) << 48; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u64_argb_cast(const detail::tvec4& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(65535)) << 16; + result += static_cast(c.y * detail::tvec4::value_type(65535)) << 32; + result += static_cast(c.z * detail::tvec4::value_type(65535)) << 48; + result += static_cast(c.w * detail::tvec4::value_type(65535)) << 0; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u64_bgra_cast(const detail::tvec4& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(65535)) << 32; + result += static_cast(c.y * detail::tvec4::value_type(65535)) << 16; + result += static_cast(c.z * detail::tvec4::value_type(65535)) << 0; + result += static_cast(c.w * detail::tvec4::value_type(65535)) << 48; + return result; + } + + template + GLM_FUNC_QUALIFIER uint64 u64_abgr_cast(const detail::tvec4& c) + { + uint64 result = 0; + result += static_cast(c.x * detail::tvec4::value_type(65535)) << 48; + result += static_cast(c.y * detail::tvec4::value_type(65535)) << 32; + result += static_cast(c.z * detail::tvec4::value_type(65535)) << 16; + result += static_cast(c.w * detail::tvec4::value_type(65535)) << 0; + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16 f16_channel_cast(uint32 color) + { + return f16(static_cast(color >> 0) / static_cast(255)); + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_rgbx_cast(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_xrgb_cast(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_bgrx_cast(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_xbgr_cast(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_rgba_cast(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.w = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_argb_cast(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + result.w = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_bgra_cast(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + result.w = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_abgr_cast(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast((color >> 24) & 0xFF) / static_cast(255)); + result.y = f16(static_cast((color >> 16) & 0xFF) / static_cast(255)); + result.z = f16(static_cast((color >> 8) & 0xFF) / static_cast(255)); + result.w = f16(static_cast((color >> 0) & 0xFF) / static_cast(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER float f32_channel_cast(uint8 color) + { + return static_cast(color >> 0) / static_cast(255); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_rgbx_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_xrgb_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_bgrx_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_xbgr_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_rgba_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_argb_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_bgra_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_abgr_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER double f64_channel_cast(uint8 color) + { + return static_cast(color >> 0) / static_cast(255); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_rgbx_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_xrgb_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_bgrx_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_xbgr_cast(uint32 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_rgba_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_argb_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_bgra_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 0) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 24) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_abgr_cast(uint32 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 24) & 0xFF) / static_cast(255); + result.y = static_cast((color >> 16) & 0xFF) / static_cast(255); + result.z = static_cast((color >> 8) & 0xFF) / static_cast(255); + result.w = static_cast((color >> 0) & 0xFF) / static_cast(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::thalf f16_channel_cast(uint16 color) + { + return detail::thalf(static_cast(color >> 0) / static_cast(65535)); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f16_rgbx_cast(uint64 color) + { + detail::tvec3 result; + result.x = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f16_xrgb_cast(uint64 color) + { + detail::tvec3 result; + result.x = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f16_bgrx_cast(uint64 color) + { + detail::tvec3 result; + result.x = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f16_xbgr_cast(uint64 color) + { + detail::tvec3 result; + result.x = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f16_rgba_cast(uint64 color) + { + detail::tvec4 result; + result.x = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.w = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f16_argb_cast(uint64 color) + { + detail::tvec4 result; + result.x = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + result.w = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f16_bgra_cast(uint64 color) + { + detail::tvec4 result; + result.x = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + result.w = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f16_abgr_cast(uint64 color) + { + detail::tvec4 result; + result.x = detail::thalf(static_cast((color >> 48) & 0xFFFF) / static_cast(65535)); + result.y = detail::thalf(static_cast((color >> 32) & 0xFFFF) / static_cast(65535)); + result.z = detail::thalf(static_cast((color >> 16) & 0xFFFF) / static_cast(65535)); + result.w = detail::thalf(static_cast((color >> 0) & 0xFFFF) / static_cast(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER float f32_channel_cast(uint16 color) + { + return static_cast(color >> 0) / static_cast(65535); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_rgbx_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_xrgb_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_bgrx_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f32_xbgr_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_rgba_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_argb_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_bgra_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f32_abgr_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER double f64_channel_cast(uint16 color) + { + return static_cast(color >> 0) / static_cast(65535); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_rgbx_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_xrgb_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_bgrx_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3 f64_xbgr_cast(uint64 color) + { + detail::tvec3 result; + result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_rgba_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_argb_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_bgra_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4 f64_abgr_cast(uint64 color) + { + detail::tvec4 result; + result.x = static_cast((color >> 48) & 0xFFFF) / static_cast(65535); + result.y = static_cast((color >> 32) & 0xFFFF) / static_cast(65535); + result.z = static_cast((color >> 16) & 0xFFFF) / static_cast(65535); + result.w = static_cast((color >> 0) & 0xFFFF) / static_cast(65535); + return result; + } }//namespace glm diff --git a/glm/gtx/color_space.inl b/glm/gtx/color_space.inl index 4a270d8b..89f4e6dd 100644 --- a/glm/gtx/color_space.inl +++ b/glm/gtx/color_space.inl @@ -7,144 +7,143 @@ // File : glm/gtx/color_space.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec3 rgbColor(const detail::tvec3& hsvColor) +namespace glm { - detail::tvec3 hsv = hsvColor; - detail::tvec3 rgbColor; - - if(hsv.y == T(0)) - // achromatic (grey) - rgbColor = detail::tvec3(hsv.z); - else + template + GLM_FUNC_QUALIFIER detail::tvec3 rgbColor(const detail::tvec3& hsvColor) { - T sector = floor(hsv.x / T(60)); - T frac = (hsv.x / T(60)) - sector; - // factorial part of h - T o = hsv.z * (T(1) - hsv.y); - T p = hsv.z * (T(1) - hsv.y * frac); - T q = hsv.z * (T(1) - hsv.y * (T(1) - frac)); + detail::tvec3 hsv = hsvColor; + detail::tvec3 rgbColor; - switch(int(sector)) - { - default: - case 0: - rgbColor.r = hsv.z; - rgbColor.g = q; - rgbColor.b = o; - break; - case 1: - rgbColor.r = p; - rgbColor.g = hsv.z; - rgbColor.b = o; - break; - case 2: - rgbColor.r = o; - rgbColor.g = hsv.z; - rgbColor.b = q; - break; - case 3: - rgbColor.r = o; - rgbColor.g = p; - rgbColor.b = hsv.z; - break; - case 4: - rgbColor.r = q; - rgbColor.g = o; - rgbColor.b = hsv.z; - break; - case 5: - rgbColor.r = hsv.z; - rgbColor.g = o; - rgbColor.b = p; - break; - } + if(hsv.y == T(0)) + // achromatic (grey) + rgbColor = detail::tvec3(hsv.z); + else + { + T sector = floor(hsv.x / T(60)); + T frac = (hsv.x / T(60)) - sector; + // factorial part of h + T o = hsv.z * (T(1) - hsv.y); + T p = hsv.z * (T(1) - hsv.y * frac); + T q = hsv.z * (T(1) - hsv.y * (T(1) - frac)); + + switch(int(sector)) + { + default: + case 0: + rgbColor.r = hsv.z; + rgbColor.g = q; + rgbColor.b = o; + break; + case 1: + rgbColor.r = p; + rgbColor.g = hsv.z; + rgbColor.b = o; + break; + case 2: + rgbColor.r = o; + rgbColor.g = hsv.z; + rgbColor.b = q; + break; + case 3: + rgbColor.r = o; + rgbColor.g = p; + rgbColor.b = hsv.z; + break; + case 4: + rgbColor.r = q; + rgbColor.g = o; + rgbColor.b = hsv.z; + break; + case 5: + rgbColor.r = hsv.z; + rgbColor.g = o; + rgbColor.b = p; + break; + } + } + + return rgbColor; } - return rgbColor; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 hsvColor(const detail::tvec3& rgbColor) -{ - detail::tvec3 hsv = rgbColor; - float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); - float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); - float Delta = Max - Min; - - hsv.z = Max; - - if(Max != T(0)) + template + GLM_FUNC_QUALIFIER detail::tvec3 hsvColor(const detail::tvec3& rgbColor) { - hsv.y = Delta / hsv.z; - T h = T(0); + detail::tvec3 hsv = rgbColor; + float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); + float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); + float Delta = Max - Min; - if(rgbColor.r == Max) - // between yellow & magenta - h = T(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta; - else if(rgbColor.g == Max) - // between cyan & yellow - h = T(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta; - else - // between magenta & cyan - h = T(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; + hsv.z = Max; + + if(Max != T(0)) + { + hsv.y = Delta / hsv.z; + T h = T(0); + + if(rgbColor.r == Max) + // between yellow & magenta + h = T(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta; + else if(rgbColor.g == Max) + // between cyan & yellow + h = T(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta; + else + // between magenta & cyan + h = T(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; - if(h < T(0)) - hsv.x = h + T(360); + if(h < T(0)) + hsv.x = h + T(360); + else + hsv.x = h; + } else - hsv.x = h; + { + // If r = g = b = 0 then s = 0, h is undefined + hsv.y = T(0); + hsv.x = T(0); + } + + return hsv; } - else + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 saturation(const T s) { - // If r = g = b = 0 then s = 0, h is undefined - hsv.y = T(0); - hsv.x = T(0); + detail::tvec3 rgbw = detail::tvec3(T(0.2126), T(0.7152), T(0.0722)); + + T col0 = (T(1) - s) * rgbw.r; + T col1 = (T(1) - s) * rgbw.g; + T col2 = (T(1) - s) * rgbw.b; + + detail::tmat4x4 result(T(1)); + result[0][0] = col0 + s; + result[0][1] = col0; + result[0][2] = col0; + result[1][0] = col1; + result[1][1] = col1 + s; + result[1][2] = col1; + result[2][0] = col2; + result[2][1] = col2; + result[2][2] = col2 + s; + return result; } - return hsv; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 saturation(const T s) -{ - detail::tvec3 rgbw = detail::tvec3(T(0.2126), T(0.7152), T(0.0722)); - - T col0 = (T(1) - s) * rgbw.r; - T col1 = (T(1) - s) * rgbw.g; - T col2 = (T(1) - s) * rgbw.b; - - detail::tmat4x4 result(T(1)); - result[0][0] = col0 + s; - result[0][1] = col0; - result[0][2] = col0; - result[1][0] = col1; - result[1][1] = col1 + s; - result[1][2] = col1; - result[2][0] = col2; - result[2][1] = col2; - result[2][2] = col2 + s; - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 saturation(const T s, const detail::tvec3& color) -{ - return detail::tvec3(saturation(s) * detail::tvec4(color, T(0))); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 saturation(const T s, const detail::tvec4& color) -{ - return saturation(s) * color; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 saturation(const T s, const detail::tvec3& color) + { + return detail::tvec3(saturation(s) * detail::tvec4(color, T(0))); + } -template -GLM_FUNC_QUALIFIER T luminosity(const detail::tvec3& color) -{ - const detail::tvec3 tmp = detail::tvec3(0.33, 0.59, 0.11); - return dot(color, tmp); -} + template + GLM_FUNC_QUALIFIER detail::tvec4 saturation(const T s, const detail::tvec4& color) + { + return saturation(s) * color; + } + template + GLM_FUNC_QUALIFIER T luminosity(const detail::tvec3& color) + { + const detail::tvec3 tmp = detail::tvec3(0.33, 0.59, 0.11); + return dot(color, tmp); + } }//namespace glm diff --git a/glm/gtx/color_space_YCoCg.inl b/glm/gtx/color_space_YCoCg.inl index 5dc57fe5..23aa0e4b 100644 --- a/glm/gtx/color_space_YCoCg.inl +++ b/glm/gtx/color_space_YCoCg.inl @@ -7,59 +7,58 @@ // File : glm/gtx/color_space_YCoCg.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec3 rgb2YCoCg -( - detail::tvec3 const & rgbColor -) +namespace glm { - detail::tvec3 result; - result.x/*Y */ = rgbColor.r / valType(4) + rgbColor.g / valType(2) + rgbColor.b / valType(4); - result.y/*Co*/ = rgbColor.r / valType(2) + rgbColor.g * valType(0) - rgbColor.b / valType(2); - result.z/*Cg*/ = - rgbColor.r / valType(4) + rgbColor.g / valType(2) - rgbColor.b / valType(4); - return result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rgb2YCoCg + ( + detail::tvec3 const & rgbColor + ) + { + detail::tvec3 result; + result.x/*Y */ = rgbColor.r / valType(4) + rgbColor.g / valType(2) + rgbColor.b / valType(4); + result.y/*Co*/ = rgbColor.r / valType(2) + rgbColor.g * valType(0) - rgbColor.b / valType(2); + result.z/*Cg*/ = - rgbColor.r / valType(4) + rgbColor.g / valType(2) - rgbColor.b / valType(4); + return result; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 rgb2YCoCgR -( - detail::tvec3 const & rgbColor -) -{ - detail::tvec3 result; - result.x/*Y */ = rgbColor.g / valType(2) + (rgbColor.r + rgbColor.b) / valType(4); - result.y/*Co*/ = rgbColor.r - rgbColor.b; - result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / valType(2); - return result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rgb2YCoCgR + ( + detail::tvec3 const & rgbColor + ) + { + detail::tvec3 result; + result.x/*Y */ = rgbColor.g / valType(2) + (rgbColor.r + rgbColor.b) / valType(4); + result.y/*Co*/ = rgbColor.r - rgbColor.b; + result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / valType(2); + return result; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 YCoCg2rgb -( - detail::tvec3 const & YCoCgColor -) -{ - detail::tvec3 result; - result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; - result.g = YCoCgColor.x + YCoCgColor.z; - result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 YCoCgR2rgb -( - detail::tvec3 const & YCoCgRColor -) -{ - detail::tvec3 result; - valType tmp = YCoCgRColor.x - (YCoCgRColor.z / valType(2)); - result.g = YCoCgRColor.z + tmp; - result.b = tmp - (YCoCgRColor.y / valType(2)); - result.r = result.b + YCoCgRColor.y; - return result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 YCoCg2rgb + ( + detail::tvec3 const & YCoCgColor + ) + { + detail::tvec3 result; + result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; + result.g = YCoCgColor.x + YCoCgColor.z; + result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; + return result; + } + template + GLM_FUNC_QUALIFIER detail::tvec3 YCoCgR2rgb + ( + detail::tvec3 const & YCoCgRColor + ) + { + detail::tvec3 result; + valType tmp = YCoCgRColor.x - (YCoCgRColor.z / valType(2)); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y / valType(2)); + result.r = result.b + YCoCgRColor.y; + return result; + } }//namespace glm diff --git a/glm/gtx/compatibility.inl b/glm/gtx/compatibility.inl index 8a8549a1..d266f18d 100644 --- a/glm/gtx/compatibility.inl +++ b/glm/gtx/compatibility.inl @@ -7,131 +7,130 @@ // File : glm/gtx/compatibility.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -// isfinite -template -GLM_FUNC_QUALIFIER bool isfinite( - genType const & x) +namespace glm { -#if(GLM_COMPILER & GLM_COMPILER_VC) - return _finite(x); -#else//(GLM_COMPILER & GLM_COMPILER_GCC) - return std::isfinite(x) != 0; -#endif -} + // isfinite + template + GLM_FUNC_QUALIFIER bool isfinite( + genType const & x) + { + #if(GLM_COMPILER & GLM_COMPILER_VC) + return _finite(x); + #else//(GLM_COMPILER & GLM_COMPILER_GCC) + return std::isfinite(x) != 0; + #endif + } -template -GLM_FUNC_QUALIFIER detail::tvec2 isfinite( - detail::tvec2 const & x) -{ - return detail::tvec2( - isfinite(x.x), - isfinite(x.y)); -} + template + GLM_FUNC_QUALIFIER detail::tvec2 isfinite( + detail::tvec2 const & x) + { + return detail::tvec2( + isfinite(x.x), + isfinite(x.y)); + } -template -GLM_FUNC_QUALIFIER detail::tvec3 isfinite( - detail::tvec3 const & x) -{ - return detail::tvec3( - isfinite(x.x), - isfinite(x.y), - isfinite(x.z)); -} + template + GLM_FUNC_QUALIFIER detail::tvec3 isfinite( + detail::tvec3 const & x) + { + return detail::tvec3( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z)); + } -template -GLM_FUNC_QUALIFIER detail::tvec4 isfinite( - detail::tvec4 const & x) -{ - return detail::tvec4( - isfinite(x.x), - isfinite(x.y), - isfinite(x.z), - isfinite(x.w)); -} + template + GLM_FUNC_QUALIFIER detail::tvec4 isfinite( + detail::tvec4 const & x) + { + return detail::tvec4( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z), + isfinite(x.w)); + } -// isinf -template -GLM_FUNC_QUALIFIER bool isinf( - genType const & x) -{ -#if(GLM_COMPILER & GLM_COMPILER_VC) - return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; -#else - return std::isinf(x) != 0; -#endif -} + // isinf + template + GLM_FUNC_QUALIFIER bool isinf( + genType const & x) + { + #if(GLM_COMPILER & GLM_COMPILER_VC) + return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; + #else + return std::isinf(x) != 0; + #endif + } -template -GLM_FUNC_QUALIFIER detail::tvec2 isinf( - detail::tvec2 const & x) -{ - return detail::tvec2( - isinf(x.x), - isinf(x.y)); -} + template + GLM_FUNC_QUALIFIER detail::tvec2 isinf( + detail::tvec2 const & x) + { + return detail::tvec2( + isinf(x.x), + isinf(x.y)); + } -template -GLM_FUNC_QUALIFIER detail::tvec3 isinf( - detail::tvec3 const & x) -{ - return detail::tvec3( - isinf(x.x), - isinf(x.y), - isinf(x.z)); -} + template + GLM_FUNC_QUALIFIER detail::tvec3 isinf( + detail::tvec3 const & x) + { + return detail::tvec3( + isinf(x.x), + isinf(x.y), + isinf(x.z)); + } -template -GLM_FUNC_QUALIFIER detail::tvec4 isinf( - detail::tvec4 const & x) -{ - return detail::tvec4( - isinf(x.x), - isinf(x.y), - isinf(x.z), - isinf(x.w)); -} - -// isnan -template -GLM_FUNC_QUALIFIER bool isnan(genType const & x) -{ -#if(GLM_COMPILER & GLM_COMPILER_VC) - return _isnan(x); -#else - return std::isnan(x) != 0; -#endif -} + template + GLM_FUNC_QUALIFIER detail::tvec4 isinf( + detail::tvec4 const & x) + { + return detail::tvec4( + isinf(x.x), + isinf(x.y), + isinf(x.z), + isinf(x.w)); + } -template -GLM_FUNC_QUALIFIER detail::tvec2 isnan( - detail::tvec2 const & x) -{ - return detail::tvec2( - isnan(x.x), - isnan(x.y)); -} + // isnan + template + GLM_FUNC_QUALIFIER bool isnan(genType const & x) + { + #if(GLM_COMPILER & GLM_COMPILER_VC) + return _isnan(x); + #else + return std::isnan(x) != 0; + #endif + } -template -GLM_FUNC_QUALIFIER detail::tvec3 isnan( - detail::tvec3 const & x) -{ - return detail::tvec3( - isnan(x.x), - isnan(x.y), - isnan(x.z)); -} + template + GLM_FUNC_QUALIFIER detail::tvec2 isnan( + detail::tvec2 const & x) + { + return detail::tvec2( + isnan(x.x), + isnan(x.y)); + } -template -GLM_FUNC_QUALIFIER detail::tvec4 isnan( - detail::tvec4 const & x) -{ - return detail::tvec4( - isnan(x.x), - isnan(x.y), - isnan(x.z), - isnan(x.w)); -} + template + GLM_FUNC_QUALIFIER detail::tvec3 isnan( + detail::tvec3 const & x) + { + return detail::tvec3( + isnan(x.x), + isnan(x.y), + isnan(x.z)); + } + template + GLM_FUNC_QUALIFIER detail::tvec4 isnan( + detail::tvec4 const & x) + { + return detail::tvec4( + isnan(x.x), + isnan(x.y), + isnan(x.z), + isnan(x.w)); + } }//namespace glm diff --git a/glm/gtx/component_wise.inl b/glm/gtx/component_wise.inl index 43ffe18b..9e484f92 100644 --- a/glm/gtx/component_wise.inl +++ b/glm/gtx/component_wise.inl @@ -7,42 +7,41 @@ // File : gtx_component_wise.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER typename genType::value_type compAdd(genType const & v) +namespace glm { - typename genType::size_type result = typename genType::value_type(0); - for(typename genType::size_type i = 0; i < genType::value_size(); ++i) - result += v[i]; - return result; -} + template + GLM_FUNC_QUALIFIER typename genType::value_type compAdd(genType const & v) + { + typename genType::size_type result = typename genType::value_type(0); + for(typename genType::size_type i = 0; i < genType::value_size(); ++i) + result += v[i]; + return result; + } -template -GLM_FUNC_QUALIFIER typename genType::value_type compMul(genType const & v) -{ - typename genType::value_type result = typename genType::value_type(1); - for(typename genType::size_type i = 0; i < genType::value_size(); ++i) - result *= v[i]; - return result; -} + template + GLM_FUNC_QUALIFIER typename genType::value_type compMul(genType const & v) + { + typename genType::value_type result = typename genType::value_type(1); + for(typename genType::size_type i = 0; i < genType::value_size(); ++i) + result *= v[i]; + return result; + } -template -GLM_FUNC_QUALIFIER typename genType::value_type compMin(genType const & v) -{ - typename genType::value_type result = typename genType::value_type(v[0]); - for(typename genType::size_type i = 1; i < genType::value_size(); ++i) - result = min(result, v[i]); - return result; -} - -template -GLM_FUNC_QUALIFIER typename genType::value_type compMax(genType const & v) -{ - typename genType::value_type result = typename genType::value_type(v[0]); - for(typename genType::size_type i = 1; i < genType::value_size(); ++i) - result = max(result, v[i]); - return result; -} + template + GLM_FUNC_QUALIFIER typename genType::value_type compMin(genType const & v) + { + typename genType::value_type result = typename genType::value_type(v[0]); + for(typename genType::size_type i = 1; i < genType::value_size(); ++i) + result = min(result, v[i]); + return result; + } + template + GLM_FUNC_QUALIFIER typename genType::value_type compMax(genType const & v) + { + typename genType::value_type result = typename genType::value_type(v[0]); + for(typename genType::size_type i = 1; i < genType::value_size(); ++i) + result = max(result, v[i]); + return result; + } }//namespace glm diff --git a/glm/gtx/constants.inl b/glm/gtx/constants.inl index 885c66af..7a556919 100644 --- a/glm/gtx/constants.inl +++ b/glm/gtx/constants.inl @@ -20,773 +20,8 @@ /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN /// THE SOFTWARE. /// -/// @ref gtc_half_float -/// @file glm/gtc/half_float.inl -/// @date 2009-04-29 / 2011-06-05 +/// @ref gtx_constants +/// @file glm/gtx/constants.inl +/// @date 2011-10-14 / 2011-10-14 /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// - -#include "../core/_detail.hpp" - -namespace glm{ - -template -GLM_FUNC_QUALIFIER genIType mask -( - genIType const & count -) -{ - return ((genIType(1) << (count)) - genIType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 mask -( - detail::tvec2 const & count -) -{ - return detail::tvec2( - mask(count[0]), - mask(count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 mask -( - detail::tvec3 const & count -) -{ - return detail::tvec3( - mask(count[0]), - mask(count[1]), - mask(count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 mask -( - detail::tvec4 const & count -) -{ - return detail::tvec4( - mask(count[0]), - mask(count[1]), - mask(count[2]), - mask(count[3])); -} - -// extractField -template -GLM_FUNC_QUALIFIER genIType extractField -( - half const & value, - genIType const & first, - genIType const & count -) -{ - assert(first + count < sizeof(half)); - return (value._data() << first) >> ((sizeof(half) << 3) - count); -} - -template -GLM_FUNC_QUALIFIER genIType extractField -( - float const & value, - genIType const & first, - genIType const & count -) -{ - assert(first + count < sizeof(float)); - return (detail::uif32(value).i << first) >> ((sizeof(float) << 3) - count); -} - -template -GLM_FUNC_QUALIFIER genIType extractField -( - double const & value, - genIType const & first, - genIType const & count -) -{ - assert(first + count < sizeof(double)); - return (detail::uif64(value).i << first) >> ((sizeof(double) << genIType(3)) - count); -} - -template -GLM_FUNC_QUALIFIER genIUType extractField -( - genIUType const & Value, - sizeType const & First, - sizeType const & Count -) -{ - sizeType GenSize = sizeof(genIUType) << 3; - - assert(First + Count <= GenSize); - - genIUType ShiftLeft = Count ? Value << (GenSize - (Count + First)) : 0; - genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Count); - - return ShiftBack; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - detail::tvec2 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec2( - extractField(value[0], first, count), - extractField(value[1], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - detail::tvec3 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec3( - extractField(value[0], first, count), - extractField(value[1], first, count), - extractField(value[2], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - detail::tvec4 const & value, - sizeType const & first, - sizeType const & count -) -{ - return detail::tvec4( - extractField(value[0], first, count), - extractField(value[1], first, count), - extractField(value[2], first, count), - extractField(value[3], first, count)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - detail::tvec2 const & value, - detail::tvec2 const & first, - detail::tvec2 const & count -) -{ - return detail::tvec2( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - detail::tvec3 const & value, - detail::tvec3 const & first, - detail::tvec3 const & count -) -{ - return detail::tvec3( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1]), - extractField(value[2], first[2], count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - detail::tvec4 const & value, - detail::tvec4 const & first, - detail::tvec4 const & count -) -{ - return detail::tvec4( - extractField(value[0], first[0], count[0]), - extractField(value[1], first[1], count[1]), - extractField(value[2], first[2], count[2]), - extractField(value[3], first[3], count[3])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 extractField -( - genIUType const & value, - detail::tvec2 const & first, - detail::tvec2 const & count -) -{ - return detail::tvec2( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 extractField -( - genIUType const & value, - detail::tvec3 const & first, - detail::tvec3 const & count -) -{ - return detail::tvec3( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1]), - extractField(value, first[2], count[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 extractField -( - genIUType const & value, - detail::tvec4 const & first, - detail::tvec4 const & count -) -{ - return detail::tvec4( - extractField(value, first[0], count[0]), - extractField(value, first[1], count[1]), - extractField(value, first[2], count[2]), - extractField(value, first[3], count[3])); -} - -// lowestBit -template -GLM_FUNC_QUALIFIER int lowestBit -( - genType const & Value -) -{ - assert(Value != genType(0)); // not valid call - - genType Bit; - for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){} - return Bit; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 lowestBit -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - lowestBit(value[0]), - lowestBit(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 lowestBit -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - lowestBit(value[0]), - lowestBit(value[1]), - lowestBit(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 lowestBit -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - lowestBit(value[0]), - lowestBit(value[1]), - lowestBit(value[2]), - lowestBit(value[3])); -} - -// highestBit -template -GLM_FUNC_QUALIFIER int highestBit -( - genType const & value -) -{ - assert(value != genType(0)); // not valid call - - genType bit = genType(-1); - for(genType tmp = value; tmp; tmp >>= 1, ++bit){} - return bit; -} - -//template <> -//GLM_FUNC_QUALIFIER int highestBit -//( -// int value -//) -//{ -// int bit = -1; -// for(int tmp = value; tmp; tmp >>= 1, ++bit); -// return bit; -//} - -template -GLM_FUNC_QUALIFIER detail::tvec2 highestBit -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - highestBit(value[0]), - highestBit(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 highestBit -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - highestBit(value[0]), - highestBit(value[1]), - highestBit(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 highestBit -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - highestBit(value[0]), - highestBit(value[1]), - highestBit(value[2]), - highestBit(value[3])); -} - -// highestBitValue -template -GLM_FUNC_QUALIFIER genType highestBitValue -( - genType const & value -) -{ - genType tmp = value; - genType result = genType(0); - while(tmp) - { - result = (tmp & (~tmp + 1)); // grab lowest bit - tmp &= ~result; // clear lowest bit - } - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 highestBitValue -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - highestBitValue(value[0]), - highestBitValue(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 highestBitValue -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - highestBitValue(value[0]), - highestBitValue(value[1]), - highestBitValue(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 highestBitValue -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - highestBitValue(value[0]), - highestBitValue(value[1]), - highestBitValue(value[2]), - highestBitValue(value[3])); -} - -// isPowerOfTwo -template -GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const & Value) -{ - //detail::If::is_signed>::apply(abs, Value); - //return !(Value & (Value - 1)); - - // For old complier? - genType Result = Value; - if(std::numeric_limits::is_signed) - Result = abs(Result); - return !(Result & (Result - 1)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 isPowerOfTwo -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 isPowerOfTwo -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1]), - isPowerOfTwo(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 isPowerOfTwo -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - isPowerOfTwo(value[0]), - isPowerOfTwo(value[1]), - isPowerOfTwo(value[2]), - isPowerOfTwo(value[3])); -} - -// powerOfTwoAbove -template -GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const & value) -{ - return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoAbove -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoAbove -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1]), - powerOfTwoAbove(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoAbove -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoAbove(value[0]), - powerOfTwoAbove(value[1]), - powerOfTwoAbove(value[2]), - powerOfTwoAbove(value[3])); -} - -// powerOfTwoBelow -template -GLM_FUNC_QUALIFIER genType powerOfTwoBelow -( - genType const & value -) -{ - return isPowerOfTwo(value) ? value : highestBitValue(value); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoBelow -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoBelow -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1]), - powerOfTwoBelow(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoBelow -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoBelow(value[0]), - powerOfTwoBelow(value[1]), - powerOfTwoBelow(value[2]), - powerOfTwoBelow(value[3])); -} - -// powerOfTwoNearest -template -GLM_FUNC_QUALIFIER genType powerOfTwoNearest -( - genType const & value -) -{ - if(isPowerOfTwo(value)) - return value; - - genType prev = highestBitValue(value); - genType next = prev << 1; - return (next - value) < (value - prev) ? next : prev; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 powerOfTwoNearest -( - detail::tvec2 const & value -) -{ - return detail::tvec2( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 powerOfTwoNearest -( - detail::tvec3 const & value -) -{ - return detail::tvec3( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1]), - powerOfTwoNearest(value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 powerOfTwoNearest -( - detail::tvec4 const & value -) -{ - return detail::tvec4( - powerOfTwoNearest(value[0]), - powerOfTwoNearest(value[1]), - powerOfTwoNearest(value[2]), - powerOfTwoNearest(value[3])); -} - -template -GLM_FUNC_QUALIFIER genType bitRevert(genType const & In) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRevert' only accept integer values"); - - genType Out = 0; - std::size_t BitSize = sizeof(genType) * 8; - for(std::size_t i = 0; i < BitSize; ++i) - if(In & (genType(1) << i)) - Out |= genType(1) << (BitSize - 1 - i); - return Out; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRevert -( - detail::tvec2 const & Value -) -{ - return detail::tvec2( - bitRevert(Value[0]), - bitRevert(Value[1])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRevert -( - detail::tvec3 const & Value -) -{ - return detail::tvec3( - bitRevert(Value[0]), - bitRevert(Value[1]), - bitRevert(Value[2])); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRevert -( - detail::tvec4 const & Value -) -{ - return detail::tvec4( - bitRevert(Value[0]), - bitRevert(Value[1]), - bitRevert(Value[2]), - bitRevert(Value[3])); -} - -template -GLM_FUNC_QUALIFIER genType bitRotateRight(genType const & In, std::size_t Shift) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateRight' only accept integer values"); - - std::size_t BitSize = sizeof(genType) * 8; - return (In << Shift) | (In >> (BitSize - Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRotateRight -( - detail::tvec2 const & Value, - std::size_t Shift -) -{ - return detail::tvec2( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRotateRight -( - detail::tvec3 const & Value, - std::size_t Shift -) -{ - return detail::tvec3( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift), - bitRotateRight(Value[2], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRotateRight -( - detail::tvec4 const & Value, - std::size_t Shift -) -{ - return detail::tvec4( - bitRotateRight(Value[0], Shift), - bitRotateRight(Value[1], Shift), - bitRotateRight(Value[2], Shift), - bitRotateRight(Value[3], Shift)); -} - -template -GLM_FUNC_QUALIFIER genType bitRotateLeft(genType const & In, std::size_t Shift) -{ - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitRotateLeft' only accept integer values"); - - std::size_t BitSize = sizeof(genType) * 8; - return (In >> Shift) | (In << (BitSize - Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 bitRotateLeft -( - detail::tvec2 const & Value, - std::size_t Shift -) -{ - return detail::tvec2( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 bitRotateLeft -( - detail::tvec3 const & Value, - std::size_t Shift -) -{ - return detail::tvec3( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift), - bitRotateLeft(Value[2], Shift)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 bitRotateLeft -( - detail::tvec4 const & Value, - std::size_t Shift -) -{ - return detail::tvec4( - bitRotateLeft(Value[0], Shift), - bitRotateLeft(Value[1], Shift), - bitRotateLeft(Value[2], Shift), - bitRotateLeft(Value[3], Shift)); -} - -template -GLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne -( - genIUType const & Value, - int const & FromBit, - int const & ToBit -) -{ - assert(FromBit <= ToBit); - assert(ToBit <= sizeof(genIUType) * std::size_t(8)); - - genIUType Result = Value; - for(std::size_t i = 0; i <= ToBit; ++i) - Result |= (1 << i); - return Result; -} - -template -GLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero -( - genIUType const & Value, - int const & FromBit, - int const & ToBit -) -{ - assert(FromBit <= ToBit); - assert(ToBit <= sizeof(genIUType) * std::size_t(8)); - - genIUType Result = Value; - for(std::size_t i = 0; i <= ToBit; ++i) - Result &= ~(1 << i); - return Result; -} - -}//namespace glm diff --git a/glm/gtx/epsilon.inl b/glm/gtx/epsilon.inl index bfb2d3b1..7ebc69ae 100644 --- a/glm/gtx/epsilon.inl +++ b/glm/gtx/epsilon.inl @@ -7,224 +7,223 @@ // File : glm/gtx/epsilon.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER bool equalEpsilon -( - genType const & x, - genType const & y, - genType const & epsilon -) -{ - return abs(x - y) < epsilon; -} - -template -GLM_FUNC_QUALIFIER bool notEqualEpsilon -( - genType const & x, - genType const & y, - genType const & epsilon -) -{ - return abs(x - y) >= epsilon; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 equalEpsilon -( - detail::tvec2 const & x, - detail::tvec2 const & y, - valType const & epsilon) -{ - return detail::tvec2( - abs(x.x - y.x) < epsilon, - abs(x.y - y.y) < epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 equalEpsilon -( - detail::tvec3 const & x, - detail::tvec3 const & y, - valType const & epsilon) -{ - return detail::tvec3( - abs(x.x - y.x) < epsilon, - abs(x.y - y.y) < epsilon, - abs(x.z - y.z) < epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon -( - detail::tvec4 const & x, - detail::tvec4 const & y, - valType const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) < epsilon, - abs(x.y - y.y) < epsilon, - abs(x.z - y.z) < epsilon, - abs(x.w - y.w) < epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 notEqualEpsilon -( - detail::tvec2 const & x, - detail::tvec2 const & y, - valType const & epsilon -) -{ - return detail::tvec2( - abs(x.x - y.x) >= epsilon, - abs(x.y - y.y) >= epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 notEqualEpsilon -( - detail::tvec3 const & x, - detail::tvec3 const & y, - valType const & epsilon -) -{ - return detail::tvec3( - abs(x.x - y.x) >= epsilon, - abs(x.y - y.y) >= epsilon, - abs(x.z - y.z) >= epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon -( - detail::tvec4 const & x, - detail::tvec4 const & y, - valType const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) >= epsilon, - abs(x.y - y.y) >= epsilon, - abs(x.z - y.z) >= epsilon, - abs(x.w - y.w) >= epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 equalEpsilon -( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 const & epsilon -) -{ - return detail::tvec2( - abs(x.x - y.x) < epsilon.x, - abs(x.y - y.y) < epsilon.y); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 equalEpsilon -( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 const & epsilon -) -{ - return detail::tvec3( - abs(x.x - y.x) < epsilon.x, - abs(x.y - y.y) < epsilon.y, - abs(x.z - y.z) < epsilon.z); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon -( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) < epsilon.x, - abs(x.y - y.y) < epsilon.y, - abs(x.z - y.z) < epsilon.z, - abs(x.w - y.w) < epsilon.w); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon -( - detail::tquat const & x, - detail::tquat const & y, - detail::tquat const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) < epsilon.x, - abs(x.y - y.y) < epsilon.y, - abs(x.z - y.z) < epsilon.z, - abs(x.w - y.w) < epsilon.w); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 notEqualEpsilon -( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 const & epsilon -) -{ - return detail::tvec2( - abs(x.x - y.x) >= epsilon.x, - abs(x.y - y.y) >= epsilon.y); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 notEqualEpsilon -( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 const & epsilon -) -{ - return detail::tvec3( - abs(x.x - y.x) >= epsilon.x, - abs(x.y - y.y) >= epsilon.y, - abs(x.z - y.z) >= epsilon.z); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon -( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) >= epsilon.x, - abs(x.y - y.y) >= epsilon.y, - abs(x.z - y.z) >= epsilon.z, - abs(x.w - y.w) >= epsilon.w); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon -( - detail::tquat const & x, - detail::tquat const & y, - detail::tquat const & epsilon -) -{ - return detail::tvec4( - abs(x.x - y.x) >= epsilon.x, - abs(x.y - y.y) >= epsilon.y, - abs(x.z - y.z) >= epsilon.z, - abs(x.w - y.w) >= epsilon.w); -} - +namespace glm +{ + template + GLM_FUNC_QUALIFIER bool equalEpsilon + ( + genType const & x, + genType const & y, + genType const & epsilon + ) + { + return abs(x - y) < epsilon; + } + + template + GLM_FUNC_QUALIFIER bool notEqualEpsilon + ( + genType const & x, + genType const & y, + genType const & epsilon + ) + { + return abs(x - y) >= epsilon; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 equalEpsilon + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + valType const & epsilon) + { + return detail::tvec2( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 equalEpsilon + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + valType const & epsilon) + { + return detail::tvec3( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon, + abs(x.z - y.z) < epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + valType const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon, + abs(x.z - y.z) < epsilon, + abs(x.w - y.w) < epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 notEqualEpsilon + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + valType const & epsilon + ) + { + return detail::tvec2( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 notEqualEpsilon + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + valType const & epsilon + ) + { + return detail::tvec3( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon, + abs(x.z - y.z) >= epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + valType const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon, + abs(x.z - y.z) >= epsilon, + abs(x.w - y.w) >= epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 equalEpsilon + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 const & epsilon + ) + { + return detail::tvec2( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 equalEpsilon + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 const & epsilon + ) + { + return detail::tvec3( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z, + abs(x.w - y.w) < epsilon.w); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon + ( + detail::tquat const & x, + detail::tquat const & y, + detail::tquat const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z, + abs(x.w - y.w) < epsilon.w); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 notEqualEpsilon + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 const & epsilon + ) + { + return detail::tvec2( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 notEqualEpsilon + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 const & epsilon + ) + { + return detail::tvec3( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z, + abs(x.w - y.w) >= epsilon.w); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon + ( + detail::tquat const & x, + detail::tquat const & y, + detail::tquat const & epsilon + ) + { + return detail::tvec4( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z, + abs(x.w - y.w) >= epsilon.w); + } }//namespace glm diff --git a/glm/gtx/euler_angles.inl b/glm/gtx/euler_angles.inl index 22d70052..3322e410 100644 --- a/glm/gtx/euler_angles.inl +++ b/glm/gtx/euler_angles.inl @@ -7,239 +7,238 @@ // File : glm/gtx/euler_angles.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleX -( - valType const & angleX -) +namespace glm { - valType cosX = glm::cos(angleX); - valType sinX = glm::sin(angleX); + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleX + ( + valType const & angleX + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); - return detail::tmat4x4( - valType(1), valType(0), valType(0), valType(0), - valType(0), cosX, sinX, valType(0), - valType(0),-sinX, cosX, valType(0), - valType(0), valType(0), valType(0), valType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleY -( - valType const & angleY -) -{ - valType cosY = glm::cos(angleY); - valType sinY = glm::sin(angleY); - - return detail::tmat4x4( - cosY, valType(0), sinY, valType(0), - valType(0), valType(1), valType(0), valType(0), - -sinY, valType(0), cosY, valType(0), - valType(0), valType(0), valType(0), valType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleZ -( - valType const & angleZ -) -{ - valType cosZ = glm::cos(angleZ); - valType sinZ = glm::sin(angleZ); - - return detail::tmat4x4( - cosZ, sinZ, valType(0), valType(0), - -sinZ, cosZ, valType(0), valType(0), - valType(0), valType(0), valType(1), valType(0), - valType(0), valType(0), valType(0), valType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleXY -( - valType const & angleX, - valType const & angleY -) -{ - valType cosX = glm::cos(angleX); - valType sinX = glm::sin(angleX); - valType cosY = glm::cos(angleY); - valType sinY = glm::sin(angleY); - - return detail::tmat4x4( - cosY, -sinX * sinY, cosX * sinY, valType(0), - valType(0), cosX, sinX, valType(0), - -sinY , -sinX * cosY, cosX * cosY, valType(0), - valType(0), valType(0), valType(0), valType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleYX -( - valType const & angleY, - valType const & angleX -) -{ - valType cosX = glm::cos(angleX); - valType sinX = glm::sin(angleX); - valType cosY = glm::cos(angleY); - valType sinY = glm::sin(angleY); - - return detail::tmat4x4( - cosY, valType(0), sinY, valType(0), - -sinX * sinY, cosX, sinX * cosY, valType(0), - -cosX * sinY, -sinX, cosX * cosY, valType(0), - valType(0), valType(0), valType(0), valType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleXZ -( - valType const & angleX, - valType const & angleZ -) -{ - return eulerAngleX(angleX) * eulerAngleZ(angleZ); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleZX -( - valType const & angleZ, - valType const & angleX -) -{ - return eulerAngleZ(angleZ) * eulerAngleX(angleX); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleYXZ -( - valType const & yaw, - valType const & pitch, - valType const & roll -) -{ - valType tmp_ch = glm::cos(yaw); - valType tmp_sh = glm::sin(yaw); - valType tmp_cp = glm::cos(pitch); - valType tmp_sp = glm::sin(pitch); - valType tmp_cb = glm::cos(roll); - valType tmp_sb = glm::sin(roll); - - detail::tmat4x4 Result; - Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; - Result[0][1] = tmp_sb * tmp_cp; - Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; - Result[0][3] = valType(0); - Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; - Result[1][1] = tmp_cb * tmp_cp; - Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; - Result[1][3] = valType(0); - Result[2][0] = tmp_sh * tmp_cp; - Result[2][1] = -tmp_sp; - Result[2][2] = tmp_ch * tmp_cp; - Result[2][3] = valType(0); - Result[3][0] = valType(0); - Result[3][1] = valType(0); - Result[3][2] = valType(0); - Result[3][3] = valType(1); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 yawPitchRoll -( - valType const & yaw, - valType const & pitch, - valType const & roll -) -{ - valType tmp_ch = glm::cos(yaw); - valType tmp_sh = glm::sin(yaw); - valType tmp_cp = glm::cos(pitch); - valType tmp_sp = glm::sin(pitch); - valType tmp_cb = glm::cos(roll); - valType tmp_sb = glm::sin(roll); - - detail::tmat4x4 Result; - Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; - Result[0][1] = tmp_sb * tmp_cp; - Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; - Result[0][3] = valType(0); - Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; - Result[1][1] = tmp_cb * tmp_cp; - Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; - Result[1][3] = valType(0); - Result[2][0] = tmp_sh * tmp_cp; - Result[2][1] = -tmp_sp; - Result[2][2] = tmp_ch * tmp_cp; - Result[2][3] = valType(0); - Result[3][0] = valType(0); - Result[3][1] = valType(0); - Result[3][2] = valType(0); - Result[3][3] = valType(1); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat2x2 orientate2 -( - valType const & angle -) -{ - valType c = glm::cos(angle); - valType s = glm::sin(angle); - - detail::tmat2x2 Result; - Result[0][0] = c; - Result[0][1] = s; - Result[1][0] = -s; - Result[1][1] = c; - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 orientate3 -( - valType const & angle -) -{ - valType c = glm::cos(angle); - valType s = glm::sin(angle); - - detail::tmat3x3 Result; - Result[0][0] = c; - Result[0][1] = s; - Result[0][2] = 0.0f; - Result[1][0] = -s; - Result[1][1] = c; - Result[1][2] = 0.0f; - Result[2][0] = 0.0f; - Result[2][1] = 0.0f; - Result[2][2] = 1.0f; - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 orientate3 -( - detail::tvec3 const & angles -) -{ - return detail::tmat3x3(yawPitchRoll(angles.x, angles.y, angles.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 orientate4 -( - detail::tvec3 const & angles -) -{ - return yawPitchRoll(angles.z, angles.x, angles.y); -} - + return detail::tmat4x4( + valType(1), valType(0), valType(0), valType(0), + valType(0), cosX, sinX, valType(0), + valType(0),-sinX, cosX, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleY + ( + valType const & angleY + ) + { + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4( + cosY, valType(0), sinY, valType(0), + valType(0), valType(1), valType(0), valType(0), + -sinY, valType(0), cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleZ + ( + valType const & angleZ + ) + { + valType cosZ = glm::cos(angleZ); + valType sinZ = glm::sin(angleZ); + + return detail::tmat4x4( + cosZ, sinZ, valType(0), valType(0), + -sinZ, cosZ, valType(0), valType(0), + valType(0), valType(0), valType(1), valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleXY + ( + valType const & angleX, + valType const & angleY + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4( + cosY, -sinX * sinY, cosX * sinY, valType(0), + valType(0), cosX, sinX, valType(0), + -sinY , -sinX * cosY, cosX * cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleYX + ( + valType const & angleY, + valType const & angleX + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4( + cosY, valType(0), sinY, valType(0), + -sinX * sinY, cosX, sinX * cosY, valType(0), + -cosX * sinY, -sinX, cosX * cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleXZ + ( + valType const & angleX, + valType const & angleZ + ) + { + return eulerAngleX(angleX) * eulerAngleZ(angleZ); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleZX + ( + valType const & angleZ, + valType const & angleX + ) + { + return eulerAngleZ(angleZ) * eulerAngleX(angleX); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 eulerAngleYXZ + ( + valType const & yaw, + valType const & pitch, + valType const & roll + ) + { + valType tmp_ch = glm::cos(yaw); + valType tmp_sh = glm::sin(yaw); + valType tmp_cp = glm::cos(pitch); + valType tmp_sp = glm::sin(pitch); + valType tmp_cb = glm::cos(roll); + valType tmp_sb = glm::sin(roll); + + detail::tmat4x4 Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = valType(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = valType(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = valType(0); + Result[3][0] = valType(0); + Result[3][1] = valType(0); + Result[3][2] = valType(0); + Result[3][3] = valType(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 yawPitchRoll + ( + valType const & yaw, + valType const & pitch, + valType const & roll + ) + { + valType tmp_ch = glm::cos(yaw); + valType tmp_sh = glm::sin(yaw); + valType tmp_cp = glm::cos(pitch); + valType tmp_sp = glm::sin(pitch); + valType tmp_cb = glm::cos(roll); + valType tmp_sb = glm::sin(roll); + + detail::tmat4x4 Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = valType(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = valType(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = valType(0); + Result[3][0] = valType(0); + Result[3][1] = valType(0); + Result[3][2] = valType(0); + Result[3][3] = valType(1); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x2 orientate2 + ( + valType const & angle + ) + { + valType c = glm::cos(angle); + valType s = glm::sin(angle); + + detail::tmat2x2 Result; + Result[0][0] = c; + Result[0][1] = s; + Result[1][0] = -s; + Result[1][1] = c; + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 orientate3 + ( + valType const & angle + ) + { + valType c = glm::cos(angle); + valType s = glm::sin(angle); + + detail::tmat3x3 Result; + Result[0][0] = c; + Result[0][1] = s; + Result[0][2] = 0.0f; + Result[1][0] = -s; + Result[1][1] = c; + Result[1][2] = 0.0f; + Result[2][0] = 0.0f; + Result[2][1] = 0.0f; + Result[2][2] = 1.0f; + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 orientate3 + ( + detail::tvec3 const & angles + ) + { + return detail::tmat3x3(yawPitchRoll(angles.x, angles.y, angles.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 orientate4 + ( + detail::tvec3 const & angles + ) + { + return yawPitchRoll(angles.z, angles.x, angles.y); + } }//namespace glm diff --git a/glm/gtx/extend.inl b/glm/gtx/extend.inl index 0e094fb2..97f1c0c0 100644 --- a/glm/gtx/extend.inl +++ b/glm/gtx/extend.inl @@ -7,50 +7,49 @@ // File : glm/gtx/extend.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -genType extend -( - genType const & Origin, - genType const & Source, - genType const & Distance -) +namespace glm { - return Origin + (Source - Origin) * Distance; -} + template + genType extend + ( + genType const & Origin, + genType const & Source, + genType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } -template -detail::tvec2 extend -( - detail::tvec2 const & Origin, - detail::tvec2 const & Source, - valType const & Distance -) -{ - return Origin + (Source - Origin) * Distance; -} + template + detail::tvec2 extend + ( + detail::tvec2 const & Origin, + detail::tvec2 const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } -template -detail::tvec3 extend -( - detail::tvec3 const & Origin, - detail::tvec3 const & Source, - valType const & Distance -) -{ - return Origin + (Source - Origin) * Distance; -} - -template -detail::tvec4 extend -( - detail::tvec4 const & Origin, - detail::tvec4 const & Source, - valType const & Distance -) -{ - return Origin + (Source - Origin) * Distance; -} + template + detail::tvec3 extend + ( + detail::tvec3 const & Origin, + detail::tvec3 const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + template + detail::tvec4 extend + ( + detail::tvec4 const & Origin, + detail::tvec4 const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } }//namespace glm diff --git a/glm/gtx/fast_exponential.hpp b/glm/gtx/fast_exponential.hpp index 993ef48f..83cda03a 100644 --- a/glm/gtx/fast_exponential.hpp +++ b/glm/gtx/fast_exponential.hpp @@ -54,17 +54,17 @@ namespace glm //! Faster than the common pow function but less accurate. //! From GLM_GTX_fast_exponential extension. - template - valType fastPow( - valType const & x, - valType const & y); + template + genType fastPow( + genType const & x, + genType const & y); //! Faster than the common pow function but less accurate. //! From GLM_GTX_fast_exponential extension. - template - T fastPow( - const T& x, - const U& y); + template + genType fastPow( + genTypeT const & x, + genTypeU const & y); //! Faster than the common exp function but less accurate. //! From GLM_GTX_fast_exponential extension. diff --git a/glm/gtx/fast_exponential.inl b/glm/gtx/fast_exponential.inl index 37d6cd5f..519d3974 100644 --- a/glm/gtx/fast_exponential.inl +++ b/glm/gtx/fast_exponential.inl @@ -7,284 +7,144 @@ // File : glm/gtx/fast_exponential.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -// fastPow: -template -GLM_FUNC_QUALIFIER T fastPow(const T x, const T y) -{ - return exp(y * log(x)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastPow( - const detail::tvec2& x, - const detail::tvec2& y) -{ - return detail::tvec2( - fastPow(x.x, y.x), - fastPow(x.y, y.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastPow( - const detail::tvec3& x, - const detail::tvec3& y) -{ - return detail::tvec3( - fastPow(x.x, y.x), - fastPow(x.y, y.y), - fastPow(x.z, y.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastPow( - const detail::tvec4& x, - const detail::tvec4& y) -{ - return detail::tvec4( - fastPow(x.x, y.x), - fastPow(x.y, y.y), - fastPow(x.z, y.z), - fastPow(x.w, y.w)); -} - -template -GLM_FUNC_QUALIFIER T fastPow(const T x, int y) -{ - T f = T(1); - for(int i = 0; i < y; ++i) - f *= x; - return f; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastPow( - const detail::tvec2& x, - const detail::tvec2& y) -{ - return detail::tvec2( - fastPow(x.x, y.x), - fastPow(x.y, y.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastPow( - const detail::tvec3& x, - const detail::tvec3& y) -{ - return detail::tvec3( - fastPow(x.x, y.x), - fastPow(x.y, y.y), - fastPow(x.z, y.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastPow( - const detail::tvec4& x, - const detail::tvec4& y) -{ - return detail::tvec4( - fastPow(x.x, y.x), - fastPow(x.y, y.y), - fastPow(x.z, y.z), - fastPow(x.w, y.w)); -} - -// fastExp -// Note: This function provides accurate results only for value between -1 and 1, else avoid it. -template -GLM_FUNC_QUALIFIER T fastExp(const T x) -{ - // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. - // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); - T x2 = x * x; - T x3 = x2 * x; - T x4 = x3 * x; - T x5 = x4 * x; - return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333)); -} -/* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance -GLM_FUNC_QUALIFIER float fastExp(float x) -{ - const float e = 2.718281828f; - const float IntegerPart = floor(x); - const float FloatPart = x - IntegerPart; - float z = 1.f; - - for(int i = 0; i < int(IntegerPart); ++i) - z *= e; - - const float x2 = FloatPart * FloatPart; - const float x3 = x2 * FloatPart; - const float x4 = x3 * FloatPart; - const float x5 = x4 * FloatPart; - return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)); -} - -// Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers -GLM_FUNC_QUALIFIER float fastExp(float x) -{ - // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. - // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); - float x2 = x * x; - float x3 = x2 * x; - float x4 = x3 * x; - float x5 = x4 * x; - float x6 = x5 * x; - float x7 = x6 * x; - float x8 = x7 * x; - return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);; -} -*/ -template -GLM_FUNC_QUALIFIER detail::tvec2 fastExp( - const detail::tvec2& x) -{ - return detail::tvec2( - fastExp(x.x), - fastExp(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastExp( - const detail::tvec3& x) -{ - return detail::tvec3( - fastExp(x.x), - fastExp(x.y), - fastExp(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastExp( - const detail::tvec4& x) -{ - return detail::tvec4( - fastExp(x.x), - fastExp(x.y), - fastExp(x.z), - fastExp(x.w)); -} - -// fastLog -template -GLM_FUNC_QUALIFIER T fastLog(const T x) -{ - return std::log(x); -} - -/* Slower than the VC7.1 function... -GLM_FUNC_QUALIFIER float fastLog(float x) -{ - float y1 = (x - 1.0f) / (x + 1.0f); - float y2 = y1 * y1; - return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f))); -} -*/ - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastLog( - const detail::tvec2& x) -{ - return detail::tvec2( - fastLog(x.x), - fastLog(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastLog( - const detail::tvec3& x) -{ - return detail::tvec3( - fastLog(x.x), - fastLog(x.y), - fastLog(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastLog( - const detail::tvec4& x) -{ - return detail::tvec4( - fastLog(x.x), - fastLog(x.y), - fastLog(x.z), - fastLog(x.w)); -} - -//fastExp2, ln2 = 0.69314718055994530941723212145818f -template -GLM_FUNC_QUALIFIER T fastExp2(const T x) -{ - return fastExp(0.69314718055994530941723212145818f * x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastExp2( - const detail::tvec2& x) -{ - return detail::tvec2( - fastExp2(x.x), - fastExp2(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastExp2( - const detail::tvec3& x) -{ - return detail::tvec3( - fastExp2(x.x), - fastExp2(x.y), - fastExp2(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastExp2( - const detail::tvec4& x) -{ - return detail::tvec4( - fastExp2(x.x), - fastExp2(x.y), - fastExp2(x.z), - fastExp2(x.w)); -} - -// fastLog2, ln2 = 0.69314718055994530941723212145818f -template -GLM_FUNC_QUALIFIER T fastLog2(const T x) -{ - return fastLog(x) / 0.69314718055994530941723212145818f; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastLog2( - const detail::tvec2& x) -{ - return detail::tvec2( - fastLog2(x.x), - fastLog2(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastLog2( - const detail::tvec3& x) -{ - return detail::tvec3( - fastLog2(x.x), - fastLog2(x.y), - fastLog2(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastLog2( - const detail::tvec4& x) -{ - return detail::tvec4( - fastLog2(x.x), - fastLog2(x.y), - fastLog2(x.z), - fastLog2(x.w)); -} +#include "../core/_vectorize.hpp" + +namespace glm +{ + // fastPow: + template + GLM_FUNC_QUALIFIER genType fastPow(genType const & x, genType const & y) + { + return exp(y * log(x)); + } + + VECTORIZE_VEC_VEC(fastPow) + + template + GLM_FUNC_QUALIFIER T fastPow(const T x, int y) + { + T f = T(1); + for(int i = 0; i < y; ++i) + f *= x; + return f; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 fastPow( + const detail::tvec2& x, + const detail::tvec2& y) + { + return detail::tvec2( + fastPow(x.x, y.x), + fastPow(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 fastPow( + const detail::tvec3& x, + const detail::tvec3& y) + { + return detail::tvec3( + fastPow(x.x, y.x), + fastPow(x.y, y.y), + fastPow(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 fastPow( + const detail::tvec4& x, + const detail::tvec4& y) + { + return detail::tvec4( + fastPow(x.x, y.x), + fastPow(x.y, y.y), + fastPow(x.z, y.z), + fastPow(x.w, y.w)); + } + + // fastExp + // Note: This function provides accurate results only for value between -1 and 1, else avoid it. + template + GLM_FUNC_QUALIFIER T fastExp(const T x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + T x2 = x * x; + T x3 = x2 * x; + T x4 = x3 * x; + T x5 = x4 * x; + return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333)); + } + /* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance + GLM_FUNC_QUALIFIER float fastExp(float x) + { + const float e = 2.718281828f; + const float IntegerPart = floor(x); + const float FloatPart = x - IntegerPart; + float z = 1.f; + + for(int i = 0; i < int(IntegerPart); ++i) + z *= e; + + const float x2 = FloatPart * FloatPart; + const float x3 = x2 * FloatPart; + const float x4 = x3 * FloatPart; + const float x5 = x4 * FloatPart; + return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)); + } + + // Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers + GLM_FUNC_QUALIFIER float fastExp(float x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + float x2 = x * x; + float x3 = x2 * x; + float x4 = x3 * x; + float x5 = x4 * x; + float x6 = x5 * x; + float x7 = x6 * x; + float x8 = x7 * x; + return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);; + } + */ + + VECTORIZE_VEC(fastExp) + + // fastLog + template + GLM_FUNC_QUALIFIER genType fastLog(genType const & x) + { + return std::log(x); + } + + /* Slower than the VC7.1 function... + GLM_FUNC_QUALIFIER float fastLog(float x) + { + float y1 = (x - 1.0f) / (x + 1.0f); + float y2 = y1 * y1; + return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f))); + } + */ + + VECTORIZE_VEC(fastLog) + + //fastExp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastExp2(genType const & x) + { + return fastExp(0.69314718055994530941723212145818f * x); + } + + VECTORIZE_VEC(fastExp2) + + // fastLog2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType fastLog2(genType const & x) + { + return fastLog(x) / 0.69314718055994530941723212145818f; + } + + VECTORIZE_VEC(fastLog2) }//namespace glm diff --git a/glm/gtx/fast_trigonometry.inl b/glm/gtx/fast_trigonometry.inl index 65293909..c516ea36 100644 --- a/glm/gtx/fast_trigonometry.inl +++ b/glm/gtx/fast_trigonometry.inl @@ -2,267 +2,76 @@ // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2006-01-08 -// Updated : 2006-01-08 +// Updated : 2011-10-14 // Licence : This source is under MIT License // File : glm/gtx/fast_trigonometry.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ +#include "../core/_vectorize.hpp" -// sin -template -GLM_FUNC_QUALIFIER T fastSin(const T x) +namespace glm { - return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040)); -} + // sin + template + GLM_FUNC_QUALIFIER T fastSin(T const & x) + { + return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040)); + } -template -GLM_FUNC_QUALIFIER detail::tvec2 fastSin( - const detail::tvec2& x) -{ - return detail::tvec2( - fastSin(x.x), - fastSin(x.y)); -} + VECTORIZE_VEC(fastSin) -template -GLM_FUNC_QUALIFIER detail::tvec3 fastSin( - const detail::tvec3& x) -{ - return detail::tvec3( - fastSin(x.x), - fastSin(x.y), - fastSin(x.z)); -} + // cos + template + GLM_FUNC_QUALIFIER T fastCos(T const & x) + { + return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888)); + } -template -GLM_FUNC_QUALIFIER detail::tvec4 fastSin( - const detail::tvec4& x) -{ - return detail::tvec4( - fastSin(x.x), - fastSin(x.y), - fastSin(x.z), - fastSin(x.w)); -} + VECTORIZE_VEC(fastCos) -// cos -template -GLM_FUNC_QUALIFIER T fastCos(const T x) -{ - return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888)); -} + // tan + template + GLM_FUNC_QUALIFIER T fastTan(T const & x) + { + return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); + } -template -GLM_FUNC_QUALIFIER detail::tvec2 fastCos( - const detail::tvec2& x) -{ - return detail::tvec2( - fastCos(x.x), - fastCos(x.y)); -} + VECTORIZE_VEC(fastTan) -template -GLM_FUNC_QUALIFIER detail::tvec3 fastCos( - const detail::tvec3& x) -{ - return detail::tvec3( - fastCos(x.x), - fastCos(x.y), - fastCos(x.z)); -} + // asin + template + GLM_FUNC_QUALIFIER T fastAsin(T const & x) + { + return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); + } -template -GLM_FUNC_QUALIFIER detail::tvec4 fastCos( - const detail::tvec4& x) -{ - return detail::tvec4( - fastCos(x.x), - fastCos(x.y), - fastCos(x.z), - fastCos(x.w)); -} + VECTORIZE_VEC(fastAsin) -// tan -template -GLM_FUNC_QUALIFIER T fastTan(const T x) -{ - return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); -} + // acos + template + GLM_FUNC_QUALIFIER T fastAcos(T const & x) + { + return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) + } -template -GLM_FUNC_QUALIFIER detail::tvec2 fastTan( - const detail::tvec2& x) -{ - return detail::tvec2( - fastTan(x.x), - fastTan(x.y)); -} + VECTORIZE_VEC(fastAcos) -template -GLM_FUNC_QUALIFIER detail::tvec3 fastTan( - const detail::tvec3& x) -{ - return detail::tvec3( - fastTan(x.x), - fastTan(x.y), - fastTan(x.z)); -} + // atan + template + GLM_FUNC_QUALIFIER T fastAtan(T const & y, T const & x) + { + T sgn = sign(y) * sign(x); + return abs(fastAtan(y / x)) * sgn; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 fastTan( - const detail::tvec4& x) -{ - return detail::tvec4( - fastTan(x.x), - fastTan(x.y), - fastTan(x.z), - fastTan(x.w)); -} + VECTORIZE_VEC_VEC(fastAtan) -// asin -template -GLM_FUNC_QUALIFIER T fastAsin(const T x) -{ - return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); -} - -template detail::tvec2 fastAsin( - const detail::tvec2& x) -{ - return detail::tvec2( - fastAsin(x.x), - fastAsin(x.y)); -} - -template detail::tvec3 fastAsin( - const detail::tvec3& x) -{ - return detail::tvec3( - fastAsin(x.x), - fastAsin(x.y), - fastAsin(x.z)); -} + template + GLM_FUNC_QUALIFIER T fastAtan(T const & x) + { + return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); + } -template detail::tvec4 fastAsin( - const detail::tvec4& x) -{ - return detail::tvec4( - fastAsin(x.x), - fastAsin(x.y), - fastAsin(x.z), - fastAsin(x.w)); -} - -// acos -template -GLM_FUNC_QUALIFIER T fastAcos(const T x) -{ - return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) -} - -template detail::tvec2 fastAcos( - const detail::tvec2& x) -{ - return detail::tvec2( - fastAcos(x.x), - fastAcos(x.y)); -} - -template detail::tvec3 fastAcos( - const detail::tvec3& x) -{ - return detail::tvec3( - fastAcos(x.x), - fastAcos(x.y), - fastAcos(x.z)); -} - -template detail::tvec4 fastAcos( - const detail::tvec4& x) -{ - return detail::tvec4( - fastAcos(x.x), - fastAcos(x.y), - fastAcos(x.z), - fastAcos(x.w)); -} - -// atan -template -GLM_FUNC_QUALIFIER T fastAtan(const T y, const T x) -{ - T sgn = sign(y) * sign(x); - return abs(fastAtan(y / x)) * sgn; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastAtan( - const detail::tvec2& y, - const detail::tvec2& x) -{ - return detail::tvec2( - fastAtan(y.x, x.x), - fastAtan(y.y, x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastAtan( - const detail::tvec3& y, - const detail::tvec3& x) -{ - return detail::tvec3( - fastAtan(y.x, x.x), - fastAtan(y.y, x.y), - fastAtan(y.z, x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastAtan( - const detail::tvec4& y, - const detail::tvec4& x) -{ - return detail::tvec4( - fastAtan(y.x, x.x), - fastAtan(y.y, x.y), - fastAtan(y.z, x.z), - fastAtan(y.w, x.w)); -} - -template -GLM_FUNC_QUALIFIER T fastAtan(const T x) -{ - return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastAtan( - const detail::tvec2& x) -{ - return detail::tvec2( - fastAtan(x.x), - fastAtan(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastAtan( - const detail::tvec3& x) -{ - return detail::tvec3( - fastAtan(x.x), - fastAtan(x.y), - fastAtan(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastAtan( - const detail::tvec4& x) -{ - return detail::tvec4( - fastAtan(x.x), - fastAtan(x.y), - fastAtan(x.z), - fastAtan(x.w)); -} + VECTORIZE_VEC(fastAtan) }//namespace glm diff --git a/glm/gtx/gradient_paint.inl b/glm/gtx/gradient_paint.inl index 0043f47e..d482e6de 100644 --- a/glm/gtx/gradient_paint.inl +++ b/glm/gtx/gradient_paint.inl @@ -7,38 +7,37 @@ // File : glm/gtx/gradient_paint.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -valType radialGradient -( - detail::tvec2 const & Center, - valType const & Radius, - detail::tvec2 const & Focal, - detail::tvec2 const & Position -) +namespace glm { - detail::tvec2 F = Focal - Center; - detail::tvec2 D = Position - Focal; - valType Radius2 = pow2(Radius); - valType Fx2 = pow2(F.x); - valType Fy2 = pow2(F.y); - - valType Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); - valType Denominator = Radius2 - (Fx2 + Fy2); - return Numerator / Denominator; -} + template + valType radialGradient + ( + detail::tvec2 const & Center, + valType const & Radius, + detail::tvec2 const & Focal, + detail::tvec2 const & Position + ) + { + detail::tvec2 F = Focal - Center; + detail::tvec2 D = Position - Focal; + valType Radius2 = pow2(Radius); + valType Fx2 = pow2(F.x); + valType Fy2 = pow2(F.y); -template -valType linearGradient -( - detail::tvec2 const & Point0, - detail::tvec2 const & Point1, - detail::tvec2 const & Position -) -{ - detail::tvec2 Dist = Point1 - Point0; - return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); -} + valType Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); + valType Denominator = Radius2 - (Fx2 + Fy2); + return Numerator / Denominator; + } + template + valType linearGradient + ( + detail::tvec2 const & Point0, + detail::tvec2 const & Point1, + detail::tvec2 const & Position + ) + { + detail::tvec2 Dist = Point1 - Point0; + return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); + } }//namespace glm diff --git a/glm/gtx/handed_coordinate_space.inl b/glm/gtx/handed_coordinate_space.inl index 8e0dd597..c2e1e647 100644 --- a/glm/gtx/handed_coordinate_space.inl +++ b/glm/gtx/handed_coordinate_space.inl @@ -7,24 +7,27 @@ // File : glm/gtx/handed_coordinate_space.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER bool rightHanded( - detail::tvec3 const & tangent, - detail::tvec3 const & binormal, - detail::tvec3 const & normal) -{ - return dot(cross(normal, tangent), binormal) > T(0); -} - -template -GLM_FUNC_QUALIFIER bool leftHanded( - detail::tvec3 const & tangent, - detail::tvec3 const & binormal, - detail::tvec3 const & normal) +namespace glm { - return dot(cross(normal, tangent), binormal) < T(0); -} + template + GLM_FUNC_QUALIFIER bool rightHanded + ( + detail::tvec3 const & tangent, + detail::tvec3 const & binormal, + detail::tvec3 const & normal + ) + { + return dot(cross(normal, tangent), binormal) > T(0); + } + template + GLM_FUNC_QUALIFIER bool leftHanded + ( + detail::tvec3 const & tangent, + detail::tvec3 const & binormal, + detail::tvec3 const & normal + ) + { + return dot(cross(normal, tangent), binormal) < T(0); + } }//namespace glm diff --git a/glm/gtx/inertia.hpp b/glm/gtx/inertia.hpp index 276e5191..bda6f323 100644 --- a/glm/gtx/inertia.hpp +++ b/glm/gtx/inertia.hpp @@ -55,57 +55,57 @@ namespace glm //! From GLM_GTX_inertia extension. template detail::tmat3x3 boxInertia3( - const T Mass, - const detail::tvec3& Scale); + T const & Mass, + detail::tvec3 const & Scale); //! Build an inertia matrix for a box. //! From GLM_GTX_inertia extension. template detail::tmat4x4 boxInertia4( - const T Mass, - const detail::tvec3& Scale); + T const & Mass, + detail::tvec3 const & Scale); //! Build an inertia matrix for a disk. //! From GLM_GTX_inertia extension. template detail::tmat3x3 diskInertia3( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); //! Build an inertia matrix for a disk. //! From GLM_GTX_inertia extension. template detail::tmat4x4 diskInertia4( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); //! Build an inertia matrix for a ball. //! From GLM_GTX_inertia extension. template detail::tmat3x3 ballInertia3( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); //! Build an inertia matrix for a ball. //! From GLM_GTX_inertia extension. template detail::tmat4x4 ballInertia4( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); //! Build an inertia matrix for a sphere. //! From GLM_GTX_inertia extension. template detail::tmat3x3 sphereInertia3( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); //! Build an inertia matrix for a sphere. //! From GLM_GTX_inertia extension. template detail::tmat4x4 sphereInertia4( - const T Mass, - const T Radius); + T const & Mass, + T const & Radius); /// @} }// namespace glm diff --git a/glm/gtx/inertia.inl b/glm/gtx/inertia.inl index b82a40db..d2f9e0ac 100644 --- a/glm/gtx/inertia.inl +++ b/glm/gtx/inertia.inl @@ -7,93 +7,108 @@ // File : glm/gtx/inertia.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 boxInertia3( - const T Mass, - const detail::tvec3& Scale) +namespace glm { - detail::tmat3x3 Result(T(1)); - Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); - Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); - Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 boxInertia3 + ( + T const & Mass, + detail::tvec3 const & Scale + ) + { + detail::tmat3x3 Result(T(1)); + Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); + Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); + Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 boxInertia4( - const T Mass, - const detail::tvec3& Scale) -{ - detail::tmat4x4 Result(T(1)); - Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); - Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); - Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 boxInertia4 + ( + T const & Mass, + detail::tvec3 const & Scale + ) + { + detail::tmat4x4 Result(T(1)); + Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); + Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); + Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 diskInertia3( - const T Mass, - const T Radius) -{ - T a = Mass * Radius * Radius / T(2); - detail::tmat3x3 Result(a); - Result[2][2] *= T(2); - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 diskInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = Mass * Radius * Radius / T(2); + detail::tmat3x3 Result(a); + Result[2][2] *= T(2); + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 diskInertia4( - const T Mass, - const T Radius) -{ - T a = Mass * Radius * Radius / T(2); - detail::tmat4x4 Result(a); - Result[2][2] *= T(2); - Result[3][3] = T(1); - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 diskInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = Mass * Radius * Radius / T(2); + detail::tmat4x4 Result(a); + Result[2][2] *= T(2); + Result[3][3] = T(1); + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 ballInertia3( - const T Mass, - const T Radius) -{ - T a = T(2) * Mass * Radius * Radius / T(5); - return detail::tmat3x3(a); -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 ballInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(5); + return detail::tmat3x3(a); + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 ballInertia4( - const T Mass, - const T Radius) -{ - T a = T(2) * Mass * Radius * Radius / T(5); - detail::tmat4x4 Result(a); - Result[3][3] = T(1); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 sphereInertia3( - const T Mass, - const T Radius) -{ - T a = T(2) * Mass * Radius * Radius / T(3); - return detail::tmat3x3(a); -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 ballInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(5); + detail::tmat4x4 Result(a); + Result[3][3] = T(1); + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 sphereInertia4( - const T Mass, - const T Radius) -{ - T a = T(2) * Mass * Radius * Radius / T(3); - detail::tmat4x4 Result(a); - Result[3][3] = T(1); - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 sphereInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(3); + return detail::tmat3x3(a); + } + template + GLM_FUNC_QUALIFIER detail::tmat4x4 sphereInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(3); + detail::tmat4x4 Result(a); + Result[3][3] = T(1); + return Result; + } }//namespace glm diff --git a/glm/gtx/int_10_10_10_2.inl b/glm/gtx/int_10_10_10_2.inl index 83e15bcb..9632d544 100644 --- a/glm/gtx/int_10_10_10_2.inl +++ b/glm/gtx/int_10_10_10_2.inl @@ -7,11 +7,13 @@ // File : glm/gtx/int_10_10_10_2.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -GLM_FUNC_QUALIFIER dword uint10_10_10_2_cast(glm::vec4 const & v) +namespace glm { - return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 | uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30); -} - + GLM_FUNC_QUALIFIER dword uint10_10_10_2_cast + ( + glm::vec4 const & v + ) + { + return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 | uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30); + } }//namespace glm diff --git a/glm/gtx/integer.inl b/glm/gtx/integer.inl index ecb4ac9c..4342cf1a 100644 --- a/glm/gtx/integer.inl +++ b/glm/gtx/integer.inl @@ -7,35 +7,35 @@ // 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) +namespace glm { - if(x <= 1) return x; + // 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; + int NextTrial = x >> 1; + int CurrentAnswer; - do - { - CurrentAnswer = NextTrial; - NextTrial = (NextTrial + x / NextTrial) >> 1; - } while(NextTrial < CurrentAnswer); + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); - return CurrentAnswer; -} + return CurrentAnswer; + } // Henry Gordon Dietz: http://aggregate.org/MAGIC/ namespace detail @@ -69,132 +69,132 @@ namespace detail }; }//namespace detail -// Henry Gordon Dietz: http://aggregate.org/MAGIC/ -unsigned int floor_log2(unsigned int x) -{ - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); + // Henry Gordon Dietz: http://aggregate.org/MAGIC/ + 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); -} + return(detail::ones32(x) - 1); + } -// mod -GLM_FUNC_QUALIFIER int mod(int x, int y) -{ - return x - y * (x / y); -} + // mod + GLM_FUNC_QUALIFIER int mod(int x, int y) + { + return x - y * (x / y); + } -// factorial (!12 max, integer only) -template -GLM_FUNC_QUALIFIER genType factorial(genType const & x) -{ - genType Temp = x; - genType Result; - for(Result = 1; Temp > 1; --Temp) - Result *= Temp; - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 factorial( - detail::tvec2 const & x) -{ - return detail::tvec2( - factorial(x.x), - factorial(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 factorial( - detail::tvec3 const & x) -{ - return detail::tvec3( - factorial(x.x), - factorial(x.y), - factorial(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 factorial( - detail::tvec4 const & x) -{ - return detail::tvec4( - 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; -} + // factorial (!12 max, integer only) + template + GLM_FUNC_QUALIFIER genType factorial(genType const & x) + { + genType Temp = x; + genType Result; + for(Result = 1; Temp > 1; --Temp) + Result *= Temp; + return Result; + } -GLM_FUNC_QUALIFIER uint sqrt(uint x) -{ - if(x <= 1) return x; + template + GLM_FUNC_QUALIFIER detail::tvec2 factorial( + detail::tvec2 const & x) + { + return detail::tvec2( + factorial(x.x), + factorial(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 factorial( + detail::tvec3 const & x) + { + return detail::tvec3( + factorial(x.x), + factorial(x.y), + factorial(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 factorial( + detail::tvec4 const & x) + { + return detail::tvec4( + factorial(x.x), + factorial(x.y), + factorial(x.z), + factorial(x.w)); + } - uint NextTrial = x >> 1; - uint CurrentAnswer; + GLM_FUNC_QUALIFIER uint pow(uint x, uint y) + { + uint result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } - do - { - CurrentAnswer = NextTrial; - NextTrial = (NextTrial + x / NextTrial) >> 1; - } while(NextTrial < CurrentAnswer); + GLM_FUNC_QUALIFIER uint sqrt(uint x) + { + if(x <= 1) return x; - return CurrentAnswer; -} + uint NextTrial = x >> 1; + uint CurrentAnswer; -GLM_FUNC_QUALIFIER uint mod(uint x, uint y) -{ - return x - y * (x / y); -} + 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); -} + 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); -} + // 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) diff --git a/glm/gtx/intersect.inl b/glm/gtx/intersect.inl index d616a0a3..80cc60e3 100644 --- a/glm/gtx/intersect.inl +++ b/glm/gtx/intersect.inl @@ -10,188 +10,187 @@ #include #include -namespace glm{ - -template -GLM_FUNC_QUALIFIER bool intersectRayTriangle -( - genType const & orig, genType const & dir, - genType const & v0, genType const & v1, genType const & v2, - genType & baryPosition -) +namespace glm { - genType e1 = v1 - v0; - genType e2 = v2 - v0; + template + GLM_FUNC_QUALIFIER bool intersectRayTriangle + ( + genType const & orig, genType const & dir, + genType const & v0, genType const & v1, genType const & v2, + genType & baryPosition + ) + { + genType e1 = v1 - v0; + genType e2 = v2 - v0; - genType p = glm::cross(dir, e2); + genType p = glm::cross(dir, e2); - typename genType::value_type a = glm::dot(e1, p); + typename genType::value_type a = glm::dot(e1, p); - typename genType::value_type Epsilon = std::numeric_limits::epsilon(); - if(a < Epsilon) - return false; + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + if(a < Epsilon) + return false; - typename genType::value_type f = typename genType::value_type(1.0f) / a; + typename genType::value_type f = typename genType::value_type(1.0f) / a; - genType s = orig - v0; - baryPosition.x = f * glm::dot(s, p); - if(baryPosition.x < typename genType::value_type(0.0f)) - return false; - if(baryPosition.x > typename genType::value_type(1.0f)) - return false; + genType s = orig - v0; + baryPosition.x = f * glm::dot(s, p); + if(baryPosition.x < typename genType::value_type(0.0f)) + return false; + if(baryPosition.x > typename genType::value_type(1.0f)) + return false; - genType q = glm::cross(s, e1); - baryPosition.y = f * glm::dot(dir, q); - if(baryPosition.y < typename genType::value_type(0.0f)) - return false; - if(baryPosition.y + baryPosition.x > typename genType::value_type(1.0f)) - return false; + genType q = glm::cross(s, e1); + baryPosition.y = f * glm::dot(dir, q); + if(baryPosition.y < typename genType::value_type(0.0f)) + return false; + if(baryPosition.y + baryPosition.x > typename genType::value_type(1.0f)) + return false; - baryPosition.z = f * glm::dot(e2, q); - - return baryPosition.z >= typename genType::value_type(0.0f); -} - -//template -//GLM_FUNC_QUALIFIER bool intersectRayTriangle -//( -// genType const & orig, genType const & dir, -// genType const & vert0, genType const & vert1, genType const & vert2, -// genType & position -//) -//{ -// typename genType::value_type Epsilon = std::numeric_limits::epsilon(); -// -// genType edge1 = vert1 - vert0; -// genType edge2 = vert2 - vert0; -// -// genType pvec = cross(dir, edge2); -// -// float det = dot(edge1, pvec); -// if(det < Epsilon) -// return false; -// -// genType tvec = orig - vert0; -// -// position.y = dot(tvec, pvec); -// if (position.y < typename genType::value_type(0) || position.y > det) -// return typename genType::value_type(0); -// -// genType qvec = cross(tvec, edge1); -// -// position.z = dot(dir, qvec); -// if (position.z < typename genType::value_type(0) || position.y + position.z > det) -// return typename genType::value_type(0); -// -// position.x = dot(edge2, qvec); -// position *= typename genType::value_type(1) / det; -// -// return typename genType::value_type(1); -//} - -template -GLM_FUNC_QUALIFIER bool intersectLineTriangle -( - genType const & orig, genType const & dir, - genType const & vert0, genType const & vert1, genType const & vert2, - genType & position -) -{ - typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + baryPosition.z = f * glm::dot(e2, q); - genType edge1 = vert1 - vert0; - genType edge2 = vert2 - vert0; - - genType pvec = cross(dir, edge2); + return baryPosition.z >= typename genType::value_type(0.0f); + } - float det = dot(edge1, pvec); + //template + //GLM_FUNC_QUALIFIER bool intersectRayTriangle + //( + // genType const & orig, genType const & dir, + // genType const & vert0, genType const & vert1, genType const & vert2, + // genType & position + //) + //{ + // typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + // + // genType edge1 = vert1 - vert0; + // genType edge2 = vert2 - vert0; + // + // genType pvec = cross(dir, edge2); + // + // float det = dot(edge1, pvec); + // if(det < Epsilon) + // return false; + // + // genType tvec = orig - vert0; + // + // position.y = dot(tvec, pvec); + // if (position.y < typename genType::value_type(0) || position.y > det) + // return typename genType::value_type(0); + // + // genType qvec = cross(tvec, edge1); + // + // position.z = dot(dir, qvec); + // if (position.z < typename genType::value_type(0) || position.y + position.z > det) + // return typename genType::value_type(0); + // + // position.x = dot(edge2, qvec); + // position *= typename genType::value_type(1) / det; + // + // return typename genType::value_type(1); + //} + + template + GLM_FUNC_QUALIFIER bool intersectLineTriangle + ( + genType const & orig, genType const & dir, + genType const & vert0, genType const & vert1, genType const & vert2, + genType & position + ) + { + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); - if (det > -Epsilon && det < Epsilon) - return false; - float inv_det = typename genType::value_type(1) / det; + genType edge1 = vert1 - vert0; + genType edge2 = vert2 - vert0; - genType tvec = orig - vert0; + genType pvec = cross(dir, edge2); - position.y = dot(tvec, pvec) * inv_det; - if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1)) - return false; + float det = dot(edge1, pvec); - genType qvec = cross(tvec, edge1); + if (det > -Epsilon && det < Epsilon) + return false; + float inv_det = typename genType::value_type(1) / det; - position.z = dot(dir, qvec) * inv_det; - if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1)) - return false; + genType tvec = orig - vert0; - position.x = dot(edge2, qvec) * inv_det; + position.y = dot(tvec, pvec) * inv_det; + if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1)) + return false; - return true; -} + genType qvec = cross(tvec, edge1); -template -GLM_FUNC_QUALIFIER bool intersectRaySphere -( - genType const & rayStarting, genType const & rayDirection, - genType const & sphereCenter, typename genType::value_type sphereRadius, - genType & position, genType & normal -) -{ - typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + position.z = dot(dir, qvec) * inv_det; + if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1)) + return false; - typename genType::value_type a = dot(rayDirection, rayDirection); - typename genType::value_type b = typename genType::value_type(2) * dot(rayStarting, rayDirection); - typename genType::value_type c = dot(rayStarting, rayStarting) - sphereRadius * sphereRadius; - typename genType::value_type d = b * b - typename genType::value_type(4) * a * c; - typename genType::value_type e = sqrt(d); - typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a); - typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a); + position.x = dot(edge2, qvec) * inv_det; - if(x1 > Epsilon) - { - position = rayStarting + rayDirection * sphereRadius; - normal = (position - sphereCenter) / sphereRadius; return true; } - else if(x2 > Epsilon) - { - position = rayStarting + rayDirection * sphereRadius; - normal = (position - sphereCenter) / sphereRadius; - return true; - } - return false; -} - -template -GLM_FUNC_QUALIFIER bool intersectLineSphere -( - genType const & point0, genType const & point1, - genType const & center, typename genType::value_type radius, - genType & position, genType & normal -) -{ - typename genType::value_type Epsilon = std::numeric_limits::epsilon(); - - genType dir = point1 - point0; - typename genType::value_type a = dot(dir, dir); - typename genType::value_type b = typename genType::value_type(2) * dot(center, dir); - typename genType::value_type c = dot(center, center) - radius * radius; - typename genType::value_type d = b * b - typename genType::value_type(4) * a * c; - typename genType::value_type e = sqrt(d); - typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a); - typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a); - - if(x1 > Epsilon) + + template + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const & rayStarting, genType const & rayDirection, + genType const & sphereCenter, typename genType::value_type sphereRadius, + genType & position, genType & normal + ) { - position = center + dir * radius; - normal = (position - center) / radius; - return true; + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + typename genType::value_type a = dot(rayDirection, rayDirection); + typename genType::value_type b = typename genType::value_type(2) * dot(rayStarting, rayDirection); + typename genType::value_type c = dot(rayStarting, rayStarting) - sphereRadius * sphereRadius; + typename genType::value_type d = b * b - typename genType::value_type(4) * a * c; + typename genType::value_type e = sqrt(d); + typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a); + typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a); + + if(x1 > Epsilon) + { + position = rayStarting + rayDirection * sphereRadius; + normal = (position - sphereCenter) / sphereRadius; + return true; + } + else if(x2 > Epsilon) + { + position = rayStarting + rayDirection * sphereRadius; + normal = (position - sphereCenter) / sphereRadius; + return true; + } + return false; } - else if(x2 > Epsilon) + + template + GLM_FUNC_QUALIFIER bool intersectLineSphere + ( + genType const & point0, genType const & point1, + genType const & center, typename genType::value_type radius, + genType & position, genType & normal + ) { - position = center + dir * radius; - normal = (position - center) / radius; - return true; + typename genType::value_type Epsilon = std::numeric_limits::epsilon(); + + genType dir = point1 - point0; + typename genType::value_type a = dot(dir, dir); + typename genType::value_type b = typename genType::value_type(2) * dot(center, dir); + typename genType::value_type c = dot(center, center) - radius * radius; + typename genType::value_type d = b * b - typename genType::value_type(4) * a * c; + typename genType::value_type e = sqrt(d); + typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a); + typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a); + + if(x1 > Epsilon) + { + position = center + dir * radius; + normal = (position - center) / radius; + return true; + } + else if(x2 > Epsilon) + { + position = center + dir * radius; + normal = (position - center) / radius; + return true; + } + return false; } - return false; -} - }//namespace glm diff --git a/glm/gtx/log_base.inl b/glm/gtx/log_base.inl index 0389dfcf..ec2fe811 100644 --- a/glm/gtx/log_base.inl +++ b/glm/gtx/log_base.inl @@ -7,82 +7,20 @@ // File : glm/gtx/log_base.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ +#include "../core/_vectorize.hpp" -template -GLM_FUNC_QUALIFIER genType log( - genType const & x, - genType const & base) +namespace glm { - assert(x != genType(0)); - - return glm::log(x) / glm::log(base); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 log( - detail::tvec2 const & v, - valType const & base) -{ - return detail::tvec2( - log(v.x, base), - log(v.y, base)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 log( - detail::tvec3 const & v, - valType const & base) -{ - return detail::tvec3( - log(v.x, base), - log(v.y, base), - log(v.z, base)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 log( - detail::tvec4 const & v, - valType const & base) -{ - return detail::tvec4( - log(v.x, base), - log(v.y, base), - log(v.z, base), - log(v.w, base)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 log( - detail::tvec2 const & v, - detail::tvec2 const & base) -{ - return detail::tvec2( - log(v.x, base.x), - log(v.y, base.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 log( - detail::tvec3 const & v, - detail::tvec3 const & base) -{ - return detail::tvec3( - log(v.x, base.x), - log(v.y, base.y), - log(v.z, base.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 log( - detail::tvec4 const & v, - detail::tvec4 const & base) -{ - return detail::tvec4( - log(v.x, base.x), - log(v.y, base.y), - log(v.z, base.z), - log(v.w, base.w)); -} - + template + GLM_FUNC_QUALIFIER genType log( + genType const & x, + genType const & base) + { + assert(x != genType(0)); + + return glm::log(x) / glm::log(base); + } + + VECTORIZE_VEC_SCA(log) + VECTORIZE_VEC_VEC(log) }//namespace glm diff --git a/glm/gtx/matrix_cross_product.inl b/glm/gtx/matrix_cross_product.inl index 4132ba96..ea0fa02e 100644 --- a/glm/gtx/matrix_cross_product.inl +++ b/glm/gtx/matrix_cross_product.inl @@ -7,34 +7,38 @@ // File : glm/gtx/matrix_cross_product.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 matrixCross3( - detail::tvec3 const & x) +namespace glm { - detail::tmat3x3 Result(T(0)); - Result[0][1] = x.z; - Result[1][0] = -x.z; - Result[0][2] = -x.y; - Result[2][0] = x.y; - Result[1][2] = x.x; - Result[2][1] = -x.x; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 matrixCross3 + ( + detail::tvec3 const & x + ) + { + detail::tmat3x3 Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 matrixCross4( - detail::tvec3 const & x) -{ - detail::tmat4x4 Result(T(0)); - Result[0][1] = x.z; - Result[1][0] = -x.z; - Result[0][2] = -x.y; - Result[2][0] = x.y; - Result[1][2] = x.x; - Result[2][1] = -x.x; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 matrixCross4 + ( + detail::tvec3 const & x + ) + { + detail::tmat4x4 Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } }//namespace glm diff --git a/glm/gtx/matrix_interpolation.inl b/glm/gtx/matrix_interpolation.inl index b5ecb407..c3df381c 100644 --- a/glm/gtx/matrix_interpolation.inl +++ b/glm/gtx/matrix_interpolation.inl @@ -7,107 +7,112 @@ // File : glm/gtx/matrix_interpolation.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER void axisAngle( - detail::tmat4x4 const & mat, - detail::tvec3 & axis, - T & angle) +namespace glm { - T epsilon = (T)0.01; - T epsilon2 = (T)0.1; - - if ((fabs(mat[1][0] - mat[0][1]) < epsilon) && (fabs(mat[2][0] - mat[0][2]) < epsilon) && (fabs(mat[2][1] - mat[1][2]) < epsilon)) { - if ((fabs(mat[1][0] + mat[0][1]) < epsilon2) && (fabs(mat[2][0] + mat[0][2]) < epsilon2) && (fabs(mat[2][1] + mat[1][2]) < epsilon2) && (fabs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) { - angle = (T)0.0; - axis.x = (T)1.0; - axis.y = (T)0.0; - axis.z = (T)0.0; - return; - } - angle = T(3.1415926535897932384626433832795); - T xx = (mat[0][0] + (T)1.0) / (T)2.0; - T yy = (mat[1][1] + (T)1.0) / (T)2.0; - T zz = (mat[2][2] + (T)1.0) / (T)2.0; - T xy = (mat[1][0] + mat[0][1]) / (T)4.0; - T xz = (mat[2][0] + mat[0][2]) / (T)4.0; - T yz = (mat[2][1] + mat[1][2]) / (T)4.0; - if ((xx > yy) && (xx > zz)) { - if (xx < epsilon) { - axis.x = (T)0.0; - axis.y = (T)0.7071; - axis.z = (T)0.7071; - } else { - axis.x = sqrt(xx); - axis.y = xy / axis.x; - axis.z = xz / axis.x; - } - } else if (yy > zz) { - if (yy < epsilon) { - axis.x = (T)0.7071; - axis.y = (T)0.0; - axis.z = (T)0.7071; - } else { - axis.y = sqrt(yy); - axis.x = xy / axis.y; - axis.z = yz / axis.y; - } - } else { - if (zz < epsilon) { - axis.x = (T)0.7071; - axis.y = (T)0.7071; - axis.z = (T)0.0; - } else { - axis.z = sqrt(zz); - axis.x = xz / axis.z; - axis.y = yz / axis.z; - } - } - return; - } - T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); - if (glm::abs(s) < T(0.001)) - s = (T)1.0; - angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0); - axis.x = (mat[1][2] - mat[2][1]) / s; - axis.y = (mat[2][0] - mat[0][2]) / s; - axis.z = (mat[0][1] - mat[1][0]) / s; -} + template + GLM_FUNC_QUALIFIER void axisAngle + ( + detail::tmat4x4 const & mat, + detail::tvec3 & axis, + T & angle + ) + { + T epsilon = (T)0.01; + T epsilon2 = (T)0.1; -template -GLM_FUNC_QUALIFIER detail::tmat4x4 axisAngleMatrix( - detail::tvec3 const & axis, - T const angle) -{ - T c = cos(angle); - T s = sin(angle); - T t = T(1) - c; - detail::tvec3 n = normalize(axis); + if ((fabs(mat[1][0] - mat[0][1]) < epsilon) && (fabs(mat[2][0] - mat[0][2]) < epsilon) && (fabs(mat[2][1] - mat[1][2]) < epsilon)) { + if ((fabs(mat[1][0] + mat[0][1]) < epsilon2) && (fabs(mat[2][0] + mat[0][2]) < epsilon2) && (fabs(mat[2][1] + mat[1][2]) < epsilon2) && (fabs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) { + angle = (T)0.0; + axis.x = (T)1.0; + axis.y = (T)0.0; + axis.z = (T)0.0; + return; + } + angle = T(3.1415926535897932384626433832795); + T xx = (mat[0][0] + (T)1.0) / (T)2.0; + T yy = (mat[1][1] + (T)1.0) / (T)2.0; + T zz = (mat[2][2] + (T)1.0) / (T)2.0; + T xy = (mat[1][0] + mat[0][1]) / (T)4.0; + T xz = (mat[2][0] + mat[0][2]) / (T)4.0; + T yz = (mat[2][1] + mat[1][2]) / (T)4.0; + if ((xx > yy) && (xx > zz)) { + if (xx < epsilon) { + axis.x = (T)0.0; + axis.y = (T)0.7071; + axis.z = (T)0.7071; + } else { + axis.x = sqrt(xx); + axis.y = xy / axis.x; + axis.z = xz / axis.x; + } + } else if (yy > zz) { + if (yy < epsilon) { + axis.x = (T)0.7071; + axis.y = (T)0.0; + axis.z = (T)0.7071; + } else { + axis.y = sqrt(yy); + axis.x = xy / axis.y; + axis.z = yz / axis.y; + } + } else { + if (zz < epsilon) { + axis.x = (T)0.7071; + axis.y = (T)0.7071; + axis.z = (T)0.0; + } else { + axis.z = sqrt(zz); + axis.x = xz / axis.z; + axis.y = yz / axis.z; + } + } + return; + } + T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); + if (glm::abs(s) < T(0.001)) + s = (T)1.0; + angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0); + axis.x = (mat[1][2] - mat[2][1]) / s; + axis.y = (mat[2][0] - mat[0][2]) / s; + axis.z = (mat[0][1] - mat[1][0]) / s; + } - return detail::tmat4x4( - t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0), - t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0), - t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0), - T(0), T(0), T(0), T(1) - ); -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 axisAngleMatrix + ( + detail::tvec3 const & axis, + T const angle + ) + { + T c = cos(angle); + T s = sin(angle); + T t = T(1) - c; + detail::tvec3 n = normalize(axis); -template -GLM_FUNC_QUALIFIER detail::tmat4x4 interpolate( - detail::tmat4x4 const & m1, - detail::tmat4x4 const & m2, - T const delta) -{ - detail::tmat4x4 dltRotation = m2 * transpose(m1); - detail::tvec3 dltAxis; - T dltAngle; - axisAngle(dltRotation, dltAxis, dltAngle); - detail::tmat4x4 out = axisAngleMatrix(dltAxis, dltAngle * delta) * rotationMatrix(m1); - out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); - out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); - out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); - return out; -} + return detail::tmat4x4( + t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0), + t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0), + t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0), + T(0), T(0), T(0), T(1) + ); + } + template + GLM_FUNC_QUALIFIER detail::tmat4x4 interpolate + ( + detail::tmat4x4 const & m1, + detail::tmat4x4 const & m2, + T const delta + ) + { + detail::tmat4x4 dltRotation = m2 * transpose(m1); + detail::tvec3 dltAxis; + T dltAngle; + axisAngle(dltRotation, dltAxis, dltAngle); + detail::tmat4x4 out = axisAngleMatrix(dltAxis, dltAngle * delta) * rotationMatrix(m1); + out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); + out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); + out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); + return out; + } }//namespace glm diff --git a/glm/gtx/matrix_major_storage.hpp b/glm/gtx/matrix_major_storage.hpp index b5d89fa9..165fae88 100644 --- a/glm/gtx/matrix_major_storage.hpp +++ b/glm/gtx/matrix_major_storage.hpp @@ -55,85 +55,85 @@ namespace glm //! From GLM_GTX_matrix_major_storage extension. template detail::tmat2x2 rowMajor2( - const detail::tvec2& v1, - const detail::tvec2& v2); + detail::tvec2 const & v1, + detail::tvec2 const & v2); //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat2x2 rowMajor2( - const detail::tmat2x2& m); + detail::tmat2x2 const & m); //! Build a row major matrix from row vectors. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat3x3 rowMajor3( - const detail::tvec3& v1, - const detail::tvec3& v2, - const detail::tvec3& v3); + detail::tvec3 const & v1, + detail::tvec3 const & v2, + detail::tvec3 const & v3); //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat3x3 rowMajor3( - const detail::tmat3x3& m); + detail::tmat3x3 const & m); //! Build a row major matrix from row vectors. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat4x4 rowMajor4( - const detail::tvec4& v1, - const detail::tvec4& v2, - const detail::tvec4& v3, - const detail::tvec4& v4); + detail::tvec4 const & v1, + detail::tvec4 const & v2, + detail::tvec4 const & v3, + detail::tvec4 const & v4); //! Build a row major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat4x4 rowMajor4( - const detail::tmat4x4& m); + detail::tmat4x4 const & m); //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat2x2 colMajor2( - const detail::tvec2& v1, - const detail::tvec2& v2); + detail::tvec2 const & v1, + detail::tvec2 const & v2); //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat2x2 colMajor2( - const detail::tmat2x2& m); + detail::tmat2x2 const & m); //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat3x3 colMajor3( - const detail::tvec3& v1, - const detail::tvec3& v2, - const detail::tvec3& v3); + detail::tvec3 const & v1, + detail::tvec3 const & v2, + detail::tvec3 const & v3); //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat3x3 colMajor3( - const detail::tmat3x3& m); + detail::tmat3x3 const & m); //! Build a column major matrix from column vectors. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat4x4 colMajor4( - const detail::tvec4& v1, - const detail::tvec4& v2, - const detail::tvec4& v3, - const detail::tvec4& v4); + detail::tvec4 const & v1, + detail::tvec4 const & v2, + detail::tvec4 const & v3, + detail::tvec4 const & v4); //! Build a column major matrix from other matrix. //! From GLM_GTX_matrix_major_storage extension. template detail::tmat4x4 colMajor4( - const detail::tmat4x4& m); + detail::tmat4x4 const & m); /// @} }//namespace glm diff --git a/glm/gtx/matrix_major_storage.inl b/glm/gtx/matrix_major_storage.inl index 3a028de1..eec99855 100644 --- a/glm/gtx/matrix_major_storage.inl +++ b/glm/gtx/matrix_major_storage.inl @@ -7,166 +7,167 @@ // File : glm/gtx/matrix_major_storage.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat2x2 rowMajor2( - const detail::tvec2& v1, - const detail::tvec2& v2) +namespace glm { - detail::tmat2x2 Result; - Result[0][0] = v1.x; - Result[1][0] = v1.y; - Result[0][1] = v2.x; - Result[1][1] = v2.y; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 rowMajor2 + ( + detail::tvec2 const & v1, + detail::tvec2 const & v2 + ) + { + detail::tmat2x2 Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat2x2 rowMajor2( - const detail::tmat2x2& m) -{ - detail::tmat2x2 Result; - Result[0][0] = m[0][0]; - Result[0][1] = m[1][0]; - Result[1][0] = m[0][1]; - Result[1][1] = m[1][1]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 rowMajor2( + const detail::tmat2x2& m) + { + detail::tmat2x2 Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 rowMajor3( - const detail::tvec3& v1, - const detail::tvec3& v2, - const detail::tvec3& v3) -{ - detail::tmat3x3 Result; - Result[0][0] = v1.x; - Result[1][0] = v1.y; - Result[2][0] = v1.z; - Result[0][1] = v2.x; - Result[1][1] = v2.y; - Result[2][1] = v2.z; - Result[0][2] = v3.x; - Result[1][2] = v3.y; - Result[2][2] = v3.z; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 rowMajor3( + const detail::tvec3& v1, + const detail::tvec3& v2, + const detail::tvec3& v3) + { + detail::tmat3x3 Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 rowMajor3( - const detail::tmat3x3& m) -{ - detail::tmat3x3 Result; - Result[0][0] = m[0][0]; - Result[0][1] = m[1][0]; - Result[0][2] = m[2][0]; - Result[1][0] = m[0][1]; - Result[1][1] = m[1][1]; - Result[1][2] = m[2][1]; - Result[2][0] = m[0][2]; - Result[2][1] = m[1][2]; - Result[2][2] = m[2][2]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 rowMajor3( + const detail::tmat3x3& m) + { + detail::tmat3x3 Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 rowMajor4( - const detail::tvec4& v1, - const detail::tvec4& v2, - const detail::tvec4& v3, - const detail::tvec4& v4) -{ - detail::tmat4x4 Result; - Result[0][0] = v1.x; - Result[1][0] = v1.y; - Result[2][0] = v1.z; - Result[3][0] = v1.w; - Result[0][1] = v2.x; - Result[1][1] = v2.y; - Result[2][1] = v2.z; - Result[3][1] = v2.w; - Result[0][2] = v3.x; - Result[1][2] = v3.y; - Result[2][2] = v3.z; - Result[3][2] = v3.w; - Result[0][3] = v4.x; - Result[1][3] = v4.y; - Result[2][3] = v4.z; - Result[3][3] = v4.w; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 rowMajor4( + const detail::tvec4& v1, + const detail::tvec4& v2, + const detail::tvec4& v3, + const detail::tvec4& v4) + { + detail::tmat4x4 Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[3][0] = v1.w; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[3][1] = v2.w; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + Result[3][2] = v3.w; + Result[0][3] = v4.x; + Result[1][3] = v4.y; + Result[2][3] = v4.z; + Result[3][3] = v4.w; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 rowMajor4( - const detail::tmat4x4& m) -{ - detail::tmat4x4 Result; - Result[0][0] = m[0][0]; - Result[0][1] = m[1][0]; - Result[0][2] = m[2][0]; - Result[0][3] = m[3][0]; - Result[1][0] = m[0][1]; - Result[1][1] = m[1][1]; - Result[1][2] = m[2][1]; - Result[1][3] = m[3][1]; - Result[2][0] = m[0][2]; - Result[2][1] = m[1][2]; - Result[2][2] = m[2][2]; - Result[2][3] = m[3][2]; - Result[3][0] = m[0][3]; - Result[3][1] = m[1][3]; - Result[3][2] = m[2][3]; - Result[3][3] = m[3][3]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 rowMajor4( + const detail::tmat4x4& m) + { + detail::tmat4x4 Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat2x2 colMajor2( - const detail::tvec2& v1, - const detail::tvec2& v2) -{ - return detail::tmat2x2(v1, v2); -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 colMajor2( + const detail::tvec2& v1, + const detail::tvec2& v2) + { + return detail::tmat2x2(v1, v2); + } -template -GLM_FUNC_QUALIFIER detail::tmat2x2 colMajor2( - const detail::tmat2x2& m) -{ - return detail::tmat2x2(m); -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 colMajor3( - const detail::tvec3& v1, - const detail::tvec3& v2, - const detail::tvec3& v3) -{ - return detail::tmat3x3(v1, v2, v3); -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 colMajor2( + const detail::tmat2x2& m) + { + return detail::tmat2x2(m); + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 colMajor3( - const detail::tmat3x3& m) -{ - return detail::tmat3x3(m); -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 colMajor3( + const detail::tvec3& v1, + const detail::tvec3& v2, + const detail::tvec3& v3) + { + return detail::tmat3x3(v1, v2, v3); + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 colMajor4( - const detail::tvec4& v1, - const detail::tvec4& v2, - const detail::tvec4& v3, - const detail::tvec4& v4) -{ - return detail::tmat4x4(v1, v2, v3, v4); -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 colMajor3( + const detail::tmat3x3& m) + { + return detail::tmat3x3(m); + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 colMajor4( - const detail::tmat4x4& m) -{ - return detail::tmat4x4(m); -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 colMajor4( + const detail::tvec4& v1, + const detail::tvec4& v2, + const detail::tvec4& v3, + const detail::tvec4& v4) + { + return detail::tmat4x4(v1, v2, v3, v4); + } + template + GLM_FUNC_QUALIFIER detail::tmat4x4 colMajor4( + const detail::tmat4x4& m) + { + return detail::tmat4x4(m); + } }//namespace glm diff --git a/glm/gtx/matrix_operation.inl b/glm/gtx/matrix_operation.inl index 6bd39fb0..04093b0b 100644 --- a/glm/gtx/matrix_operation.inl +++ b/glm/gtx/matrix_operation.inl @@ -7,119 +7,118 @@ // File : glm/gtx/matrix_operation.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat2x2 diagonal2x2 -( - detail::tvec2 const & v -) +namespace glm { - detail::tmat2x2 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 diagonal2x2 + ( + detail::tvec2 const & v + ) + { + detail::tmat2x2 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat2x3 diagonal2x3 -( - detail::tvec2 const & v -) -{ - detail::tmat2x3 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x3 diagonal2x3 + ( + detail::tvec2 const & v + ) + { + detail::tmat2x3 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat2x4 diagonal2x4 -( - detail::tvec2 const & v -) -{ - detail::tmat2x4 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x2 diagonal3x2 -( - detail::tvec2 const & v -) -{ - detail::tmat3x2 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x4 diagonal2x4 + ( + detail::tvec2 const & v + ) + { + detail::tmat2x4 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 diagonal3x3 -( - detail::tvec3 const & v -) -{ - detail::tmat3x3 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - Result[2][2] = v[2]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x2 diagonal3x2 + ( + detail::tvec2 const & v + ) + { + detail::tmat3x2 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x4 diagonal3x4 -( - detail::tvec3 const & v -) -{ - detail::tmat3x4 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - Result[2][2] = v[2]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 diagonal3x3 + ( + detail::tvec3 const & v + ) + { + detail::tmat3x3 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 diagonal4x4 -( - detail::tvec4 const & v -) -{ - detail::tmat4x4 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - Result[2][2] = v[2]; - Result[3][3] = v[3]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x4 diagonal3x4 + ( + detail::tvec3 const & v + ) + { + detail::tmat3x4 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x3 diagonal4x3 -( - detail::tvec3 const & v -) -{ - detail::tmat4x3 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - Result[2][2] = v[2]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 diagonal4x4 + ( + detail::tvec4 const & v + ) + { + detail::tmat4x4 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + Result[3][3] = v[3]; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x2 diagonal4x2 -( - detail::tvec2 const & v -) -{ - detail::tmat4x2 Result(valType(1)); - Result[0][0] = v[0]; - Result[1][1] = v[1]; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x3 diagonal4x3 + ( + detail::tvec3 const & v + ) + { + detail::tmat4x3 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + template + GLM_FUNC_QUALIFIER detail::tmat4x2 diagonal4x2 + ( + detail::tvec2 const & v + ) + { + detail::tmat4x2 Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } }//namespace glm diff --git a/glm/gtx/matrix_query.hpp b/glm/gtx/matrix_query.hpp index 22dbaca7..9fb8eb17 100644 --- a/glm/gtx/matrix_query.hpp +++ b/glm/gtx/matrix_query.hpp @@ -56,57 +56,57 @@ namespace glm //! From GLM_GTX_matrix_query extension. template bool isNull( - const detail::tmat2x2& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat2x2 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix a null matrix. //! From GLM_GTX_matrix_query extension. template bool isNull( - const detail::tmat3x3& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat3x3 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix a null matrix. //! From GLM_GTX_matrix_query extension. template bool isNull( - const detail::tmat4x4& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat4x4 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix an identity matrix. //! From GLM_GTX_matrix_query extension. template bool isIdentity( - const genType& m, - const typename genType::value_type epsilon = std::numeric_limits::epsilon()); + genType const & m, + typename genType::value_type const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix a normalized matrix. //! From GLM_GTX_matrix_query extension. template bool isNormalized( - const detail::tmat2x2& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat2x2 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix a normalized matrix. //! From GLM_GTX_matrix_query extension. template bool isNormalized( - const detail::tmat3x3& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat3x3 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix a normalized matrix. //! From GLM_GTX_matrix_query extension. template bool isNormalized( - const detail::tmat4x4& m, - const T epsilon = std::numeric_limits::epsilon()); + detail::tmat4x4 const & m, + T const & epsilon = std::numeric_limits::epsilon()); //! Return if a matrix an orthonormalized matrix. //! From GLM_GTX_matrix_query extension. template bool isOrthogonal( - const genType& m, - const typename genType::value_type epsilon = std::numeric_limits::epsilon()); + genType const & m, + typename genType::value_type const & epsilon = std::numeric_limits::epsilon()); /// @} }//namespace glm diff --git a/glm/gtx/matrix_query.inl b/glm/gtx/matrix_query.inl index 14762949..7b4033ca 100644 --- a/glm/gtx/matrix_query.inl +++ b/glm/gtx/matrix_query.inl @@ -10,131 +10,145 @@ // - GLM core /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER bool isNull( - const detail::tmat2x2& m, - const T epsilon) -{ - bool result = true; - for(int i = 0; result && i < 2 ; ++i) - result = isNull(m[i], epsilon); - return result; -} - -template -GLM_FUNC_QUALIFIER bool isNull( - const detail::tmat3x3& m, - const T epsilon) -{ - bool result = true; - for(int i = 0; result && i < 3 ; ++i) - result = isNull(m[i], epsilon); - return result; -} - -template -GLM_FUNC_QUALIFIER bool isNull( - const detail::tmat4x4& m, - const T epsilon) +namespace glm { - bool result = true; - for(int i = 0; result && i < 4 ; ++i) - result = isNull(m[i], epsilon); - return result; -} + template + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat2x2 const & m, + T const & epsilon) + { + bool result = true; + for(int i = 0; result && i < 2 ; ++i) + result = isNull(m[i], epsilon); + return result; + } -template -GLM_FUNC_QUALIFIER bool isIdentity( - const genType& m, - const typename genType::value_type epsilon) -{ - bool result = true; - for(typename genType::value_type i = typename genType::value_type(0); result && i < genType::col_size(); ++i) + template + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat3x3 const & m, + T const & epsilon + ) { - for(typename genType::value_type j = typename genType::value_type(0); result && j < i ; ++j) - result = abs(m[i][j]) <= epsilon; - if(result) - result = abs(m[i][i] - typename genType::value_type(1)) <= epsilon; - for(typename genType::value_type j = i + typename genType::value_type(1); result && j < genType::row_size(); ++j) - result = abs(m[i][j]) <= epsilon; + bool result = true; + for(int i = 0; result && i < 3 ; ++i) + result = isNull(m[i], epsilon); + return result; } - return result; -} -template -GLM_FUNC_QUALIFIER bool isNormalized( - const detail::tmat2x2& m, - const T epsilon) -{ - bool result = true; - for(int i = 0; result && i < 2; ++i) - result = isNormalized(m[i], epsilon); - for(int i = 0; result && i < 2; ++i) + template + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat4x4 const & m, + T const & epsilon + ) { - detail::tvec2 v; - for(int j = 0; j < 2; ++j) - v[j] = m[j][i]; - result = isNormalized(v, epsilon); + bool result = true; + for(int i = 0; result && i < 4 ; ++i) + result = isNull(m[i], epsilon); + return result; } - return result; -} -template -GLM_FUNC_QUALIFIER bool isNormalized( - const detail::tmat3x3& m, - const T epsilon) -{ - bool result = true; - for(int i = 0; result && i < 3; ++i) - result = isNormalized(m[i], epsilon); - for(int i = 0; result && i < 3; ++i) + template + GLM_FUNC_QUALIFIER bool isIdentity + ( + genType const & m, + typename genType::value_type const & epsilon + ) { - detail::tvec3 v; - for(int j = 0; j < 3; ++j) - v[j] = m[j][i]; - result = isNormalized(v, epsilon); + bool result = true; + for(typename genType::value_type i = typename genType::value_type(0); result && i < genType::col_size(); ++i) + { + for(typename genType::value_type j = typename genType::value_type(0); result && j < i ; ++j) + result = abs(m[i][j]) <= epsilon; + if(result) + result = abs(m[i][i] - typename genType::value_type(1)) <= epsilon; + for(typename genType::value_type j = i + typename genType::value_type(1); result && j < genType::row_size(); ++j) + result = abs(m[i][j]) <= epsilon; + } + return result; } - return result; -} -template -GLM_FUNC_QUALIFIER bool isNormalized( - const detail::tmat4x4& m, - const T epsilon) -{ - bool result = true; - for(int i = 0; result && i < 4; ++i) - result = isNormalized(m[i], epsilon); - for(int i = 0; result && i < 4; ++i) + template + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat2x2 const & m, + T const & epsilon + ) { - detail::tvec4 v; - for(int j = 0; j < 4; ++j) - v[j] = m[j][i]; - result = isNormalized(v, epsilon); + bool result = true; + for(int i = 0; result && i < 2; ++i) + result = isNormalized(m[i], epsilon); + for(int i = 0; result && i < 2; ++i) + { + detail::tvec2 v; + for(int j = 0; j < 2; ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; } - return result; -} -template -GLM_FUNC_QUALIFIER bool isOrthogonal( - const genType& m, - const typename genType::value_type epsilon) -{ - bool result = true; - for(int i = 0; result && i < genType::col_size() - 1; ++i) - for(int j= i + 1; result && j < genType::col_size(); ++j) - result = areOrthogonal(m[i], m[j], epsilon); + template + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat3x3 const & m, + T const & epsilon + ) + { + bool result = true; + for(int i = 0; result && i < 3; ++i) + result = isNormalized(m[i], epsilon); + for(int i = 0; result && i < 3; ++i) + { + detail::tvec3 v; + for(int j = 0; j < 3; ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } - if(result) + template + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat4x4 const & m, + T const & epsilon + ) { - genType tmp = transpose(m); - for(int i = 0; result && i < genType::col_size() - 1 ; ++i) - for(int j = i + 1; result && j < genType::col_size(); ++j) - result = areOrthogonal(tmp[i], tmp[j], epsilon); + bool result = true; + for(int i = 0; result && i < 4; ++i) + result = isNormalized(m[i], epsilon); + for(int i = 0; result && i < 4; ++i) + { + detail::tvec4 v; + for(int j = 0; j < 4; ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; } - return result; -} + template + GLM_FUNC_QUALIFIER bool isOrthogonal + ( + genType const & m, + typename genType::value_type const & epsilon + ) + { + bool result = true; + for(int i = 0; result && i < genType::col_size() - 1; ++i) + for(int j= i + 1; result && j < genType::col_size(); ++j) + result = areOrthogonal(m[i], m[j], epsilon); + + if(result) + { + genType tmp = transpose(m); + for(int i = 0; result && i < genType::col_size() - 1 ; ++i) + for(int j = i + 1; result && j < genType::col_size(); ++j) + result = areOrthogonal(tmp[i], tmp[j], epsilon); + } + return result; + } }//namespace glm diff --git a/glm/gtx/mixed_product.inl b/glm/gtx/mixed_product.inl index 1129f597..c6bb200d 100644 --- a/glm/gtx/mixed_product.inl +++ b/glm/gtx/mixed_product.inl @@ -7,15 +7,16 @@ // File : glm/gtx/mixed_product.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER valType mixedProduct( - detail::tvec3 const & v1, - detail::tvec3 const & v2, - detail::tvec3 const & v3) +namespace glm { - return dot(cross(v1, v2), v3); -} - + template + GLM_FUNC_QUALIFIER valType mixedProduct + ( + detail::tvec3 const & v1, + detail::tvec3 const & v2, + detail::tvec3 const & v3 + ) + { + return dot(cross(v1, v2), v3); + } }//namespace glm diff --git a/glm/gtx/multiple.inl b/glm/gtx/multiple.inl index e7078528..f1b391b6 100644 --- a/glm/gtx/multiple.inl +++ b/glm/gtx/multiple.inl @@ -10,184 +10,111 @@ // - GLM core /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ +#include "../core/_vectorize.hpp" -////////////////////// -// higherMultiple - -template -GLM_FUNC_QUALIFIER genType higherMultiple -( - genType const & Source, - genType const & Multiple -) -{ - genType Tmp = Source % Multiple; - return Tmp ? Source + Multiple - Tmp : Source; -} - -template <> -GLM_FUNC_QUALIFIER detail::thalf higherMultiple -( - detail::thalf const & SourceH, - detail::thalf const & MultipleH -) -{ - float Source = SourceH.toFloat(); - float Multiple = MultipleH.toFloat(); - - int Tmp = int(float(Source)) % int(Multiple); - return detail::thalf(Tmp ? Source + Multiple - float(Tmp) : Source); -} - -template <> -GLM_FUNC_QUALIFIER float higherMultiple -( - float const & Source, - float const & Multiple -) -{ - int Tmp = int(Source) % int(Multiple); - return Tmp ? Source + Multiple - float(Tmp) : Source; -} - -template <> -GLM_FUNC_QUALIFIER double higherMultiple -( - double const & Source, - double const & Multiple -) +namespace glm { - long Tmp = long(Source) % long(Multiple); - return Tmp ? Source + Multiple - double(Tmp) : Source; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 higherMultiple -( - detail::tvec2 const & Source, - detail::tvec2 const & Multiple -) -{ - detail::tvec2 Result; - for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) - Result[i] = higherMultiple(Source[i], Multiple[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 higherMultiple -( - detail::tvec3 const & Source, - detail::tvec3 const & Multiple -) -{ - detail::tvec3 Result; - for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) - Result[i] = higherMultiple(Source[i], Multiple[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 higherMultiple -( - detail::tvec4 const & Source, - detail::tvec4 const & Multiple -) -{ - detail::tvec4 Result; - for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) - Result[i] = higherMultiple(Source[i], Multiple[i]); - return Result; -} - -////////////////////// -// lowerMultiple - -template -GLM_FUNC_QUALIFIER genType lowerMultiple -( - genType const & Source, - genType const & Multiple -) -{ - genType Tmp = Source % Multiple; - return Tmp ? Source - Tmp : Source; -} - -template <> -GLM_FUNC_QUALIFIER detail::thalf lowerMultiple -( - detail::thalf const & SourceH, - detail::thalf const & MultipleH -) -{ - float Source = SourceH.toFloat(); - float Multiple = MultipleH.toFloat(); - - int Tmp = int(float(Source)) % int(float(Multiple)); - return detail::thalf(Tmp ? Source - float(Tmp) : Source); -} - -template <> -GLM_FUNC_QUALIFIER float lowerMultiple -( - float const & Source, - float const & Multiple -) -{ - int Tmp = int(Source) % int(Multiple); - return Tmp ? Source - float(Tmp) : Source; -} - -template <> -GLM_FUNC_QUALIFIER double lowerMultiple -( - double const & Source, - double const & Multiple -) -{ - long Tmp = long(Source) % long(Multiple); - return Tmp ? Source - double(Tmp) : Source; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 lowerMultiple -( - detail::tvec2 const & Source, - detail::tvec2 const & Multiple -) -{ - detail::tvec2 Result; - for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) - Result[i] = lowerMultiple(Source[i], Multiple[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 lowerMultiple -( - detail::tvec3 const & Source, - detail::tvec3 const & Multiple -) -{ - detail::tvec3 Result; - for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) - Result[i] = lowerMultiple(Source[i], Multiple[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 lowerMultiple -( - detail::tvec4 const & Source, - detail::tvec4 const & Multiple -) -{ - detail::tvec4 Result; - for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) - Result[i] = lowerMultiple(Source[i], Multiple[i]); - return Result; -} - + ////////////////////// + // higherMultiple + + template + GLM_FUNC_QUALIFIER genType higherMultiple + ( + genType const & Source, + genType const & Multiple + ) + { + genType Tmp = Source % Multiple; + return Tmp ? Source + Multiple - Tmp : Source; + } + + template <> + GLM_FUNC_QUALIFIER detail::thalf higherMultiple + ( + detail::thalf const & SourceH, + detail::thalf const & MultipleH + ) + { + float Source = SourceH.toFloat(); + float Multiple = MultipleH.toFloat(); + + int Tmp = int(float(Source)) % int(Multiple); + return detail::thalf(Tmp ? Source + Multiple - float(Tmp) : Source); + } + + template <> + GLM_FUNC_QUALIFIER float higherMultiple + ( + float const & Source, + float const & Multiple + ) + { + int Tmp = int(Source) % int(Multiple); + return Tmp ? Source + Multiple - float(Tmp) : Source; + } + + template <> + GLM_FUNC_QUALIFIER double higherMultiple + ( + double const & Source, + double const & Multiple + ) + { + long Tmp = long(Source) % long(Multiple); + return Tmp ? Source + Multiple - double(Tmp) : Source; + } + + VECTORIZE_VEC_VEC(higherMultiple) + + ////////////////////// + // lowerMultiple + + template + GLM_FUNC_QUALIFIER genType lowerMultiple + ( + genType const & Source, + genType const & Multiple + ) + { + genType Tmp = Source % Multiple; + return Tmp ? Source - Tmp : Source; + } + + template <> + GLM_FUNC_QUALIFIER detail::thalf lowerMultiple + ( + detail::thalf const & SourceH, + detail::thalf const & MultipleH + ) + { + float Source = SourceH.toFloat(); + float Multiple = MultipleH.toFloat(); + + int Tmp = int(float(Source)) % int(float(Multiple)); + return detail::thalf(Tmp ? Source - float(Tmp) : Source); + } + + template <> + GLM_FUNC_QUALIFIER float lowerMultiple + ( + float const & Source, + float const & Multiple + ) + { + int Tmp = int(Source) % int(Multiple); + return Tmp ? Source - float(Tmp) : Source; + } + + template <> + GLM_FUNC_QUALIFIER double lowerMultiple + ( + double const & Source, + double const & Multiple + ) + { + long Tmp = long(Source) % long(Multiple); + return Tmp ? Source - double(Tmp) : Source; + } + + VECTORIZE_VEC_VEC(lowerMultiple) }//namespace glm diff --git a/glm/gtx/norm.hpp b/glm/gtx/norm.hpp index c1a98e6d..a96aa90b 100644 --- a/glm/gtx/norm.hpp +++ b/glm/gtx/norm.hpp @@ -56,99 +56,73 @@ namespace glm //! From GLM_GTX_norm extension. template T length2( - const T x); + T const & x); //! Returns the squared length of x. //! From GLM_GTX_norm extension. - template - T length2( - const detail::tvec2 & x); - - //! Returns the squared length of x. - //! From GLM_GTX_norm extension. - template - T length2( - const detail::tvec3& x); - - //! Returns the squared length of x. - //! From GLM_GTX_norm extension. - template - T length2( - const detail::tvec4& x); + template + typename genType::value_type length2( + genType const & x); //! Returns the squared length of x. //! From GLM_GTX_norm extension. template T length2( - const detail::tquat& q); + detail::tquat const & q); //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). //! From GLM_GTX_norm extension. template T distance2( - const T p0, - const T p1); + T const & p0, + T const & p1); //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). //! From GLM_GTX_norm extension. - template - T distance2( - const detail::tvec2& p0, - const detail::tvec2& p1); - - //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). - //! From GLM_GTX_norm extension. - template - T distance2( - const detail::tvec3& p0, - const detail::tvec3& p1); - - //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). - //! From GLM_GTX_norm extension. - template - T distance2( - const detail::tvec4& p0, - const detail::tvec4& p1); + template + typename genType::value_type distance2( + genType const & p0, + genType const & p1); //! Returns the L1 norm between x and y. //! From GLM_GTX_norm extension. template T l1Norm( - const detail::tvec3& x, - const detail::tvec3& y); + detail::tvec3 const & x, + detail::tvec3 const & y); //! Returns the L1 norm of v. //! From GLM_GTX_norm extension. template T l1Norm( - const detail::tvec3& v); + detail::tvec3 const & v); //! Returns the L2 norm between x and y. //! From GLM_GTX_norm extension. template T l2Norm( - const detail::tvec3& x, - const detail::tvec3& y); + detail::tvec3 const & x, + detail::tvec3 const & y); //! Returns the L2 norm of v. //! From GLM_GTX_norm extension. template T l2Norm( - const detail::tvec3& x); + detail::tvec3 const & x); //! Returns the L norm between x and y. //! From GLM_GTX_norm extension. template T lxNorm( - const detail::tvec3& x, - const detail::tvec3& y, + detail::tvec3 const & x, + detail::tvec3 const & y, unsigned int Depth); //! Returns the L norm of v. //! From GLM_GTX_norm extension. template T lxNorm( - const detail::tvec3& x, + detail::tvec3 const & x, unsigned int Depth); /// @} diff --git a/glm/gtx/norm.inl b/glm/gtx/norm.inl index 356a758a..92d12fcd 100644 --- a/glm/gtx/norm.inl +++ b/glm/gtx/norm.inl @@ -7,120 +7,150 @@ // File : glm/gtx/norm.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER T length2( - const T x) -{ - return x * x; -} - -template -GLM_FUNC_QUALIFIER T length2( - const detail::tvec2& x) -{ - return dot(x, x); -} - -template -GLM_FUNC_QUALIFIER T length2( - const detail::tvec3& x) -{ - return dot(x, x); -} - -template -GLM_FUNC_QUALIFIER T length2( - const detail::tvec4& x) -{ - return dot(x, x); -} - -template -GLM_FUNC_QUALIFIER T length2( - const detail::tquat& q) -{ - return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; -} - -template -T distance2( - const T p0, - const T p1) -{ - return length2(p1 - p0); -} - -template -T distance2( - const detail::tvec2& p0, - const detail::tvec2& p1) -{ - return length2(p1 - p0); -} - -template -T distance2( - const detail::tvec3& p0, - const detail::tvec3& p1) -{ - return length2(p1 - p0); -} - -template -T distance2( - const detail::tvec4& p0, - const detail::tvec4& p1) -{ - return length2(p1 - p0); -} - -template -GLM_FUNC_QUALIFIER T l1Norm( - const detail::tvec3& a, - const detail::tvec3& b) -{ - return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); -} - -template -GLM_FUNC_QUALIFIER T l1Norm( - const detail::tvec3& v) -{ - return abs(v.x) + abs(v.y) + abs(v.z); -} - -template -GLM_FUNC_QUALIFIER T l2Norm( - const detail::tvec3& a, - const detail::tvec3& b) -{ - return length(b - a); -} - -template -GLM_FUNC_QUALIFIER T l2Norm( - const detail::tvec3& v) -{ - return length(v); -} - -template -GLM_FUNC_QUALIFIER T lxNorm( - const detail::tvec3& x, - const detail::tvec3& y, - unsigned int Depth) -{ - return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth)); -} - -template -GLM_FUNC_QUALIFIER T lxNorm( - const detail::tvec3& v, - unsigned int Depth) +namespace glm { - return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth)); -} + template + GLM_FUNC_QUALIFIER T length2 + ( + T const & x + ) + { + return x * x; + } + + template + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec2 const & x + ) + { + return dot(x, x); + } + + template + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec3 const & x + ) + { + return dot(x, x); + } + + template + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec4 const & x + ) + { + return dot(x, x); + } + + template + GLM_FUNC_QUALIFIER T length2 + ( + detail::tquat const & q + ) + { + return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + } + + template + GLM_FUNC_QUALIFIER T distance2 + ( + T const & p0, + T const & p1 + ) + { + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec2 const & p0, + detail::tvec2 const & p1 + ) + { + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec3 const & p0, + detail::tvec3 const & p1 + ) + { + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec4 const & p0, + detail::tvec4 const & p1 + ) + { + return length2(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER T l1Norm + ( + detail::tvec3 const & a, + detail::tvec3 const & b + ) + { + return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); + } + + template + GLM_FUNC_QUALIFIER T l1Norm + ( + detail::tvec3 const & v + ) + { + return abs(v.x) + abs(v.y) + abs(v.z); + } + + template + GLM_FUNC_QUALIFIER T l2Norm + ( + detail::tvec3 const & a, + detail::tvec3 const & b + ) + { + return length(b - a); + } + + template + GLM_FUNC_QUALIFIER T l2Norm + ( + detail::tvec3 const & v + ) + { + return length(v); + } + + template + GLM_FUNC_QUALIFIER T lxNorm + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + unsigned int Depth + ) + { + return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth)); + } + + template + GLM_FUNC_QUALIFIER T lxNorm + ( + detail::tvec3 const & v, + unsigned int Depth + ) + { + return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth)); + } }//namespace glm diff --git a/glm/gtx/normal.inl b/glm/gtx/normal.inl index 1aa7b8c3..6d002cb6 100644 --- a/glm/gtx/normal.inl +++ b/glm/gtx/normal.inl @@ -7,17 +7,16 @@ // File : glm/gtx/normal.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec3 triangleNormal -( - detail::tvec3 const & p1, - detail::tvec3 const & p2, - detail::tvec3 const & p3 -) +namespace glm { - return normalize(cross(p1 - p2, p1 - p3)); -} - + template + GLM_FUNC_QUALIFIER detail::tvec3 triangleNormal + ( + detail::tvec3 const & p1, + detail::tvec3 const & p2, + detail::tvec3 const & p3 + ) + { + return normalize(cross(p1 - p2, p1 - p3)); + } }//namespace glm diff --git a/glm/gtx/normalize_dot.inl b/glm/gtx/normalize_dot.inl index c086fb26..5d73b025 100644 --- a/glm/gtx/normalize_dot.inl +++ b/glm/gtx/normalize_dot.inl @@ -7,110 +7,109 @@ // File : glm/gtx/normalize_dot.inl ////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER genType normalizeDot -( - genType const & x, - genType const & y -) +namespace glm { - return - glm::dot(x, y) * - glm::inversesqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER genType normalizeDot + ( + genType const & x, + genType const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER valType normalizeDot -( - detail::tvec2 const & x, - detail::tvec2 const & y -) -{ - return - glm::dot(x, y) * - glm::inversesqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER valType normalizeDot -( - detail::tvec3 const & x, - detail::tvec3 const & y -) -{ - return - glm::dot(x, y) * - glm::inversesqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER valType normalizeDot -( - detail::tvec4 const & x, - detail::tvec4 const & y -) -{ - return - glm::dot(x, y) * - glm::inversesqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER genType fastNormalizeDot -( - genType const & x, - genType const & y -) -{ - return - glm::dot(x, y) * - fastInverseSqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER genType fastNormalizeDot + ( + genType const & x, + genType const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER valType fastNormalizeDot -( - detail::tvec2 const & x, - detail::tvec2 const & y -) -{ - return - glm::dot(x, y) * - fastInverseSqrt(glm::dot(x, x) * - glm::dot(y, y)); -} - -template -GLM_FUNC_QUALIFIER valType fastNormalizeDot -( - detail::tvec3 const & x, - detail::tvec3 const & y -) -{ - return - glm::dot(x, y) * - fastInverseSqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } -template -GLM_FUNC_QUALIFIER valType fastNormalizeDot -( - detail::tvec4 const & x, - detail::tvec4 const & y -) -{ - return - glm::dot(x, y) * - fastInverseSqrt(glm::dot(x, x) * - glm::dot(y, y)); -} + template + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + template + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } }//namespace glm diff --git a/glm/gtx/optimum_pow.inl b/glm/gtx/optimum_pow.inl index 7faa6240..91ab0928 100644 --- a/glm/gtx/optimum_pow.inl +++ b/glm/gtx/optimum_pow.inl @@ -7,53 +7,52 @@ // File : glm/gtx/optimum_pow.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER genType pow2(const genType& x) -{ - return x * x; -} - -template -GLM_FUNC_QUALIFIER genType pow3(const genType& x) -{ - return x * x * x; -} - -template -GLM_FUNC_QUALIFIER genType pow4(const genType& x) -{ - return x * x * x * x; -} - -GLM_FUNC_QUALIFIER bool powOfTwo(int x) +namespace glm { - return !(x & (x - 1)); -} - -GLM_FUNC_QUALIFIER detail::tvec2 powOfTwo(const detail::tvec2& x) -{ - return detail::tvec2( - powOfTwo(x.x), - powOfTwo(x.y)); -} - -GLM_FUNC_QUALIFIER detail::tvec3 powOfTwo(const detail::tvec3& x) -{ - return detail::tvec3( - powOfTwo(x.x), - powOfTwo(x.y), - powOfTwo(x.z)); -} - -GLM_FUNC_QUALIFIER detail::tvec4 powOfTwo(const detail::tvec4& x) -{ - return detail::tvec4( - powOfTwo(x.x), - powOfTwo(x.y), - powOfTwo(x.z), - powOfTwo(x.w)); -} - + template + GLM_FUNC_QUALIFIER genType pow2(const genType& x) + { + return x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow3(const genType& x) + { + return x * x * x; + } + + template + GLM_FUNC_QUALIFIER genType pow4(const genType& x) + { + return x * x * x * x; + } + + GLM_FUNC_QUALIFIER bool powOfTwo(int x) + { + return !(x & (x - 1)); + } + + GLM_FUNC_QUALIFIER detail::tvec2 powOfTwo(const detail::tvec2& x) + { + return detail::tvec2( + powOfTwo(x.x), + powOfTwo(x.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3 powOfTwo(const detail::tvec3& x) + { + return detail::tvec3( + powOfTwo(x.x), + powOfTwo(x.y), + powOfTwo(x.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4 powOfTwo(const detail::tvec4& x) + { + return detail::tvec4( + powOfTwo(x.x), + powOfTwo(x.y), + powOfTwo(x.z), + powOfTwo(x.w)); + } }//namespace glm diff --git a/glm/gtx/orthonormalize.inl b/glm/gtx/orthonormalize.inl index f041fe3a..008e2d80 100644 --- a/glm/gtx/orthonormalize.inl +++ b/glm/gtx/orthonormalize.inl @@ -7,38 +7,37 @@ // File : glm/gtx/orthonormalize.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 orthonormalize -( - const detail::tmat3x3& m -) -{ - detail::tmat3x3 r = m; - - r[0] = normalize(r[0]); - - float d0 = dot(r[0], r[1]); - r[1] -= r[0] * d0; - r[1] = normalize(r[1]); - - float d1 = dot(r[1], r[2]); - d0 = dot(r[0], r[2]); - r[2] -= r[0] * d0 + r[1] * d1; - r[2] = normalize(r[2]); - - return r; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 orthonormalize -( - const detail::tvec3& x, - const detail::tvec3& y -) +namespace glm { - return normalize(x - y * dot(y, x)); -} - + template + GLM_FUNC_QUALIFIER detail::tmat3x3 orthonormalize + ( + const detail::tmat3x3& m + ) + { + detail::tmat3x3 r = m; + + r[0] = normalize(r[0]); + + float d0 = dot(r[0], r[1]); + r[1] -= r[0] * d0; + r[1] = normalize(r[1]); + + float d1 = dot(r[1], r[2]); + d0 = dot(r[0], r[2]); + r[2] -= r[0] * d0 + r[1] * d1; + r[2] = normalize(r[2]); + + return r; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 orthonormalize + ( + const detail::tvec3& x, + const detail::tvec3& y + ) + { + return normalize(x - y * dot(y, x)); + } }//namespace glm diff --git a/glm/gtx/perpendicular.hpp b/glm/gtx/perpendicular.hpp index 82a98a9d..cef3ae2a 100644 --- a/glm/gtx/perpendicular.hpp +++ b/glm/gtx/perpendicular.hpp @@ -54,24 +54,10 @@ namespace glm //! Projects x a perpendicular axis of Normal. //! From GLM_GTX_perpendicular extension. - template - detail::tvec2 perp( - detail::tvec2 const & x, - detail::tvec2 const & Normal); - - //! Projects x a perpendicular axis of Normal. - //! From GLM_GTX_perpendicular extension. - template - detail::tvec3 perp( - detail::tvec3 const & x, - detail::tvec3 const & Normal); - - //! Projects x a perpendicular axis of Normal. - //! From GLM_GTX_perpendicular extension. - template - detail::tvec4 perp( - detail::tvec4 const & x, - detail::tvec4 const & Normal); + template + vecType perp( + vecType const & x, + vecType const & Normal); /// @} }//namespace glm diff --git a/glm/gtx/perpendicular.inl b/glm/gtx/perpendicular.inl index 4edff2ed..cae91bcb 100644 --- a/glm/gtx/perpendicular.inl +++ b/glm/gtx/perpendicular.inl @@ -7,30 +7,15 @@ // File : glm/gtx/perpendicular.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec2 perp( - detail::tvec2 const & x, - detail::tvec2 const & Normal) -{ - return x - proj(x, Normal); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 perp( - detail::tvec3 const & x, - detail::tvec3 const & Normal) +namespace glm { - return x - proj(x, Normal); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 perp( - detail::tvec4 const & x, - detail::tvec4 const & Normal) -{ - return x - proj(x, Normal); -} - + template + GLM_FUNC_QUALIFIER vecType perp + ( + vecType const & x, + vecType const & Normal + ) + { + return x - proj(x, Normal); + } }//namespace glm diff --git a/glm/gtx/polar_coordinates.hpp b/glm/gtx/polar_coordinates.hpp index 4e0c931b..2fbae567 100644 --- a/glm/gtx/polar_coordinates.hpp +++ b/glm/gtx/polar_coordinates.hpp @@ -53,12 +53,14 @@ namespace glm //! Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude. //! From GLM_GTX_polar_coordinates extension. template - detail::tvec3 polar(const detail::tvec3& euclidean); + detail::tvec3 polar( + detail::tvec3 const & euclidean); //! Convert Polar to Euclidean coordinates. //! From GLM_GTX_polar_coordinates extension. template - detail::tvec3 euclidean(const detail::tvec3& polar); + detail::tvec3 euclidean( + detail::tvec3 const & polar); /// @} }//namespace glm diff --git a/glm/gtx/polar_coordinates.inl b/glm/gtx/polar_coordinates.inl index f75609ec..360c0356 100644 --- a/glm/gtx/polar_coordinates.inl +++ b/glm/gtx/polar_coordinates.inl @@ -10,8 +10,10 @@ namespace glm { template - GLM_FUNC_QUALIFIER detail::tvec3 polar( - const detail::tvec3& euclidean) + GLM_FUNC_QUALIFIER detail::tvec3 polar + ( + detail::tvec3 const & euclidean + ) { T length = length(euclidean); detail::tvec3 tmp = euclidean / length; @@ -24,8 +26,10 @@ namespace glm } template - GLM_FUNC_QUALIFIER detail::tvec3 euclidean( - const detail::tvec3& polar) + GLM_FUNC_QUALIFIER detail::tvec3 euclidean + ( + detail::tvec3 const & polar + ) { T latitude = radians(polar.x); T longitude = radians(polar.y); diff --git a/glm/gtx/projection.hpp b/glm/gtx/projection.hpp index 017ab7a6..177b60d9 100644 --- a/glm/gtx/projection.hpp +++ b/glm/gtx/projection.hpp @@ -52,24 +52,10 @@ namespace glm //! Projects x on Normal. //! From GLM_GTX_projection extension. - template - detail::tvec2 proj( - detail::tvec2 const & x, - detail::tvec2 const & Normal); - - //! Projects x on Normal. - //! From GLM_GTX_projection extension. - template - detail::tvec3 proj( - detail::tvec3 const & x, - detail::tvec3 const & Normal); - - //! Projects x on Normal. - //! From GLM_GTX_projection extension. - template - detail::tvec4 proj( - detail::tvec4 const & x, - detail::tvec4 const & Normal); + template + vecType proj( + vecType const & x, + vecType const & Normal); /// @} }//namespace glm diff --git a/glm/gtx/projection.inl b/glm/gtx/projection.inl index 72c7128f..c8dbe77b 100644 --- a/glm/gtx/projection.inl +++ b/glm/gtx/projection.inl @@ -7,30 +7,15 @@ // File : glm/gtx/projection.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec2 proj( - detail::tvec2 const & x, - detail::tvec2 const & Normal) -{ - return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 proj( - detail::tvec3 const & x, - detail::tvec3 const & Normal) +namespace glm { - return dot(x, Normal) / glm::dot(Normal, Normal) * Normal; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 proj( - detail::tvec4 const & x, - detail::tvec4 const & Normal) -{ - return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; -} - + template + GLM_FUNC_QUALIFIER vecType proj + ( + vecType const & x, + vecType const & Normal + ) + { + return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; + } }//namespace glm diff --git a/glm/gtx/quaternion.inl b/glm/gtx/quaternion.inl index e25ada4d..ce7f932b 100644 --- a/glm/gtx/quaternion.inl +++ b/glm/gtx/quaternion.inl @@ -9,291 +9,290 @@ #include -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec3 cross -( - detail::tvec3 const & v, - detail::tquat const & q -) +namespace glm { - return inverse(q) * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 cross + ( + detail::tvec3 const & v, + detail::tquat const & q + ) + { + return inverse(q) * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 cross -( - detail::tquat const & q, - detail::tvec3 const & v -) -{ - return q * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 cross + ( + detail::tquat const & q, + detail::tvec3 const & v + ) + { + return q * v; + } -template -GLM_FUNC_QUALIFIER detail::tquat squad -( - detail::tquat const & q1, - detail::tquat const & q2, - detail::tquat const & s1, - detail::tquat const & s2, - T const & h) -{ - return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * h (T(1) - h)); -} + template + GLM_FUNC_QUALIFIER detail::tquat squad + ( + detail::tquat const & q1, + detail::tquat const & q2, + detail::tquat const & s1, + detail::tquat const & s2, + T const & h) + { + return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * h (T(1) - h)); + } -template -GLM_FUNC_QUALIFIER detail::tquat intermediate -( - detail::tquat const & prev, - detail::tquat const & curr, - detail::tquat const & next -) -{ - detail::tquat invQuat = inverse(curr); - return ext((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr; -} + template + GLM_FUNC_QUALIFIER detail::tquat intermediate + ( + detail::tquat const & prev, + detail::tquat const & curr, + detail::tquat const & next + ) + { + detail::tquat invQuat = inverse(curr); + return ext((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr; + } -template -GLM_FUNC_QUALIFIER detail::tquat exp -( - detail::tquat const & q, - T const & exponent -) -{ - detail::tvec3 u(q.x, q.y, q.z); - float a = glm::length(u); - detail::tvec3 v(u / a); - return detail::tquat(cos(a), sin(a) * v); -} + template + GLM_FUNC_QUALIFIER detail::tquat exp + ( + detail::tquat const & q, + T const & exponent + ) + { + detail::tvec3 u(q.x, q.y, q.z); + float a = glm::length(u); + detail::tvec3 v(u / a); + return detail::tquat(cos(a), sin(a) * v); + } -template -GLM_FUNC_QUALIFIER detail::tquat log -( - detail::tquat const & q -) -{ - if((q.x == T(0)) && (q.y == T(0)) && (q.z == T(0))) - { - if(q.w > T(0)) - return detail::tquat(log(q.w), T(0), T(0), T(0)); - else if(q.w < T(0)) - return detail::tquat(log(-q.w), T(3.1415926535897932384626433832795), T(0),T(0)); - else - return detail::tquat(std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()); - } - else - { - T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z); - T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w); - T t = atan(Vec3Len, T(q.w)) / Vec3Len; - return detail::tquat(t * q.x, t * q.y, t * q.z, log(QuatLen)); - } -} + template + GLM_FUNC_QUALIFIER detail::tquat log + ( + detail::tquat const & q + ) + { + if((q.x == T(0)) && (q.y == T(0)) && (q.z == T(0))) + { + if(q.w > T(0)) + return detail::tquat(log(q.w), T(0), T(0), T(0)); + else if(q.w < T(0)) + return detail::tquat(log(-q.w), T(3.1415926535897932384626433832795), T(0),T(0)); + else + return detail::tquat(std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()); + } + else + { + T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z); + T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w); + T t = atan(Vec3Len, T(q.w)) / Vec3Len; + return detail::tquat(t * q.x, t * q.y, t * q.z, log(QuatLen)); + } + } -template -GLM_FUNC_QUALIFIER detail::tquat pow -( - detail::tquat const & x, - T const & y -) -{ - if(abs(x.w) > T(0.9999)) - return x; - float Angle = acos(y); - float NewAngle = Angle * y; - float Div = sin(NewAngle) / sin(Angle); - return detail::tquat( - cos(NewAngle), - x.x * Div, - x.y * Div, - x.z * Div); -} + template + GLM_FUNC_QUALIFIER detail::tquat pow + ( + detail::tquat const & x, + T const & y + ) + { + if(abs(x.w) > T(0.9999)) + return x; + float Angle = acos(y); + float NewAngle = Angle * y; + float Div = sin(NewAngle) / sin(Angle); + return detail::tquat( + cos(NewAngle), + x.x * Div, + x.y * Div, + x.z * Div); + } -//template -//GLM_FUNC_QUALIFIER detail::tquat sqrt -//( -// detail::tquat const & q -//) -//{ -// T q0 = T(1) - dot(q, q); -// return T(2) * (T(1) + q0) * q; -//} + //template + //GLM_FUNC_QUALIFIER detail::tquat sqrt + //( + // detail::tquat const & q + //) + //{ + // T q0 = T(1) - dot(q, q); + // return T(2) * (T(1) + q0) * q; + //} -template -GLM_FUNC_QUALIFIER detail::tvec3 rotate -( - detail::tquat const & q, - detail::tvec3 const & v -) -{ - return q * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rotate + ( + detail::tquat const & q, + detail::tvec3 const & v + ) + { + return q * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 rotate -( - detail::tquat const & q, - detail::tvec4 const & v -) -{ - return q * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec4 rotate + ( + detail::tquat const & q, + detail::tvec4 const & v + ) + { + return q * v; + } -template -GLM_FUNC_QUALIFIER T angle -( - detail::tquat const & x -) -{ - return glm::degrees(acos(x.w) * T(2)); -} + template + GLM_FUNC_QUALIFIER T angle + ( + detail::tquat const & x + ) + { + return glm::degrees(acos(x.w) * T(2)); + } -template -GLM_FUNC_QUALIFIER detail::tvec3 axis -( - detail::tquat const & x -) -{ - T tmp1 = T(1) - x.w * x.w; - if(tmp1 <= T(0)) - return detail::tvec3(0, 0, 1); - T tmp2 = T(1) / sqrt(tmp1); - return detail::tvec3(x.x * tmp2, x.y * tmp2, x.z * tmp2); -} + template + GLM_FUNC_QUALIFIER detail::tvec3 axis + ( + detail::tquat const & x + ) + { + T tmp1 = T(1) - x.w * x.w; + if(tmp1 <= T(0)) + return detail::tvec3(0, 0, 1); + T tmp2 = T(1) / sqrt(tmp1); + return detail::tvec3(x.x * tmp2, x.y * tmp2, x.z * tmp2); + } -template -GLM_FUNC_QUALIFIER detail::tquat angleAxis -( - valType const & angle, - valType const & x, - valType const & y, - valType const & z -) -{ - return angleAxis(angle, detail::tvec3(x, y, z)); -} + template + GLM_FUNC_QUALIFIER detail::tquat angleAxis + ( + valType const & angle, + valType const & x, + valType const & y, + valType const & z + ) + { + return angleAxis(angle, detail::tvec3(x, y, z)); + } -template -GLM_FUNC_QUALIFIER detail::tquat angleAxis -( - valType const & angle, - detail::tvec3 const & v -) -{ - detail::tquat result; + template + GLM_FUNC_QUALIFIER detail::tquat angleAxis + ( + valType const & angle, + detail::tvec3 const & v + ) + { + detail::tquat result; - valType a = glm::radians(angle); - valType s = glm::sin(a * valType(0.5)); + valType a = glm::radians(angle); + valType s = glm::sin(a * valType(0.5)); - result.w = glm::cos(a * valType(0.5)); - result.x = v.x * s; - result.y = v.y * s; - result.z = v.z * s; - return result; -} + result.w = glm::cos(a * valType(0.5)); + result.x = v.x * s; + result.y = v.y * s; + result.z = v.z * s; + return result; + } -template -GLM_FUNC_QUALIFIER T extractRealComponent -( - detail::tquat const & q -) -{ - T w = T(1.0) - q.x * q.x - q.y * q.y - q.z * q.z; - if(w < T(0)) - return T(0); - else - return -sqrt(w); -} - -template -GLM_FUNC_QUALIFIER valType roll -( - detail::tquat const & q -) -{ - return glm::degrees(atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); -} + template + GLM_FUNC_QUALIFIER T extractRealComponent + ( + detail::tquat const & q + ) + { + T w = T(1.0) - q.x * q.x - q.y * q.y - q.z * q.z; + if(w < T(0)) + return T(0); + else + return -sqrt(w); + } -template -GLM_FUNC_QUALIFIER valType pitch -( - detail::tquat const & q -) -{ - return glm::degrees(atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); -} + template + GLM_FUNC_QUALIFIER valType roll + ( + detail::tquat const & q + ) + { + return glm::degrees(atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); + } -template -GLM_FUNC_QUALIFIER valType yaw -( - detail::tquat const & q -) -{ - return glm::degrees(asin(valType(-2) * (q.x * q.z - q.w * q.y))); -} + template + GLM_FUNC_QUALIFIER valType pitch + ( + detail::tquat const & q + ) + { + return glm::degrees(atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); + } -template -GLM_FUNC_QUALIFIER detail::tvec3 eularAngles -( - detail::tquat const & x -) -{ - return detail::tvec3(pitch(x), yaw(x), roll(x)); -} + template + GLM_FUNC_QUALIFIER valType yaw + ( + detail::tquat const & q + ) + { + return glm::degrees(asin(valType(-2) * (q.x * q.z - q.w * q.y))); + } -template -GLM_FUNC_QUALIFIER detail::tquat shortMix -( - detail::tquat const & x, - detail::tquat const & y, - T const & a -) -{ - if(a <= typename detail::tquat::value_type(0)) return x; - if(a >= typename detail::tquat::value_type(1)) return y; + template + GLM_FUNC_QUALIFIER detail::tvec3 eularAngles + ( + detail::tquat const & x + ) + { + return detail::tvec3(pitch(x), yaw(x), roll(x)); + } - T fCos = dot(x, y); - detail::tquat y2(y); //BUG!!! tquat y2; - if(fCos < T(0)) - { - y2 = -y; - fCos = -fCos; - } + template + GLM_FUNC_QUALIFIER detail::tquat shortMix + ( + detail::tquat const & x, + detail::tquat const & y, + T const & a + ) + { + if(a <= typename detail::tquat::value_type(0)) return x; + if(a >= typename detail::tquat::value_type(1)) return y; - //if(fCos > 1.0f) // problem - T k0, k1; - if(fCos > T(0.9999)) - { - k0 = T(1) - a; - k1 = T(0) + a; //BUG!!! 1.0f + a; - } - else - { - T fSin = sqrt(T(1) - fCos * fCos); - T fAngle = atan(fSin, fCos); - T fOneOverSin = T(1) / fSin; - k0 = sin((T(1) - a) * fAngle) * fOneOverSin; - k1 = sin((T(0) + a) * fAngle) * fOneOverSin; - } + T fCos = dot(x, y); + detail::tquat y2(y); //BUG!!! tquat y2; + if(fCos < T(0)) + { + y2 = -y; + fCos = -fCos; + } - return detail::tquat( - k0 * x.w + k1 * y2.w, - k0 * x.x + k1 * y2.x, - k0 * x.y + k1 * y2.y, - k0 * x.z + k1 * y2.z); -} + //if(fCos > 1.0f) // problem + T k0, k1; + if(fCos > T(0.9999)) + { + k0 = T(1) - a; + k1 = T(0) + a; //BUG!!! 1.0f + a; + } + else + { + T fSin = sqrt(T(1) - fCos * fCos); + T fAngle = atan(fSin, fCos); + T fOneOverSin = T(1) / fSin; + k0 = sin((T(1) - a) * fAngle) * fOneOverSin; + k1 = sin((T(0) + a) * fAngle) * fOneOverSin; + } -template -GLM_FUNC_QUALIFIER detail::tquat fastMix -( - detail::tquat const & x, - detail::tquat const & y, - T const & a -) -{ - return glm::normalize(x * (T(1) - a) + (y * a)); -} + return detail::tquat( + k0 * x.w + k1 * y2.w, + k0 * x.x + k1 * y2.x, + k0 * x.y + k1 * y2.y, + k0 * x.z + k1 * y2.z); + } + template + GLM_FUNC_QUALIFIER detail::tquat fastMix + ( + detail::tquat const & x, + detail::tquat const & y, + T const & a + ) + { + return glm::normalize(x * (T(1) - a) + (y * a)); + } }//namespace glm diff --git a/glm/gtx/reciprocal.inl b/glm/gtx/reciprocal.inl index 7172694f..ac2f1ce6 100644 --- a/glm/gtx/reciprocal.inl +++ b/glm/gtx/reciprocal.inl @@ -2,588 +2,181 @@ // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2008-10-09 -// Updated : 2008-10-09 +// Updated : 2011-10-14 // Licence : This source is under MIT License // File : glm/gtx/reciprocal.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -// sec -template -GLM_FUNC_QUALIFIER genType sec -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'sec' only accept floating-point values"); - - return genType(1) / glm::cos(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 sec -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - sec(angle.x), - sec(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 sec -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - sec(angle.x), - sec(angle.y), - sec(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 sec -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - sec(angle.x), - sec(angle.y), - sec(angle.z), - sec(angle.w)); -} - -// csc -template -GLM_FUNC_QUALIFIER genType csc -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'csc' only accept floating-point values"); - - return genType(1) / glm::sin(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 csc -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - csc(angle.x), - csc(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 csc -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - csc(angle.x), - csc(angle.y), - csc(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 csc -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - csc(angle.x), - csc(angle.y), - csc(angle.z), - csc(angle.w)); -} - -// cot -template -GLM_FUNC_QUALIFIER genType cot -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'cot' only accept floating-point values"); - - return genType(1) / glm::tan(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 cot -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - cot(angle.x), - cot(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 cot -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - cot(angle.x), - cot(angle.y), - cot(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 cot -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - cot(angle.x), - cot(angle.y), - cot(angle.z), - cot(angle.w)); -} - -// asec -template -GLM_FUNC_QUALIFIER genType asec -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'asec' only accept floating-point values"); +#include "../core/_vectorize.hpp" + +namespace glm +{ + // sec + template + GLM_FUNC_QUALIFIER genType sec + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'sec' only accept floating-point values"); + + return genType(1) / glm::cos(angle); + } + + VECTORIZE_VEC(sec) + + // csc + template + GLM_FUNC_QUALIFIER genType csc + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'csc' only accept floating-point values"); + + return genType(1) / glm::sin(angle); + } + + VECTORIZE_VEC(csc) + + // cot + template + GLM_FUNC_QUALIFIER genType cot + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'cot' only accept floating-point values"); + + return genType(1) / glm::tan(angle); + } + + VECTORIZE_VEC(cot) + + // asec + template + GLM_FUNC_QUALIFIER genType asec + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'asec' only accept floating-point values"); - return acos(genType(1) / x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 asec -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - asec(x.x), - asec(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 asec -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - asec(x.x), - asec(x.y), - asec(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 asec -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - asec(x.x), - asec(x.y), - asec(x.z), - asec(x.w)); -} - -// acsc -template -GLM_FUNC_QUALIFIER genType acsc -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'acsc' only accept floating-point values"); - - return asin(genType(1) / x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 acsc -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - acsc(x.x), - acsc(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 acsc -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - acsc(x.x), - acsc(x.y), - acsc(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 acsc -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - acsc(x.x), - acsc(x.y), - acsc(x.z), - acsc(x.w)); -} - -// acot -template -GLM_FUNC_QUALIFIER genType acot -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'acot' only accept floating-point values"); - - genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); - return pi_over_2 - atan(x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 acot -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - acot(x.x), - acot(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 acot -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - acot(x.x), - acot(x.y), - acot(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 acot -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - acot(x.x), - acot(x.y), - acot(x.z), - acot(x.w)); -} - -// sech -template -GLM_FUNC_QUALIFIER genType sech -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'sech' only accept floating-point values"); - - return genType(1) / glm::cosh(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 sech -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - sech(angle.x), - sech(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 sech -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - sech(angle.x), - sech(angle.y), - sech(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 sech -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - sech(angle.x), - sech(angle.y), - sech(angle.z), - sech(angle.w)); -} - -// csch -template -GLM_FUNC_QUALIFIER genType csch -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'csch' only accept floating-point values"); - - return genType(1) / glm::sinh(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 csch -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - csch(angle.x), - csch(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 csch -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - csch(angle.x), - csch(angle.y), - csch(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 csch -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - csch(angle.x), - csch(angle.y), - csch(angle.z), - csch(angle.w)); -} - -// coth -template -GLM_FUNC_QUALIFIER genType coth -( - genType const & angle -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'coth' only accept floating-point values"); - - return glm::cosh(angle) / glm::sinh(angle); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 coth -( - detail::tvec2 const & angle -) -{ - return detail::tvec2( - coth(angle.x), - coth(angle.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 coth -( - detail::tvec3 const & angle -) -{ - return detail::tvec3( - coth(angle.x), - coth(angle.y), - coth(angle.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 coth -( - detail::tvec4 const & angle -) -{ - return detail::tvec4( - coth(angle.x), - coth(angle.y), - coth(angle.z), - coth(angle.w)); -} - -// asech -template -GLM_FUNC_QUALIFIER genType asech -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'asech' only accept floating-point values"); - - return acosh(genType(1) / x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 asech -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - asech(x.x), - asech(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 asech -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - asech(x.x), - asech(x.y), - asech(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 asech -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - asech(x.x), - asech(x.y), - asech(x.z), - asech(x.w)); -} - -// acsch -template -GLM_FUNC_QUALIFIER genType acsch -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'acsch' only accept floating-point values"); - - return asinh(genType(1) / x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 acsch -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - acsch(x.x), - acsch(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 acsch -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - acsch(x.x), - acsch(x.y), - acsch(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 acsch -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - acsch(x.x), - acsch(x.y), - acsch(x.z), - acsch(x.w)); -} - -// acoth -template -GLM_FUNC_QUALIFIER genType acoth -( - genType const & x -) -{ - GLM_STATIC_ASSERT(detail::type::is_float, "'acoth' only accept floating-point values"); - - return atanh(genType(1) / x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 acoth -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - acoth(x.x), - acoth(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 acoth -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - acoth(x.x), - acoth(x.y), - acoth(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 acoth -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - acoth(x.x), - acoth(x.y), - acoth(x.z), - acoth(x.w)); -} - + return acos(genType(1) / x); + } + + VECTORIZE_VEC(asec) + + // acsc + template + GLM_FUNC_QUALIFIER genType acsc + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acsc' only accept floating-point values"); + + return asin(genType(1) / x); + } + + VECTORIZE_VEC(acsc) + + // acot + template + GLM_FUNC_QUALIFIER genType acot + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return pi_over_2 - atan(x); + } + + VECTORIZE_VEC(acot) + + // sech + template + GLM_FUNC_QUALIFIER genType sech + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'sech' only accept floating-point values"); + + return genType(1) / glm::cosh(angle); + } + + VECTORIZE_VEC(sech) + + // csch + template + GLM_FUNC_QUALIFIER genType csch + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'csch' only accept floating-point values"); + + return genType(1) / glm::sinh(angle); + } + + VECTORIZE_VEC(csch) + + // coth + template + GLM_FUNC_QUALIFIER genType coth + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'coth' only accept floating-point values"); + + return glm::cosh(angle) / glm::sinh(angle); + } + + VECTORIZE_VEC(coth) + + // asech + template + GLM_FUNC_QUALIFIER genType asech + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'asech' only accept floating-point values"); + + return acosh(genType(1) / x); + } + + VECTORIZE_VEC(asech) + + // acsch + template + GLM_FUNC_QUALIFIER genType acsch + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acsch' only accept floating-point values"); + + return asinh(genType(1) / x); + } + + VECTORIZE_VEC(acsch) + + // acoth + template + GLM_FUNC_QUALIFIER genType acoth + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acoth' only accept floating-point values"); + + return atanh(genType(1) / x); + } + + VECTORIZE_VEC(acoth) }//namespace glm diff --git a/glm/gtx/rotate_vector.inl b/glm/gtx/rotate_vector.inl index f96a90e3..63106345 100644 --- a/glm/gtx/rotate_vector.inl +++ b/glm/gtx/rotate_vector.inl @@ -7,139 +7,158 @@ // File : glm/gtx/rotate_vector.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tvec2 rotate( - detail::tvec2 const & v, - T const & angle) -{ - detail::tvec2 Result; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.x = v.x * Cos - v.y * Sin; - Result.y = v.x * Sin + v.y * Cos; - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 rotate( - const detail::tvec3 & v, - T const & angle, - const detail::tvec3 & normal) +namespace glm { - return detail::tmat3x3(glm::rotate(angle, normal)) * v; -} -/* -template -GLM_FUNC_QUALIFIER detail::tvec3 rotateGTX( - const detail::tvec3& x, - T angle, - const detail::tvec3& normal) -{ - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; -} -*/ -template -GLM_FUNC_QUALIFIER detail::tvec4 rotate( - detail::tvec4 const & v, - T const & angle, - detail::tvec3 const & normal) -{ - return rotate(angle, normal) * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec2 rotate + ( + detail::tvec2 const & v, + T const & angle + ) + { + detail::tvec2 Result; + T const Cos = cos(radians(angle)); + T const Sin = sin(radians(angle)); + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 rotateX( - detail::tvec3 const & v, - T const & angle) -{ - detail::tvec3 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.y = v.y * Cos - v.z * Sin; - Result.z = v.y * Sin + v.z * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rotate + ( + detail::tvec3 const & v, + T const & angle, + detail::tvec3 const & normal + ) + { + return detail::tmat3x3(glm::rotate(angle, normal)) * v; + } + /* + template + GLM_FUNC_QUALIFIER detail::tvec3 rotateGTX( + const detail::tvec3& x, + T angle, + const detail::tvec3& normal) + { + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; + } + */ + template + GLM_FUNC_QUALIFIER detail::tvec4 rotate + ( + detail::tvec4 const & v, + T const & angle, + detail::tvec3 const & normal + ) + { + return rotate(angle, normal) * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 rotateY( - detail::tvec3 const & v, - T const & angle) -{ - detail::tvec3 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.x = v.x * Cos + v.z * Sin; - Result.z = -v.x * Sin + v.z * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rotateX + ( + detail::tvec3 const & v, + T const & angle + ) + { + detail::tvec3 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 rotateZ( - detail::tvec3 const & v, - T const & angle) -{ - detail::tvec3 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.x = v.x * Cos - v.y * Sin; - Result.y = v.x * Sin + v.y * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rotateY + ( + detail::tvec3 const & v, + T const & angle + ) + { + detail::tvec3 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 rotateX( - detail::tvec4 const & v, - T const & angle) -{ - detail::tvec4 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.y = v.y * Cos - v.z * Sin; - Result.z = v.y * Sin + v.z * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 rotateZ + ( + detail::tvec3 const & v, + T const & angle + ) + { + detail::tvec3 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 rotateY( - detail::tvec4 const & v, - T const & angle) -{ - detail::tvec4 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.x = v.x * Cos + v.z * Sin; - Result.z = -v.x * Sin + v.z * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec4 rotateX + ( + detail::tvec4 const & v, + T const & angle + ) + { + detail::tvec4 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 rotateZ( - detail::tvec4 const & v, - T const & angle) -{ - detail::tvec4 Result = v; - const T Cos = cos(radians(angle)); - const T Sin = sin(radians(angle)); - Result.x = v.x * Cos - v.y * Sin; - Result.y = v.x * Sin + v.y * Cos; - return Result; -} + template + GLM_FUNC_QUALIFIER detail::tvec4 rotateY + ( + detail::tvec4 const & v, + T const & angle + ) + { + detail::tvec4 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 orientation( - detail::tvec3 const & Normal, - detail::tvec3 const & Up) -{ - if(all(equal(Normal, Up))) - return detail::tmat4x4(T(1)); + template + GLM_FUNC_QUALIFIER detail::tvec4 rotateZ + ( + detail::tvec4 const & v, + T const & angle + ) + { + detail::tvec4 Result = v; + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } - detail::tvec3 RotationAxis = cross(Up, Normal); - T Angle = degrees(acos(dot(Normal, Up))); - return rotate(Angle, RotationAxis); -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 orientation + ( + detail::tvec3 const & Normal, + detail::tvec3 const & Up + ) + { + if(all(equal(Normal, Up))) + return detail::tmat4x4(T(1)); + detail::tvec3 RotationAxis = cross(Up, Normal); + T Angle = degrees(acos(dot(Normal, Up))); + return rotate(Angle, RotationAxis); + } }//namespace glm diff --git a/glm/gtx/transform2.inl b/glm/gtx/transform2.inl index 915e6430..4c75e9df 100644 --- a/glm/gtx/transform2.inl +++ b/glm/gtx/transform2.inl @@ -7,149 +7,148 @@ // File : glm/gtx/transform2.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 shearX2D( - const detail::tmat3x3& m, - T s) -{ - detail::tmat3x3 r(1); - r[0][1] = s; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 shearY2D( - const detail::tmat3x3& m, - T s) -{ - detail::tmat3x3 r(1); - r[1][0] = s; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 shearX3D( - const detail::tmat4x4& m, - T s, - T t) -{ - detail::tmat4x4 r(1); - r[1][0] = s; - r[2][0] = t; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 shearY3D( - const detail::tmat4x4& m, - T s, - T t) -{ - detail::tmat4x4 r(1); - r[0][1] = s; - r[2][1] = t; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 shearZ3D( - const detail::tmat4x4& m, - T s, - T t) -{ - detail::tmat4x4 r(1); - r[0][2] = s; - r[1][2] = t; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 reflect2D( - const detail::tmat3x3& m, - const detail::tvec3& normal) -{ - detail::tmat3x3 r(1); - r[0][0] = 1 - 2 * normal.x * normal.x; - r[0][1] = -2 * normal.x * normal.y; - r[1][0] = -2 * normal.x * normal.y; - r[1][1] = 1 - 2 * normal.y * normal.y; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 reflect3D( - const detail::tmat4x4& m, - const detail::tvec3& normal) -{ - detail::tmat4x4 r(1); - r[0][0] = 1 - 2 * normal.x * normal.x; - r[0][1] = -2 * normal.x * normal.y; - r[0][2] = -2 * normal.x * normal.z; - - r[1][0] = -2 * normal.x * normal.y; - r[1][1] = 1 - 2 * normal.y * normal.y; - r[1][2] = -2 * normal.y * normal.z; - - r[2][0] = -2 * normal.x * normal.z; - r[2][1] = -2 * normal.y * normal.z; - r[2][2] = 1 - 2 * normal.z * normal.z; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat3x3 proj2D( - const detail::tmat3x3& m, - const detail::tvec3& normal) -{ - detail::tmat3x3 r(1); - r[0][0] = 1 - normal.x * normal.x; - r[0][1] = - normal.x * normal.y; - r[1][0] = - normal.x * normal.y; - r[1][1] = 1 - normal.y * normal.y; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 proj3D( - const detail::tmat4x4& m, - const detail::tvec3& normal) -{ - detail::tmat4x4 r(1); - r[0][0] = 1 - normal.x * normal.x; - r[0][1] = - normal.x * normal.y; - r[0][2] = - normal.x * normal.z; - r[1][0] = - normal.x * normal.y; - r[1][1] = 1 - normal.y * normal.y; - r[1][2] = - normal.y * normal.z; - r[2][0] = - normal.x * normal.z; - r[2][1] = - normal.y * normal.z; - r[2][2] = 1 - normal.z * normal.z; - return m * r; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 scaleBias( - T scale, - T bias) +namespace glm { - detail::tmat4x4 result; - result[3] = detail::tvec4(detail::tvec3(bias), T(1)); - result[0][0] = scale; - result[1][1] = scale; - result[2][2] = scale; - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tmat4x4 scaleBias( - const detail::tmat4x4& m, - T scale, - T bias) -{ - return m * scaleBias(scale, bias); -} - + template + GLM_FUNC_QUALIFIER detail::tmat3x3 shearX2D( + const detail::tmat3x3& m, + T s) + { + detail::tmat3x3 r(1); + r[0][1] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 shearY2D( + const detail::tmat3x3& m, + T s) + { + detail::tmat3x3 r(1); + r[1][0] = s; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 shearX3D( + const detail::tmat4x4& m, + T s, + T t) + { + detail::tmat4x4 r(1); + r[1][0] = s; + r[2][0] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 shearY3D( + const detail::tmat4x4& m, + T s, + T t) + { + detail::tmat4x4 r(1); + r[0][1] = s; + r[2][1] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 shearZ3D( + const detail::tmat4x4& m, + T s, + T t) + { + detail::tmat4x4 r(1); + r[0][2] = s; + r[1][2] = t; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 reflect2D( + const detail::tmat3x3& m, + const detail::tvec3& normal) + { + detail::tmat3x3 r(1); + r[0][0] = 1 - 2 * normal.x * normal.x; + r[0][1] = -2 * normal.x * normal.y; + r[1][0] = -2 * normal.x * normal.y; + r[1][1] = 1 - 2 * normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 reflect3D( + const detail::tmat4x4& m, + const detail::tvec3& normal) + { + detail::tmat4x4 r(1); + r[0][0] = 1 - 2 * normal.x * normal.x; + r[0][1] = -2 * normal.x * normal.y; + r[0][2] = -2 * normal.x * normal.z; + + r[1][0] = -2 * normal.x * normal.y; + r[1][1] = 1 - 2 * normal.y * normal.y; + r[1][2] = -2 * normal.y * normal.z; + + r[2][0] = -2 * normal.x * normal.z; + r[2][1] = -2 * normal.y * normal.z; + r[2][2] = 1 - 2 * normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 proj2D( + const detail::tmat3x3& m, + const detail::tvec3& normal) + { + detail::tmat3x3 r(1); + r[0][0] = 1 - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[1][0] = - normal.x * normal.y; + r[1][1] = 1 - normal.y * normal.y; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 proj3D( + const detail::tmat4x4& m, + const detail::tvec3& normal) + { + detail::tmat4x4 r(1); + r[0][0] = 1 - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[0][2] = - normal.x * normal.z; + r[1][0] = - normal.x * normal.y; + r[1][1] = 1 - normal.y * normal.y; + r[1][2] = - normal.y * normal.z; + r[2][0] = - normal.x * normal.z; + r[2][1] = - normal.y * normal.z; + r[2][2] = 1 - normal.z * normal.z; + return m * r; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 scaleBias( + T scale, + T bias) + { + detail::tmat4x4 result; + result[3] = detail::tvec4(detail::tvec3(bias), T(1)); + result[0][0] = scale; + result[1][1] = scale; + result[2][2] = scale; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 scaleBias( + const detail::tmat4x4& m, + T scale, + T bias) + { + return m * scaleBias(scale, bias); + } }//namespace glm diff --git a/glm/gtx/ulp.inl b/glm/gtx/ulp.inl index 0317e431..d5659f93 100644 --- a/glm/gtx/ulp.inl +++ b/glm/gtx/ulp.inl @@ -42,34 +42,34 @@ typedef union } ieee_double_shape_type; #define GLM_EXTRACT_WORDS(ix0,ix1,d) \ -do { \ - ieee_double_shape_type ew_u; \ - ew_u.value = (d); \ - (ix0) = ew_u.parts.msw; \ - (ix1) = ew_u.parts.lsw; \ -} while (0) + do { \ + ieee_double_shape_type ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } while (0) #define GLM_GET_FLOAT_WORD(i,d) \ -do { \ - ieee_float_shape_type gf_u; \ - gf_u.value = (d); \ - (i) = gf_u.word; \ -} while (0) + do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } while (0) #define GLM_SET_FLOAT_WORD(d,i) \ -do { \ - ieee_float_shape_type sf_u; \ - sf_u.word = (i); \ - (d) = sf_u.value; \ -} while (0) + do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } while (0) #define GLM_INSERT_WORDS(d,ix0,ix1) \ -do { \ - ieee_double_shape_type iw_u; \ - iw_u.parts.msw = (ix0); \ - iw_u.parts.lsw = (ix1); \ - (d) = iw_u.value; \ -} while (0) + do { \ + ieee_double_shape_type iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } while (0) namespace glm{ namespace detail @@ -181,218 +181,119 @@ namespace detail # define GLM_NEXT_AFTER_DBL(x, toward) nextafter((x), (toward)) #endif -namespace glm{ - -GLM_FUNC_QUALIFIER float next_float(float const & x) +namespace glm { - return GLM_NEXT_AFTER_FLT(x, std::numeric_limits::max()); -} + GLM_FUNC_QUALIFIER float next_float(float const & x) + { + return GLM_NEXT_AFTER_FLT(x, std::numeric_limits::max()); + } -GLM_FUNC_QUALIFIER double next_float(double const & x) -{ - return GLM_NEXT_AFTER_DBL(x, std::numeric_limits::max()); -} + GLM_FUNC_QUALIFIER double next_float(double const & x) + { + return GLM_NEXT_AFTER_DBL(x, std::numeric_limits::max()); + } -template class vecType> -GLM_FUNC_QUALIFIER vecType next_float(vecType const & x) -{ - vecType Result; - for(std::size_t i = 0; i < Result.length(); ++i) - Result[i] = next_float(x[i]); - return Result; -} + template class vecType> + GLM_FUNC_QUALIFIER vecType next_float(vecType const & x) + { + vecType Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = next_float(x[i]); + return Result; + } -GLM_FUNC_QUALIFIER float prev_float(float const & x) -{ - return GLM_NEXT_AFTER_FLT(x, std::numeric_limits::min()); -} + GLM_FUNC_QUALIFIER float prev_float(float const & x) + { + return GLM_NEXT_AFTER_FLT(x, std::numeric_limits::min()); + } -GLM_FUNC_QUALIFIER double prev_float(double const & x) -{ - return GLM_NEXT_AFTER_DBL(x, std::numeric_limits::min()); -} + GLM_FUNC_QUALIFIER double prev_float(double const & x) + { + return GLM_NEXT_AFTER_DBL(x, std::numeric_limits::min()); + } -template class vecType> -GLM_FUNC_QUALIFIER vecType prev_float(vecType const & x) -{ - vecType Result; - for(std::size_t i = 0; i < Result.length(); ++i) - Result[i] = prev_float(x[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps) -{ - T temp = x; - for(std::size_t i = 0; i < ulps; ++i) - temp = next_float(temp); - return temp; -} - -template class vecType> -GLM_FUNC_QUALIFIER vecType next_float(vecType const & x, vecType const & ulps) -{ - vecType Result; - for(std::size_t i = 0; i < Result.length(); ++i) - Result[i] = next_float(x[i], ulps[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps) -{ - T temp = x; - for(std::size_t i = 0; i < ulps; ++i) - temp = prev_float(temp); - return temp; -} - -template class vecType> -GLM_FUNC_QUALIFIER vecType prev_float(vecType const & x, vecType const & ulps) -{ - vecType Result; - for(std::size_t i = 0; i < Result.length(); ++i) - Result[i] = prev_float(x[i], ulps[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y) -{ - uint ulp = 0; - - if(x < y) - { - T temp = x; - while(temp != y && ulp < std::numeric_limits::max()) - { - ++ulp; - temp = next_float(temp); - } - } - else if(y < x) - { - T temp = y; - while(temp != x && ulp < std::numeric_limits::max()) - { - ++ulp; - temp = next_float(temp); - } - } - else // == - { - - } - - return ulp; -} - -template class vecType> -GLM_FUNC_QUALIFIER vecType float_distance(vecType const & x, vecType const & y) -{ - vecType Result; - for(std::size_t i = 0; i < Result.length(); ++i) - Result[i] = float_distance(x[i], y[i]); - return Result; -} -/* -inline std::size_t ulp -( - detail::thalf const & a, - detail::thalf const & b -) -{ - std::size_t Count = 0; - float TempA(a); - float TempB(b); - //while((TempA = _nextafterf(TempA, TempB)) != TempB) - ++Count; - return Count; -} - -inline std::size_t ulp -( - float const & a, - float const & b -) -{ - std::size_t Count = 0; - float Temp = a; - //while((Temp = _nextafterf(Temp, b)) != b) - { - std::cout << Temp << " " << b << std::endl; - ++Count; - } - return Count; -} - -inline std::size_t ulp -( - double const & a, - double const & b -) -{ - std::size_t Count = 0; - double Temp = a; - //while((Temp = _nextafter(Temp, b)) != b) - { - std::cout << Temp << " " << b << std::endl; - ++Count; - } - return Count; -} - -template -inline std::size_t ulp -( - detail::tvec2 const & a, - detail::tvec2 const & b -) -{ - std::size_t ulps[] = - { - ulp(a[0], b[0]), - ulp(a[1], b[1]) - }; - - return glm::max(ulps[0], ulps[1]); -} - -template -inline std::size_t ulp -( - detail::tvec3 const & a, - detail::tvec3 const & b -) -{ - std::size_t ulps[] = - { - ulp(a[0], b[0]), - ulp(a[1], b[1]), - ulp(a[2], b[2]) - }; - - return glm::max(glm::max(ulps[0], ulps[1]), ulps[2]); -} - -template -inline std::size_t ulp -( - detail::tvec4 const & a, - detail::tvec4 const & b -) -{ - std::size_t ulps[] = - { - ulp(a[0], b[0]), - ulp(a[1], b[1]), - ulp(a[2], b[2]), - ulp(a[3], b[3]) - }; - - return glm::max(glm::max(ulps[0], ulps[1]), glm::max(ulps[2], ulps[3])); -} -*/ + template class vecType> + GLM_FUNC_QUALIFIER vecType prev_float(vecType const & x) + { + vecType Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = prev_float(x[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps) + { + T temp = x; + for(std::size_t i = 0; i < ulps; ++i) + temp = next_float(temp); + return temp; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType next_float(vecType const & x, vecType const & ulps) + { + vecType Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = next_float(x[i], ulps[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps) + { + T temp = x; + for(std::size_t i = 0; i < ulps; ++i) + temp = prev_float(temp); + return temp; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType prev_float(vecType const & x, vecType const & ulps) + { + vecType Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = prev_float(x[i], ulps[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y) + { + uint ulp = 0; + + if(x < y) + { + T temp = x; + while(temp != y && ulp < std::numeric_limits::max()) + { + ++ulp; + temp = next_float(temp); + } + } + else if(y < x) + { + T temp = y; + while(temp != x && ulp < std::numeric_limits::max()) + { + ++ulp; + temp = next_float(temp); + } + } + else // == + { + + } + return ulp; + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType float_distance(vecType const & x, vecType const & y) + { + vecType Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } }//namespace glm diff --git a/glm/gtx/unsigned_int.inl b/glm/gtx/unsigned_int.inl index 953e4ba1..f40158b6 100644 --- a/glm/gtx/unsigned_int.inl +++ b/glm/gtx/unsigned_int.inl @@ -7,7 +7,7 @@ // File : glm/gtx/unsigned_int.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - +namespace glm +{ }//namespace glm diff --git a/glm/gtx/vector_access.inl b/glm/gtx/vector_access.inl index df55c15c..e4906eee 100644 --- a/glm/gtx/vector_access.inl +++ b/glm/gtx/vector_access.inl @@ -7,48 +7,47 @@ // File : glm/gtx/vector_access.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER void set -( - detail::tvec2& v, - valType const & x, - valType const & y -) -{ - v.x = x; - v.y = y; -} - -template -GLM_FUNC_QUALIFIER void set -( - detail::tvec3& v, - valType const & x, - valType const & y, - valType const & z -) +namespace glm { - v.x = x; - v.y = y; - v.z = z; -} + template + GLM_FUNC_QUALIFIER void set + ( + detail::tvec2& v, + valType const & x, + valType const & y + ) + { + v.x = x; + v.y = y; + } -template -GLM_FUNC_QUALIFIER void set -( - detail::tvec4& v, - valType const & x, - valType const & y, - valType const & z, - valType const & w -) -{ - v.x = x; - v.y = y; - v.z = z; - v.w = w; -} + template + GLM_FUNC_QUALIFIER void set + ( + detail::tvec3& v, + valType const & x, + valType const & y, + valType const & z + ) + { + v.x = x; + v.y = y; + v.z = z; + } + template + GLM_FUNC_QUALIFIER void set + ( + detail::tvec4& v, + valType const & x, + valType const & y, + valType const & z, + valType const & w + ) + { + v.x = x; + v.y = y; + v.z = z; + v.w = w; + } }//namespace glm diff --git a/glm/gtx/vector_angle.inl b/glm/gtx/vector_angle.inl index e40b61ce..bf01b4d8 100644 --- a/glm/gtx/vector_angle.inl +++ b/glm/gtx/vector_angle.inl @@ -7,48 +7,47 @@ // File : glm/gtx/vector_angle.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER typename genType::value_type angle -( - genType const & x, - genType const & y -) -{ - return degrees(acos(dot(x, y))); -} - -//! \todo epsilon is hard coded to 0.01 -template -GLM_FUNC_QUALIFIER valType orientedAngle -( - detail::tvec2 const & x, - detail::tvec2 const & y -) +namespace glm { - valType Angle = glm::degrees(acos(dot(x, y))); - detail::tvec2 TransformedVector = glm::rotate(x, Angle); - if(all(equalEpsilon(y, TransformedVector, valType(0.01)))) - return Angle; - else - return -Angle; -} + template + GLM_FUNC_QUALIFIER typename genType::value_type angle + ( + genType const & x, + genType const & y + ) + { + return degrees(acos(dot(x, y))); + } -template -GLM_FUNC_QUALIFIER valType orientedAngle -( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 const & ref -) -{ - valType Angle = glm::degrees(glm::acos(glm::dot(x, y))); + //! \todo epsilon is hard coded to 0.01 + template + GLM_FUNC_QUALIFIER valType orientedAngle + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + valType Angle = glm::degrees(acos(dot(x, y))); + detail::tvec2 TransformedVector = glm::rotate(x, Angle); + if(all(equalEpsilon(y, TransformedVector, valType(0.01)))) + return Angle; + else + return -Angle; + } - if(glm::dot(ref, glm::cross(x, y)) < valType(0)) - return -Angle; - else - return Angle; -} + template + GLM_FUNC_QUALIFIER valType orientedAngle + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 const & ref + ) + { + valType Angle = glm::degrees(glm::acos(glm::dot(x, y))); + if(glm::dot(ref, glm::cross(x, y)) < valType(0)) + return -Angle; + else + return Angle; + } }//namespace glm diff --git a/glm/gtx/vector_query.inl b/glm/gtx/vector_query.inl index 8d24ea41..b72e1bfb 100644 --- a/glm/gtx/vector_query.inl +++ b/glm/gtx/vector_query.inl @@ -12,159 +12,158 @@ #include -namespace glm{ - -template -GLM_FUNC_QUALIFIER bool areCollinear -( - detail::tvec2 const & v0, - detail::tvec2 const & v1, - T const & epsilon -) -{ - return length(cross(detail::tvec3(v0, T(0)), detail::tvec3(v1, T(0)))) < epsilon; -} - -template -GLM_FUNC_QUALIFIER bool areCollinear -( - detail::tvec3 const & v0, - detail::tvec3 const & v1, - T const & epsilon -) -{ - return length(cross(v0, v1)) < epsilon; -} - -template -GLM_FUNC_QUALIFIER bool areCollinear -( - detail::tvec4 const & v0, - detail::tvec4 const & v1, - T const & epsilon -) -{ - return length(cross(detail::tvec3(v0), detail::tvec3(v1))) < epsilon; -} - -template -GLM_FUNC_QUALIFIER bool areOpposite -( - genType const & v0, - genType const & v1, - typename genType::value_type const & epsilon -) +namespace glm { - assert(isNormalized(v0) && isNormalized(v1)); - return((typename genType::value_type(1) + dot(v0, v1)) <= epsilon); -} - -template -GLM_FUNC_QUALIFIER bool areOrthogonal -( - genType const & v0, - genType const & v1, - typename genType::value_type const & epsilon -) -{ - return abs(dot(v0, v1)) <= max( - typename genType::value_type(1), - length(v0)) * max( + template + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec2 const & v0, + detail::tvec2 const & v1, + T const & epsilon + ) + { + return length(cross(detail::tvec3(v0, T(0)), detail::tvec3(v1, T(0)))) < epsilon; + } + + template + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec3 const & v0, + detail::tvec3 const & v1, + T const & epsilon + ) + { + return length(cross(v0, v1)) < epsilon; + } + + template + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec4 const & v0, + detail::tvec4 const & v1, + T const & epsilon + ) + { + return length(cross(detail::tvec3(v0), detail::tvec3(v1))) < epsilon; + } + + template + GLM_FUNC_QUALIFIER bool areOpposite + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + assert(isNormalized(v0) && isNormalized(v1)); + return((typename genType::value_type(1) + dot(v0, v1)) <= epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthogonal + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + return abs(dot(v0, v1)) <= max( typename genType::value_type(1), - length(v1)) * epsilon; -} - -template -GLM_FUNC_QUALIFIER bool isNormalized -( - genType const & v, - typename genType::value_type const & epsilon -) -{ - return abs(length(v) - typename genType::value_type(1)) <= typename genType::value_type(2) * epsilon; -} - -template -GLM_FUNC_QUALIFIER bool isNull -( - genType const & v, - typename genType::value_type const & epsilon -) -{ - return length(v) <= epsilon; -} - -template -GLM_FUNC_QUALIFIER bool isCompNull -( - T const & s, - T const & epsilon -) -{ - return abs(s) < epsilon; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 isCompNull -( - detail::tvec2 const & v, - T const & epsilon) -{ - return detail::tvec2( - (abs(v.x) < epsilon), - (abs(v.y) < epsilon)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 isCompNull -( - detail::tvec3 const & v, - T const & epsilon -) -{ - return detail::tvec3( - abs(v.x) < epsilon, - abs(v.y) < epsilon, - abs(v.z) < epsilon); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 isCompNull -( - detail::tvec4 const & v, - T const & epsilon -) -{ - return detail::tvec4( - abs(v.x) < epsilon, - abs(v.y) < epsilon, - abs(v.z) < epsilon, - abs(v.w) < epsilon); -} - -template -GLM_FUNC_QUALIFIER bool areOrthonormal -( - genType const & v0, - genType const & v1, - typename genType::value_type const & epsilon -) -{ - return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); -} - -template -GLM_FUNC_QUALIFIER bool areSimilar -( - genType const & v0, - genType const & v1, - typename genType::value_type const & epsilon -) -{ - bool similar = true; - for(typename genType::size_type i = 0; similar && i < genType::value_size(); i++) - similar = (abs(v0[i] - v1[i]) <= epsilon); - return similar; -} - + length(v0)) * max( + typename genType::value_type(1), + length(v1)) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNormalized + ( + genType const & v, + typename genType::value_type const & epsilon + ) + { + return abs(length(v) - typename genType::value_type(1)) <= typename genType::value_type(2) * epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isNull + ( + genType const & v, + typename genType::value_type const & epsilon + ) + { + return length(v) <= epsilon; + } + + template + GLM_FUNC_QUALIFIER bool isCompNull + ( + T const & s, + T const & epsilon + ) + { + return abs(s) < epsilon; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 isCompNull + ( + detail::tvec2 const & v, + T const & epsilon) + { + return detail::tvec2( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 isCompNull + ( + detail::tvec3 const & v, + T const & epsilon + ) + { + return detail::tvec3( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 isCompNull + ( + detail::tvec4 const & v, + T const & epsilon + ) + { + return detail::tvec4( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon, + abs(v.w) < epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areOrthonormal + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); + } + + template + GLM_FUNC_QUALIFIER bool areSimilar + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + bool similar = true; + for(typename genType::size_type i = 0; similar && i < genType::value_size(); i++) + similar = (abs(v0[i] - v1[i]) <= epsilon); + return similar; + } }//namespace glm diff --git a/glm/gtx/verbose_operator.inl b/glm/gtx/verbose_operator.inl index 5c66f1c7..8f2c90c0 100644 --- a/glm/gtx/verbose_operator.inl +++ b/glm/gtx/verbose_operator.inl @@ -7,119 +7,118 @@ // File : glm/gtx/verbose_operator.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER genType add(genType const & a, genType const & b) +namespace glm { - return a + b; -} + template + GLM_FUNC_QUALIFIER genType add(genType const & a, genType const & b) + { + return a + b; + } -template -GLM_FUNC_QUALIFIER genType sub(genType const & a, genType const & b) -{ - return a - b; -} + template + GLM_FUNC_QUALIFIER genType sub(genType const & a, genType const & b) + { + return a - b; + } -template -GLM_FUNC_QUALIFIER detail::tmat2x2 mul -( - detail::tmat2x2 const & a, - detail::tmat2x2 const & b -) -{ - return a * b; -} + template + GLM_FUNC_QUALIFIER detail::tmat2x2 mul + ( + detail::tmat2x2 const & a, + detail::tmat2x2 const & b + ) + { + return a * b; + } -template -GLM_FUNC_QUALIFIER detail::tmat3x3 mul -( - detail::tmat3x3 const & a, - detail::tmat3x3 const & b -) -{ - return a * b; -} + template + GLM_FUNC_QUALIFIER detail::tmat3x3 mul + ( + detail::tmat3x3 const & a, + detail::tmat3x3 const & b + ) + { + return a * b; + } -template -GLM_FUNC_QUALIFIER detail::tmat4x4 mul -( - detail::tmat4x4 const & a, - detail::tmat4x4 const & b -) -{ - return a * b; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 mul -( - detail::tmat2x2 const & m, - detail::tvec2 const & v -) -{ - return m * v; -} + template + GLM_FUNC_QUALIFIER detail::tmat4x4 mul + ( + detail::tmat4x4 const & a, + detail::tmat4x4 const & b + ) + { + return a * b; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 mul -( - detail::tmat3x3 const & m, - detail::tvec3 const & v) -{ - return m * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec2 mul + ( + detail::tmat2x2 const & m, + detail::tvec2 const & v + ) + { + return m * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 mul -( - detail::tmat4x4 const & m, - detail::tvec4 const & v -) -{ - return m * v; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 mul + ( + detail::tmat3x3 const & m, + detail::tvec3 const & v) + { + return m * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec2 mul -( - detail::tvec2 const & v, - detail::tmat2x2 const & m -) -{ - return v * m; -} + template + GLM_FUNC_QUALIFIER detail::tvec4 mul + ( + detail::tmat4x4 const & m, + detail::tvec4 const & v + ) + { + return m * v; + } -template -GLM_FUNC_QUALIFIER detail::tvec3 mul -( - detail::tvec3 const & v, - detail::tmat3x3 const & m -) -{ - return v * m; -} + template + GLM_FUNC_QUALIFIER detail::tvec2 mul + ( + detail::tvec2 const & v, + detail::tmat2x2 const & m + ) + { + return v * m; + } -template -GLM_FUNC_QUALIFIER detail::tvec4 mul -( - detail::tvec4 const & v, - detail::tmat4x4 const & m -) -{ - return v * m; -} + template + GLM_FUNC_QUALIFIER detail::tvec3 mul + ( + detail::tvec3 const & v, + detail::tmat3x3 const & m + ) + { + return v * m; + } -template -GLM_FUNC_QUALIFIER genType div(genType const & a, genType const & b) -{ - return a / b; -} + template + GLM_FUNC_QUALIFIER detail::tvec4 mul + ( + detail::tvec4 const & v, + detail::tmat4x4 const & m + ) + { + return v * m; + } -template -GLM_FUNC_QUALIFIER genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c) -{ - return a * b + c; -} + template + GLM_FUNC_QUALIFIER genType div(genType const & a, genType const & b) + { + return a / b; + } + template + GLM_FUNC_QUALIFIER genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c) + { + return a * b + c; + } }//namespace glm diff --git a/glm/gtx/wrap.inl b/glm/gtx/wrap.inl index 42c566cb..d66e62e7 100644 --- a/glm/gtx/wrap.inl +++ b/glm/gtx/wrap.inl @@ -10,157 +10,156 @@ // - GLM core /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -template -GLM_FUNC_QUALIFIER genType clamp -( - genType const & Texcoord -) -{ - return glm::clamp(Texcoord, genType(0), genType(1)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 clamp -( - detail::tvec2 const & Texcoord -) -{ - detail::tvec2 Result; - for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 clamp -( - detail::tvec3 const & Texcoord -) -{ - detail::tvec3 Result; - for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 clamp -( - detail::tvec4 const & Texcoord -) -{ - detail::tvec4 Result; - for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); - return Result; -} - -//////////////////////// -// repeat - -template -GLM_FUNC_QUALIFIER genType repeat -( - genType const & Texcoord -) -{ - return glm::fract(Texcoord); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 repeat -( - detail::tvec2 const & Texcoord -) -{ - detail::tvec2 Result; - for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) - Result[i] = repeat(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 repeat -( - detail::tvec3 const & Texcoord -) +namespace glm { - detail::tvec3 Result; - for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) - Result[i] = repeat(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 repeat -( - detail::tvec4 const & Texcoord -) -{ - detail::tvec4 Result; - for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) - Result[i] = repeat(Texcoord[i]); - return Result; -} - -//////////////////////// -// mirrorRepeat - -template -GLM_FUNC_QUALIFIER genType mirrorRepeat -( - genType const & Texcoord -) -{ - genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); - genType const Floor = glm::floor(Texcoord); - genType const Rest = Texcoord - Floor; - genType const Mirror = Clamp + Rest; - - genType Out; - if(Mirror >= genType(1)) - Out = genType(1) - Rest; - else - Out = Rest; - return Out; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 mirrorRepeat -( - detail::tvec2 const & Texcoord -) -{ - detail::tvec2 Result; - for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) - Result[i] = mirrorRepeat(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 mirrorRepeat -( - detail::tvec3 const & Texcoord -) -{ - detail::tvec3 Result; - for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) - Result[i] = mirrorRepeat(Texcoord[i]); - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 mirrorRepeat -( - detail::tvec4 const & Texcoord -) -{ - detail::tvec4 Result; - for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) - Result[i] = mirrorRepeat(Texcoord[i]); - return Result; -} - + template + GLM_FUNC_QUALIFIER genType clamp + ( + genType const & Texcoord + ) + { + return glm::clamp(Texcoord, genType(0), genType(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 clamp + ( + detail::tvec2 const & Texcoord + ) + { + detail::tvec2 Result; + for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 clamp + ( + detail::tvec3 const & Texcoord + ) + { + detail::tvec3 Result; + for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 clamp + ( + detail::tvec4 const & Texcoord + ) + { + detail::tvec4 Result; + for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + //////////////////////// + // repeat + + template + GLM_FUNC_QUALIFIER genType repeat + ( + genType const & Texcoord + ) + { + return glm::fract(Texcoord); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 repeat + ( + detail::tvec2 const & Texcoord + ) + { + detail::tvec2 Result; + for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 repeat + ( + detail::tvec3 const & Texcoord + ) + { + detail::tvec3 Result; + for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 repeat + ( + detail::tvec4 const & Texcoord + ) + { + detail::tvec4 Result; + for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + //////////////////////// + // mirrorRepeat + + template + GLM_FUNC_QUALIFIER genType mirrorRepeat + ( + genType const & Texcoord + ) + { + genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); + genType const Floor = glm::floor(Texcoord); + genType const Rest = Texcoord - Floor; + genType const Mirror = Clamp + Rest; + + genType Out; + if(Mirror >= genType(1)) + Out = genType(1) - Rest; + else + Out = Rest; + return Out; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mirrorRepeat + ( + detail::tvec2 const & Texcoord + ) + { + detail::tvec2 Result; + for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mirrorRepeat + ( + detail::tvec3 const & Texcoord + ) + { + detail::tvec3 Result; + for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mirrorRepeat + ( + detail::tvec4 const & Texcoord + ) + { + detail::tvec4 Result; + for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } }//namespace glm