@ -26,388 +26,387 @@
/// @author Christophe Riccio
/// @author Christophe Riccio
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace glm
template <typename T>
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate
(
detail::tmat4x4<T> const & m,
detail::tvec3<T> const & v
)
{
{
detail::tmat4x4<T> Result(m);
template <typename T>
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate
return Result;
(
}
detail::tmat4x4<T> const & m,
detail::tvec3<T> const & v
template <typename T>
)
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate
{
(
detail::tmat4x4<T> Result(m);
detail::tmat4x4<T> const & m,
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
T const & angle,
return Result;
detail::tvec3<T> const & v
}
)
{
template <typename T>
T a = radians(angle);
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate
T c = cos(a);
(
T s = sin(a);
detail::tmat4x4<T> const & m,
T const & angle,
detail::tvec3<T> axis = normalize(v);
detail::tvec3<T> const & v
)
detail::tvec3<T> temp = (T(1) - c) * axis;
{
T a = radians(angle);
detail::tmat4x4<T> Rotate(detail::tmat4x4<T>::null);
T c = cos(a);
Rotate[0][0] = c + temp[0] * axis[0];
T s = sin(a);
Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];
detail::tvec3<T> axis = normalize(v);
Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
detail::tvec3<T> temp = (T(1) - c) * axis;
Rotate[1][1] = c + temp[1] * axis[1];
Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
detail::tmat4x4<T> Rotate(detail::tmat4x4<T>::null);
Rotate[0][0] = c + temp[0] * axis[0];
Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];
Rotate[2][2] = c + temp[2] * axis[2];
Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
Rotate[1][1] = c + temp[1] * axis[1];
Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
Result[3] = m[3];
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
return Result;
Rotate[2][2] = c + temp[2] * axis[2];
}
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
template <typename T>
Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale
Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
(
Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
detail::tmat4x4<T> const & m,
Result[3] = m[3];
detail::tvec3<T> const & v
return Result;
)
}
{
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
template <typename T>
Result[0] = m[0] * v[0];
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale
Result[1] = m[1] * v[1];
(
Result[2] = m[2] * v[2];
detail::tmat4x4<T> const & m,
Result[3] = m[3];
detail::tvec3<T> const & v
return Result;
)
}
{
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
template <typename T>
Result[0] = m[0] * v[0];
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate_slow
Result[1] = m[1] * v[1];
(
Result[2] = m[2] * v[2];
detail::tmat4x4<T> const & m,
Result[3] = m[3];
detail::tvec3<T> const & v
return Result;
)
}
{
detail::tmat4x4<T> Result(T(1));
template <typename T>
Result[3] = detail::tvec4<T>(v, T(1));
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate_slow
return m * Result;
(
detail::tmat4x4<T> const & m,
//detail::tmat4x4<valType> Result(m);
detail::tvec3<T> const & v
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
)
//Result[3][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0];
{
//Result[3][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1];
detail::tmat4x4<T> Result(T(1));
//Result[3][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
Result[3] = detail::tvec4<T>(v, T(1));
//Result[3][3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
return m * Result;
//return Result;
}
//detail::tmat4x4<valType> Result(m);
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
template <typename T>
//Result[3][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0];
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate_slow
//Result[3][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1];
(
//Result[3][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
detail::tmat4x4<T> const & m,
//Result[3][3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
T const & angle,
//return Result;
detail::tvec3<T> const & v
}
)
{
template <typename T>
T a = radians(angle);
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate_slow
T c = cos(a);
(
T s = sin(a);
detail::tmat4x4<T> const & m,
detail::tmat4x4<T> Result;
T const & angle,
detail::tvec3<T> const & v
detail::tvec3<T> axis = normalize(v);
)
{
Result[0][0] = c + (1 - c) * axis.x * axis.x;
T a = radians(angle);
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;
T c = cos(a);
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;
T s = sin(a);
Result[0][3] = 0;
detail::tmat4x4<T> Result;
Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;
detail::tvec3<T> axis = normalize(v);
Result[1][1] = c + (1 - c) * axis.y * axis.y;
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;
Result[0][0] = c + (1 - c) * axis.x * axis.x;
Result[1][3] = 0;
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;
Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;
Result[0][3] = 0;
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;
Result[2][2] = c + (1 - c) * axis.z * axis.z;
Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;
Result[2][3] = 0;
Result[1][1] = c + (1 - c) * axis.y * axis.y;
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
Result[1][3] = 0;
return m * Result;
}
Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;
template <typename T>
Result[2][2] = c + (1 - c) * axis.z * axis.z;
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale_slow
Result[2][3] = 0;
(
detail::tmat4x4<T> const & m,
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
detail::tvec3<T> const & v
return m * Result;
)
}
{
detail::tmat4x4<T> Result(T(1));
template <typename T>
Result[0][0] = v.x;
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale_slow
Result[1][1] = v.y;
(
Result[2][2] = v.z;
detail::tmat4x4<T> const & m,
return m * Result;
detail::tvec3<T> const & v
}
)
{
template <typename valType>
detail::tmat4x4<T> Result(T(1));
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
Result[0][0] = v.x;
(
Result[1][1] = v.y;
valType const & left,
Result[2][2] = v.z;
valType const & right,
return m * Result;
valType const & bottom,
}
valType const & top,
valType const & zNear,
template <typename valType>
valType const & zFar
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
)
(
{
valType const & left,
detail::tmat4x4<valType> Result(1);
valType const & right,
Result[0][0] = valType(2) / (right - left);
valType const & bottom,
Result[1][1] = valType(2) / (top - bottom);
valType const & top,
Result[2][2] = - valType(2) / (zFar - zNear);
valType const & zNear,
Result[3][0] = - (right + left) / (right - left);
valType const & zFar
Result[3][1] = - (top + bottom) / (top - bottom);
)
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
{
return Result;
detail::tmat4x4<valType> Result(1);
}
Result[0][0] = valType(2) / (right - left);
Result[1][1] = valType(2) / (top - bottom);
template <typename valType>
Result[2][2] = - valType(2) / (zFar - zNear);
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho(
Result[3][0] = - (right + left) / (right - left);
valType const & left,
Result[3][1] = - (top + bottom) / (top - bottom);
valType const & right,
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
valType const & bottom,
return Result;
valType const & top)
}
{
detail::tmat4x4<valType> Result(1);
template <typename valType>
Result[0][0] = valType(2) / (right - left);
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho(
Result[1][1] = valType(2) / (top - bottom);
valType const & left,
Result[2][2] = - valType(1);
valType const & right,
Result[3][0] = - (right + left) / (right - left);
valType const & bottom,
Result[3][1] = - (top + bottom) / (top - bottom);
valType const & top)
return Result;
{
}
detail::tmat4x4<valType> Result(1);
Result[0][0] = valType(2) / (right - left);
template <typename valType>
Result[1][1] = valType(2) / (top - bottom);
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> frustum
Result[2][2] = - valType(1);
(
Result[3][0] = - (right + left) / (right - left);
valType const & left,
Result[3][1] = - (top + bottom) / (top - bottom);
valType const & right,
return Result;
valType const & bottom,
}
valType const & top,
valType const & nearVal,
template <typename valType>
valType const & farVal
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> frustum
)
(
{
valType const & left,
detail::tmat4x4<valType> Result(0);
valType const & right,
Result[0][0] = (valType(2) * nearVal) / (right - left);
valType const & bottom,
Result[1][1] = (valType(2) * nearVal) / (top - bottom);
valType const & top,
Result[2][0] = (right + left) / (right - left);
valType const & nearVal,
Result[2][1] = (top + bottom) / (top - bottom);
valType const & farVal
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
)
Result[2][3] = valType(-1);
{
Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);
detail::tmat4x4<valType> Result(0);
return Result;
Result[0][0] = (valType(2) * nearVal) / (right - left);
}
Result[1][1] = (valType(2) * nearVal) / (top - bottom);
Result[2][0] = (right + left) / (right - left);
template <typename valType>
Result[2][1] = (top + bottom) / (top - bottom);
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspective
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
(
Result[2][3] = valType(-1);
valType const & fovy,
Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);
valType const & aspect,
return Result;
valType const & zNear,
}
valType const & zFar
)
template <typename valType>
{
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspective
valType range = tan(radians(fovy / valType(2))) * zNear;
(
valType left = -range * aspect;
valType const & fovy,
valType right = range * aspect;
valType const & aspect,
valType bottom = -range;
valType const & zNear,
valType top = range;
valType const & zFar
)
detail::tmat4x4<valType> Result(valType(0));
{
Result[0][0] = (valType(2) * zNear) / (right - left);
valType range = tan(radians(fovy / valType(2))) * zNear;
Result[1][1] = (valType(2) * zNear) / (top - bottom);
valType left = -range * aspect;
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
valType right = range * aspect;
Result[2][3] = - valType(1);
valType bottom = -range;
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
valType top = range;
return Result;
}
detail::tmat4x4<valType> Result(valType(0));
Result[0][0] = (valType(2) * zNear) / (right - left);
template <typename valType>
Result[1][1] = (valType(2) * zNear) / (top - bottom);
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspectiveFov
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
(
Result[2][3] = - valType(1);
valType const & fov,
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
valType const & width,
return Result;
valType const & height,
}
valType const & zNear,
valType const & zFar
template <typename valType>
)
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspectiveFov
{
(
valType rad = glm::radians(fov);
valType const & fov,
valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);
valType const & width,
valType w = h * height / width;
valType const & height,
valType const & zNear,
detail::tmat4x4<valType> Result(valType(0));
valType const & zFar
Result[0][0] = w;
)
Result[1][1] = h;
{
Result[2][2] = (zFar + zNear) / (zFar - zNear);
valType rad = glm::radians(fov);
Result[2][3] = valType(1);
valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);
Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);
valType w = h * height / width;
return Result;
}
detail::tmat4x4<valType> Result(valType(0));
Result[0][0] = w;
template <typename T>
Result[1][1] = h;
GLM_FUNC_QUALIFIER detail::tmat4x4<T> infinitePerspective
Result[2][2] = (zFar + zNear) / (zFar - zNear);
(
Result[2][3] = valType(1);
T fovy,
Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);
T aspect,
return Result;
T zNear
}
)
{
template <typename T>
T range = tan(radians(fovy / T(2))) * zNear;
GLM_FUNC_QUALIFIER detail::tmat4x4<T> infinitePerspective
T left = -range * aspect;
(
T right = range * aspect;
T fovy,
T bottom = -range;
T aspect,
T top = range;
T zNear
)
detail::tmat4x4<T> Result(T(0));
{
Result[0][0] = (T(2) * zNear) / (right - left);
T range = tan(radians(fovy / T(2))) * zNear;
Result[1][1] = (T(2) * zNear) / (top - bottom);
T left = -range * aspect;
Result[2][2] = - T(1);
T right = range * aspect;
Result[2][3] = - T(1);
T bottom = -range;
Result[3][2] = - T(2) * zNear;
T top = range;
return Result;
}
detail::tmat4x4<T> Result(T(0));
Result[0][0] = (T(2) * zNear) / (right - left);
template <typename T>
Result[1][1] = (T(2) * zNear) / (top - bottom);
GLM_FUNC_QUALIFIER detail::tmat4x4<T> tweakedInfinitePerspective
Result[2][2] = - T(1);
(
Result[2][3] = - T(1);
T fovy,
Result[3][2] = - T(2) * zNear;
T aspect,
return Result;
T zNear
}
)
{
template <typename T>
T range = tan(radians(fovy / T(2))) * zNear;
GLM_FUNC_QUALIFIER detail::tmat4x4<T> tweakedInfinitePerspective
T left = -range * aspect;
(
T right = range * aspect;
T fovy,
T bottom = -range;
T aspect,
T top = range;
T zNear
)
detail::tmat4x4<T> Result(T(0));
{
Result[0][0] = (T(2) * zNear) / (right - left);
T range = tan(radians(fovy / T(2))) * zNear;
Result[1][1] = (T(2) * zNear) / (top - bottom);
T left = -range * aspect;
Result[2][2] = T(0.0001) - T(1);
T right = range * aspect;
Result[2][3] = T(-1);
T bottom = -range;
Result[3][2] = - (T(0.0001) - T(2)) * zNear;
T top = range;
return Result;
}
detail::tmat4x4<T> Result(T(0));
Result[0][0] = (T(2) * zNear) / (right - left);
template <typename T, typename U>
Result[1][1] = (T(2) * zNear) / (top - bottom);
GLM_FUNC_QUALIFIER detail::tvec3<T> project
Result[2][2] = T(0.0001) - T(1);
(
Result[2][3] = T(-1);
detail::tvec3<T> const & obj,
Result[3][2] = - (T(0.0001) - T(2)) * zNear;
detail::tmat4x4<T> const & model,
return Result;
detail::tmat4x4<T> const & proj,
}
detail::tvec4<U> const & viewport
)
template <typename T, typename U>
{
GLM_FUNC_QUALIFIER detail::tvec3<T> project
detail::tvec4<T> tmp = detail::tvec4<T>(obj, T(1));
(
tmp = model * tmp;
detail::tvec3<T> const & obj,
tmp = proj * tmp;
detail::tmat4x4<T> const & model,
detail::tmat4x4<T> const & proj,
tmp /= tmp.w;
detail::tvec4<U> const & viewport
tmp = tmp * T(0.5) + T(0.5);
)
tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
{
tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
detail::tvec4<T> tmp = detail::tvec4<T>(obj, T(1));
tmp = model * tmp;
return detail::tvec3<T>(tmp);
tmp = proj * tmp;
}
tmp /= tmp.w;
template <typename T, typename U>
tmp = tmp * T(0.5) + T(0.5);
GLM_FUNC_QUALIFIER detail::tvec3<T> unProject
tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
(
tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
detail::tvec3<T> const & win,
detail::tmat4x4<T> const & model,
return detail::tvec3<T>(tmp);
detail::tmat4x4<T> const & proj,
}
detail::tvec4<U> const & viewport
)
template <typename T, typename U>
{
GLM_FUNC_QUALIFIER detail::tvec3<T> unProject
detail::tmat4x4<T> inverse = glm::inverse(proj * model);
(
detail::tvec3<T> const & win,
detail::tvec4<T> tmp = detail::tvec4<T>(win, T(1));
detail::tmat4x4<T> const & model,
tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
detail::tmat4x4<T> const & proj,
tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
detail::tvec4<U> const & viewport
tmp = tmp * T(2) - T(1);
)
{
detail::tvec4<T> obj = inverse * tmp;
detail::tmat4x4<T> inverse = glm::inverse(proj * model);
obj /= obj.w;
detail::tvec4<T> tmp = detail::tvec4<T>(win, T(1));
return detail::tvec3<T>(obj);
tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
}
tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
tmp = tmp * T(2) - T(1);
template <typename T, typename U>
detail::tmat4x4<T> pickMatrix
detail::tvec4<T> obj = inverse * tmp;
(
obj /= obj.w;
detail::tvec2<T> const & center,
detail::tvec2<T> const & delta,
return detail::tvec3<T>(obj);
detail::tvec4<U> const & viewport
}
)
{
template <typename T, typename U>
assert(delta.x > T(0) && delta.y > T(0));
detail::tmat4x4<T> pickMatrix
detail::tmat4x4<T> Result(1.0f);
(
detail::tvec2<T> const & center,
if(!(delta.x > T(0) && delta.y > T(0)))
detail::tvec2<T> const & delta,
return Result; // Error
detail::tvec4<U> const & viewport
)
detail::tvec3<T> Temp(
{
(T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x,
assert(delta.x > T(0) && delta.y > T(0));
(T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y,
detail::tmat4x4<T> Result(1.0f);
T(0));
if(!(delta.x > T(0) && delta.y > T(0)))
// Translate and scale the picked region to the entire window
return Result; // Error
Result = translate(Result, Temp);
return scale(Result, detail::tvec3<T>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1)));
detail::tvec3<T> Temp(
}
(T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x,
(T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y,
template <typename T>
T(0));
GLM_FUNC_QUALIFIER detail::tmat4x4<T> lookAt
(
// Translate and scale the picked region to the entire window
detail::tvec3<T> const & eye,
Result = translate(Result, Temp);
detail::tvec3<T> const & center,
return scale(Result, detail::tvec3<T>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1)));
detail::tvec3<T> const & up
}
)
{
template <typename T>
detail::tvec3<T> f = normalize(center - eye);
GLM_FUNC_QUALIFIER detail::tmat4x4<T> lookAt
detail::tvec3<T> u = normalize(up);
(
detail::tvec3<T> s = normalize(cross(f, u));
detail::tvec3<T> const & eye,
u = cross(s, f);
detail::tvec3<T> const & center,
detail::tvec3<T> const & up
detail::tmat4x4<T> Result(1);
)
Result[0][0] = s.x;
{
Result[1][0] = s.y;
detail::tvec3<T> f = normalize(center - eye);
Result[2][0] = s.z;
detail::tvec3<T> u = normalize(up);
Result[0][1] = u.x;
detail::tvec3<T> s = normalize(cross(f, u));
Result[1][1] = u.y;
u = cross(s, f);
Result[2][1] = u.z;
Result[0][2] =-f.x;
detail::tmat4x4<T> Result(1);
Result[1][2] =-f.y;
Result[0][0] = s.x;
Result[2][2] =-f.z;
Result[1][0] = s.y;
/* Test this instead of translate3D
Result[2][0] = s.z;
Result[3][0] =-dot(s, eye);
Result[0][1] = u.x;
Result[3][1] =-dot(y, eye);
Result[1][1] = u.y;
Result[3][2] = dot(f, eye);
Result[2][1] = u.z;
*/
Result[0][2] =-f.x;
return translate(Result, -eye);
Result[1][2] =-f.y;
}
Result[2][2] =-f.z;
/* Test this instead of translate3D
Result[3][0] =-dot(s, eye);
Result[3][1] =-dot(y, eye);
Result[3][2] = dot(f, eye);
*/
return translate(Result, -eye);
}
}//namespace glm
}//namespace glm