|
|
|
@ -3,147 +3,56 @@ |
|
|
|
|
|
|
|
|
|
namespace glm |
|
|
|
|
{ |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType clamp(genType const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
return glm::clamp(Texcoord, genType(0), genType(1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec2<T, P> clamp(tvec2<T, P> const & Texcoord) |
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<T, P> clamp(vecType<T, P> const& Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec2<T, P> Result; |
|
|
|
|
for(typename tvec2<T, P>::size_type i = 0; i < tvec2<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = clamp_to_edge(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return glm::clamp(Texcoord, vecType<T, P>(0), vecType<T, P>(1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec3<T, P> clamp(tvec3<T, P> const & Texcoord) |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType clamp(genType const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec3<T, P> Result; |
|
|
|
|
for(typename tvec3<T, P>::size_type i = 0; i < tvec3<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = clamp_to_edge(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return clamp(tvec1<genType, defaultp>(Texcoord)).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec4<T, P> clamp(tvec4<T, P> const & Texcoord) |
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<T, P> repeat(vecType<T, P> const& Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec4<T, P> Result; |
|
|
|
|
for(typename tvec4<T, P>::size_type i = 0; i < tvec4<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = clamp_to_edge(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return glm::fract(Texcoord); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType repeat(genType const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
return glm::fract(Texcoord); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec2<T, P> repeat(tvec2<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec2<T, P> Result; |
|
|
|
|
for(typename tvec2<T, P>::size_type i = 0; i < tvec2<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = repeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec3<T, P> repeat(tvec3<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec3<T, P> Result; |
|
|
|
|
for(typename tvec3<T, P>::size_type i = 0; i < tvec3<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = repeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return repeat(tvec1<genType, defaultp>(Texcoord)).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec4<T, P> repeat(tvec4<T, P> const & Texcoord) |
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<T, P> mirrorClamp(vecType<T, P> const& Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec4<T, P> Result; |
|
|
|
|
for(typename tvec4<T, P>::size_type i = 0; i < tvec4<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = repeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return glm::fract(glm::abs(Texcoord)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType mirrorClamp(genType const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
return glm::fract(glm::abs(Texcoord)); |
|
|
|
|
//return glm::mod(glm::abs(Texcoord), 1.0f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec2<T, P> mirrorClamp(tvec2<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec2<T, P> Result; |
|
|
|
|
for(typename tvec2<T, P>::size_type i = 0; i < tvec2<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorClamp(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec3<T, P> mirrorClamp(tvec3<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec3<T, P> Result; |
|
|
|
|
for(typename tvec3<T, P>::size_type i = 0; i < tvec3<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorClamp(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return mirrorClamp(tvec1<genType, defaultp>(Texcoord)).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec4<T, P> mirrorClamp(tvec4<T, P> const & Texcoord) |
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<T, P> mirrorRepeat(vecType<T, P> const& Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec4<T, P> Result; |
|
|
|
|
for(typename tvec4<T, P>::size_type i = 0; i < tvec4<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorClamp(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
vecType<T, P> const Abs = glm::abs(Texcoord); |
|
|
|
|
vecType<T, P> const Clamp = glm::mod(glm::floor(Abs), vecType<T, P>(2)); |
|
|
|
|
vecType<T, P> const Floor = glm::floor(Abs); |
|
|
|
|
vecType<T, P> const Rest = Abs - Floor; |
|
|
|
|
vecType<T, P> const Mirror = Clamp + Rest; |
|
|
|
|
return mix(Rest, vecType<T, P>(1) - Rest, glm::greaterThanEqual(Mirror, vecType<T, P>(1))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
genType const Abs = glm::abs(Texcoord); |
|
|
|
|
genType const Clamp = genType(int(glm::floor(Abs)) % 2); |
|
|
|
|
genType const Floor = glm::floor(Abs); |
|
|
|
|
genType const Rest = Abs - Floor; |
|
|
|
|
genType const Mirror = Clamp + Rest; |
|
|
|
|
|
|
|
|
|
genType Out; |
|
|
|
|
if(Mirror >= genType(1)) |
|
|
|
|
Out = genType(1) - Rest; |
|
|
|
|
else |
|
|
|
|
Out = Rest; |
|
|
|
|
return Out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec2<T, P> mirrorRepeat(tvec2<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec2<T, P> Result; |
|
|
|
|
for(typename tvec2<T, P>::size_type i = 0; i < tvec2<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorRepeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec3<T, P> mirrorRepeat(tvec3<T, P> const & Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec3<T, P> Result; |
|
|
|
|
for(typename tvec3<T, P>::size_type i = 0; i < tvec3<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorRepeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tvec4<T, P> mirrorRepeat(tvec4<T, P> const & Texcoord) |
|
|
|
|
GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord) |
|
|
|
|
{ |
|
|
|
|
tvec4<T, P> Result; |
|
|
|
|
for(typename tvec4<T, P>::size_type i = 0; i < tvec4<T, P>::value_size(); ++i) |
|
|
|
|
Result[i] = mirrorRepeat(Texcoord[i]); |
|
|
|
|
return Result; |
|
|
|
|
return mirrorRepeat(tvec1<genType, defaultp>(Texcoord)).x; |
|
|
|
|
} |
|
|
|
|
}//namespace glm |
|
|
|
|