|
|
@@ -324,6 +324,25 @@ namespace matrix_transform
|
|
|
return detail::tvec3<T>(obj);
|
|
|
}
|
|
|
|
|
|
+ template <typename T, typename U>
|
|
|
+ detail::tmat4x4<T> pickMatrix
|
|
|
+ (
|
|
|
+ detail::tvec2<T> const & center,
|
|
|
+ detail::tvec2<T> const & delta,
|
|
|
+ detail::tvec4<U> const & viewport
|
|
|
+ )
|
|
|
+ {
|
|
|
+ assert(delta.x > 0.0f && delta.y > 0.0f)
|
|
|
+ detail::tmat4x4<T> 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 <typename T>
|
|
|
inline detail::tmat4x4<T> lookAt(
|
|
|
const detail::tvec3<T>& eye,
|