1/// @ref gtx_transform2 2/// @file glm/gtx/transform2.inl 3 4namespace glm 5{ 6 template <typename T, precision P> 7 GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX2D(tmat3x3<T, P> const& m, T s) 8 { 9 tmat3x3<T, P> r(1); 10 r[1][0] = s; 11 return m * r; 12 } 13 14 template <typename T, precision P> 15 GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY2D(tmat3x3<T, P> const& m, T s) 16 { 17 tmat3x3<T, P> r(1); 18 r[0][1] = s; 19 return m * r; 20 } 21 22 template <typename T, precision P> 23 GLM_FUNC_QUALIFIER tmat4x4<T, P> shearX3D(tmat4x4<T, P> const& m, T s, T t) 24 { 25 tmat4x4<T, P> r(1); 26 r[0][1] = s; 27 r[0][2] = t; 28 return m * r; 29 } 30 31 template <typename T, precision P> 32 GLM_FUNC_QUALIFIER tmat4x4<T, P> shearY3D(tmat4x4<T, P> const& m, T s, T t) 33 { 34 tmat4x4<T, P> r(1); 35 r[1][0] = s; 36 r[1][2] = t; 37 return m * r; 38 } 39 40 template <typename T, precision P> 41 GLM_FUNC_QUALIFIER tmat4x4<T, P> shearZ3D(tmat4x4<T, P> const& m, T s, T t) 42 { 43 tmat4x4<T, P> r(1); 44 r[2][0] = s; 45 r[2][1] = t; 46 return m * r; 47 } 48 49 template <typename T, precision P> 50 GLM_FUNC_QUALIFIER tmat3x3<T, P> reflect2D(tmat3x3<T, P> const& m, tvec3<T, P> const& normal) 51 { 52 tmat3x3<T, P> r(static_cast<T>(1)); 53 r[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x; 54 r[0][1] = -static_cast<T>(2) * normal.x * normal.y; 55 r[1][0] = -static_cast<T>(2) * normal.x * normal.y; 56 r[1][1] = static_cast<T>(1) - static_cast<T>(2) * normal.y * normal.y; 57 return m * r; 58 } 59 60 template <typename T, precision P> 61 GLM_FUNC_QUALIFIER tmat4x4<T, P> reflect3D(tmat4x4<T, P> const& m, tvec3<T, P> const& normal) 62 { 63 tmat4x4<T, P> r(static_cast<T>(1)); 64 r[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x; 65 r[0][1] = -static_cast<T>(2) * normal.x * normal.y; 66 r[0][2] = -static_cast<T>(2) * normal.x * normal.z; 67 68 r[1][0] = -static_cast<T>(2) * normal.x * normal.y; 69 r[1][1] = static_cast<T>(1) - static_cast<T>(2) * normal.y * normal.y; 70 r[1][2] = -static_cast<T>(2) * normal.y * normal.z; 71 72 r[2][0] = -static_cast<T>(2) * normal.x * normal.z; 73 r[2][1] = -static_cast<T>(2) * normal.y * normal.z; 74 r[2][2] = static_cast<T>(1) - static_cast<T>(2) * normal.z * normal.z; 75 return m * r; 76 } 77 78 template <typename T, precision P> 79 GLM_FUNC_QUALIFIER tmat3x3<T, P> proj2D( 80 const tmat3x3<T, P>& m, 81 const tvec3<T, P>& normal) 82 { 83 tmat3x3<T, P> r(static_cast<T>(1)); 84 r[0][0] = static_cast<T>(1) - normal.x * normal.x; 85 r[0][1] = - normal.x * normal.y; 86 r[1][0] = - normal.x * normal.y; 87 r[1][1] = static_cast<T>(1) - normal.y * normal.y; 88 return m * r; 89 } 90 91 template <typename T, precision P> 92 GLM_FUNC_QUALIFIER tmat4x4<T, P> proj3D( 93 const tmat4x4<T, P>& m, 94 const tvec3<T, P>& normal) 95 { 96 tmat4x4<T, P> r(static_cast<T>(1)); 97 r[0][0] = static_cast<T>(1) - normal.x * normal.x; 98 r[0][1] = - normal.x * normal.y; 99 r[0][2] = - normal.x * normal.z; 100 r[1][0] = - normal.x * normal.y; 101 r[1][1] = static_cast<T>(1) - normal.y * normal.y; 102 r[1][2] = - normal.y * normal.z; 103 r[2][0] = - normal.x * normal.z; 104 r[2][1] = - normal.y * normal.z; 105 r[2][2] = static_cast<T>(1) - normal.z * normal.z; 106 return m * r; 107 } 108 109 template <typename T, precision P> 110 GLM_FUNC_QUALIFIER tmat4x4<T, P> scaleBias(T scale, T bias) 111 { 112 tmat4x4<T, P> result; 113 result[3] = tvec4<T, P>(tvec3<T, P>(bias), static_cast<T>(1)); 114 result[0][0] = scale; 115 result[1][1] = scale; 116 result[2][2] = scale; 117 return result; 118 } 119 120 template <typename T, precision P> 121 GLM_FUNC_QUALIFIER tmat4x4<T, P> scaleBias(tmat4x4<T, P> const& m, T scale, T bias) 122 { 123 return m * scaleBias(scale, bias); 124 } 125}//namespace glm 126 127