Fixed non power of two matrix products

master
Christophe Riccio ago%!(EXTRA string=11 years)
parent c3e4881833
commit dd272c52ee
  1. 2
      glm/detail/func_common.inl
  2. 20
      glm/detail/func_matrix.inl
  3. 2
      glm/detail/intrinsic_matrix.inl
  4. 2
      glm/detail/type_mat2x3.inl
  5. 2
      glm/detail/type_mat2x4.inl
  6. 2
      glm/detail/type_mat3x2.inl
  7. 2
      glm/detail/type_mat3x4.inl
  8. 2
      glm/detail/type_mat4x2.inl
  9. 2
      glm/detail/type_mat4x3.inl
  10. 4
      glm/gtx/rotate_normalized_axis.inl
  11. 1
      readme.txt
  12. 2
      test/core/core_func_matrix.cpp

@ -88,7 +88,7 @@ namespace detail
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(
std::numeric_limits<genFIType>::is_iec559 || std::numeric_limits<genFIType>::is_iec559 ||
(std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer, "'sign' only accept signed inputs")); (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), "'sign' only accept signed inputs");
genFIType result; genFIType result;
if(x > genFIType(0)) if(x > genFIType(0))

@ -45,7 +45,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec2>::type call(detail::tvec2<T, P> const & c, detail::tvec2<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec2>::type call(detail::tvec2<T, P> const & c, detail::tvec2<T, P> const & r)
{ {
detail::tmat2x2<T, P> m(detail::tmat2x2<T, P>::null); detail::tmat2x2<T, P> m(detail::tmat2x2<T, P>::_null);
m[0][0] = c[0] * r[0]; m[0][0] = c[0] * r[0];
m[0][1] = c[1] * r[0]; m[0][1] = c[1] * r[0];
m[1][0] = c[0] * r[1]; m[1][0] = c[0] * r[1];
@ -59,7 +59,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec3>::type call(detail::tvec3<T, P> const & c, detail::tvec3<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec3>::type call(detail::tvec3<T, P> const & c, detail::tvec3<T, P> const & r)
{ {
detail::tmat3x3<T, P> m(detail::tmat3x3<T, P>::null); detail::tmat3x3<T, P> m(detail::tmat3x3<T, P>::_null);
for(length_t i(0); i < m.length(); ++i) for(length_t i(0); i < m.length(); ++i)
m[i] = c * r[i]; m[i] = c * r[i];
return m; return m;
@ -71,7 +71,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec4>::type call(detail::tvec4<T, P> const & c, detail::tvec4<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec4>::type call(detail::tvec4<T, P> const & c, detail::tvec4<T, P> const & r)
{ {
detail::tmat4x4<T, P> m(detail::tmat4x4<T, P>::null); detail::tmat4x4<T, P> m(detail::tmat4x4<T, P>::_null);
for(length_t i(0); i < m.length(); ++i) for(length_t i(0); i < m.length(); ++i)
m[i] = c * r[i]; m[i] = c * r[i];
return m; return m;
@ -83,7 +83,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec2>::type call(detail::tvec3<T, P> const & c, detail::tvec2<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec2>::type call(detail::tvec3<T, P> const & c, detail::tvec2<T, P> const & r)
{ {
detail::tmat2x3<T, P> m(detail::tmat2x3<T, P>::null); detail::tmat2x3<T, P> m(detail::tmat2x3<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x; m[0][2] = c.z * r.x;
@ -99,7 +99,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec3>::type call(detail::tvec2<T, P> const & c, detail::tvec3<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec3>::type call(detail::tvec2<T, P> const & c, detail::tvec3<T, P> const & r)
{ {
detail::tmat3x2<T, P> m(detail::tmat3x2<T, P>::null); detail::tmat3x2<T, P> m(detail::tmat3x2<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[1][0] = c.x * r.y; m[1][0] = c.x * r.y;
@ -115,7 +115,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec2>::type call(detail::tvec4<T, P> const & c, detail::tvec2<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec2>::type call(detail::tvec4<T, P> const & c, detail::tvec2<T, P> const & r)
{ {
detail::tmat2x4<T, P> m(detail::tmat2x4<T, P>::null); detail::tmat2x4<T, P> m(detail::tmat2x4<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x; m[0][2] = c.z * r.x;
@ -133,7 +133,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec4>::type call(detail::tvec2<T, P> const & c, detail::tvec4<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec2, detail::tvec4>::type call(detail::tvec2<T, P> const & c, detail::tvec4<T, P> const & r)
{ {
detail::tmat4x2<T, P> m(detail::tmat4x2<T, P>::null); detail::tmat4x2<T, P> m(detail::tmat4x2<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[1][0] = c.x * r.y; m[1][0] = c.x * r.y;
@ -151,7 +151,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec3>::type call(detail::tvec4<T, P> const & c, detail::tvec3<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec4, detail::tvec3>::type call(detail::tvec4<T, P> const & c, detail::tvec3<T, P> const & r)
{ {
detail::tmat3x4<T, P> m(detail::tmat3x4<T, P>::null); detail::tmat3x4<T, P> m(detail::tmat3x4<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x; m[0][2] = c.z * r.x;
@ -173,7 +173,7 @@ namespace detail
{ {
GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec4>::type call(detail::tvec3<T, P> const & c, detail::tvec4<T, P> const & r) GLM_FUNC_QUALIFIER static typename detail::outerProduct_trait<T, P, detail::tvec3, detail::tvec4>::type call(detail::tvec3<T, P> const & c, detail::tvec4<T, P> const & r)
{ {
detail::tmat4x3<T, P> m(detail::tmat4x3<T, P>::null); detail::tmat4x3<T, P> m(detail::tmat4x3<T, P>::_null);
m[0][0] = c.x * r.x; m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x; m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x; m[0][2] = c.z * r.x;
@ -429,7 +429,7 @@ namespace detail
return result; return result;
} }
template<template <class, precision> class vecTypeA, template <class, precision> class vecTypeB, typename T, precision P> template<typename T, precision P, template <typename, precision> class vecTypeA, template <typename, precision> class vecTypeB>
GLM_FUNC_QUALIFIER typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r) GLM_FUNC_QUALIFIER typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type outerProduct(vecTypeA<T, P> const & c, vecTypeB<T, P> const & r)
{ {
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'outerProduct' only accept floating-point inputs"); GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'outerProduct' only accept floating-point inputs");

@ -1049,7 +1049,7 @@ GLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float con
Result[2] = TmpC4; Result[2] = TmpC4;
Result[3] = _mm_set_ps(1, 0, 0, 0); Result[3] = _mm_set_ps(1, 0, 0, 0);
//detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::null); //detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::_null);
//Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
//Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; //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]; //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];

@ -514,7 +514,7 @@ namespace detail
T SrcB20 = m2[2][0]; T SrcB20 = m2[2][0];
T SrcB21 = m2[2][1]; T SrcB21 = m2[2][1];
tmat3x3<T, P> Result(tmat3x3<T, P>::null); tmat3x3<T, P> Result(tmat3x3<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;

@ -508,7 +508,7 @@ namespace detail
T SrcB30 = m2[3][0]; T SrcB30 = m2[3][0];
T SrcB31 = m2[3][1]; T SrcB31 = m2[3][1];
tmat4x4<T, P> Result(tmat4x4<T, P>::null); tmat4x4<T, P> Result(tmat4x4<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;

@ -538,7 +538,7 @@ namespace detail
const T SrcB11 = m2[1][1]; const T SrcB11 = m2[1][1];
const T SrcB12 = m2[1][2]; const T SrcB12 = m2[1][2];
tmat2x2<T, P> Result(tmat2x2<T, P>::null); tmat2x2<T, P> Result(tmat2x2<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;

@ -553,7 +553,7 @@ namespace detail
const T SrcB31 = m2[3][1]; const T SrcB31 = m2[3][1];
const T SrcB32 = m2[3][2]; const T SrcB32 = m2[3][2];
tmat4x4<T, P> Result(tmat4x4<T, P>::null); tmat4x4<T, P> Result(tmat4x4<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;

@ -589,7 +589,7 @@ namespace detail
T const SrcB12 = m2[1][2]; T const SrcB12 = m2[1][2];
T const SrcB13 = m2[1][3]; T const SrcB13 = m2[1][3];
tmat2x2<T, P> Result(tmat2x2<T, P>::null); tmat2x2<T, P> Result(tmat2x2<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;

@ -583,7 +583,7 @@ namespace detail
T const SrcB22 = m2[2][2]; T const SrcB22 = m2[2][2];
T const SrcB23 = m2[2][3]; T const SrcB23 = m2[2][3];
tmat3x3<T, P> Result(tmat3x3<T, P>::null); tmat3x3<T, P> Result(tmat3x3<T, P>::_null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03; Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03;

@ -49,7 +49,7 @@ namespace glm
detail::tvec3<T, P> temp = (T(1) - c) * axis; detail::tvec3<T, P> temp = (T(1) - c) * axis;
detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::null); detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::_null);
Rotate[0][0] = c + temp[0] * axis[0]; Rotate[0][0] = c + temp[0] * axis[0];
Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];
@ -62,7 +62,7 @@ namespace glm
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
Rotate[2][2] = c + temp[2] * axis[2]; Rotate[2][2] = c + temp[2] * axis[2];
detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::null); detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);
Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; 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]; Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];

@ -40,6 +40,7 @@ http://glm.g-truc.net/glm.pdf
GLM 0.9.5.2: 2014-0X-XX GLM 0.9.5.2: 2014-0X-XX
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
- Fixed warnings with the Android NDK 9c - Fixed warnings with the Android NDK 9c
- Fixed non power of two matrix products
================================================================================ ================================================================================
GLM 0.9.5.1: 2014-01-11 GLM 0.9.5.1: 2014-01-11

@ -80,7 +80,7 @@ int test_matrixCompMult()
int test_outerProduct() int test_outerProduct()
{ {
glm::mat4 m = glm::outerProduct(glm::vec4(1.0f), glm::vec4(1.0f));
return 0; return 0;
} }

Loading…
Cancel
Save