diff --git a/glm/gtc/matrix_transform.hpp b/glm/gtc/matrix_transform.hpp index 477dc2eb..f7d466f8 100644 --- a/glm/gtc/matrix_transform.hpp +++ b/glm/gtc/matrix_transform.hpp @@ -133,6 +133,14 @@ namespace glm detail::tmat4x4 const & proj, detail::tvec4 const & viewport); + //! Define a picking region + //! From GLM_GTC_matrix_transform extension. + template + detail::tmat4x4 pickMatrix( + detail::tvec2 const & center, + detail::tvec2 const & delta, + detail::tvec4 const & viewport); + //! Build a look at view matrix. //! From GLM_GTC_matrix_transform extension. template diff --git a/glm/gtc/matrix_transform.inl b/glm/gtc/matrix_transform.inl index 858fa68c..b8e79ca2 100644 --- a/glm/gtc/matrix_transform.inl +++ b/glm/gtc/matrix_transform.inl @@ -324,6 +324,25 @@ namespace matrix_transform return detail::tvec3(obj); } + template + detail::tmat4x4 pickMatrix + ( + detail::tvec2 const & center, + detail::tvec2 const & delta, + detail::tvec4 const & viewport + ) + { + assert(delta.x > 0.0f && delta.y > 0.0f) + detail::tmat4x4 Result(1.0f); + + if(!(delta.x > 0.0f && delta.y > 0.0f)) + return Result; // Error + + // Translate and scale the picked region to the entire window + Result = translate(Result, (T(viewport[2]) - T(2) * (x - T(viewport[0]))) / delta.x, (T(viewport[3]) - T(2) * (y - T(viewport[1]))) / delta.y, T(0)); + return scale(Result, T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1)); + } + template inline detail::tmat4x4 lookAt( const detail::tvec3& eye,