Mat4 Mat4::Inverse()

in PlayAssetDelivery/NativeSample/common/ndk_helper/vecmath.cpp [109:178]


Mat4 Mat4::Inverse() {
  Mat4 ret;
  float det_1;
  float pos = 0;
  float neg = 0;
  float temp;

  temp = f_[0] * f_[5] * f_[10];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  temp = f_[4] * f_[9] * f_[2];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  temp = f_[8] * f_[1] * f_[6];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  temp = -f_[8] * f_[5] * f_[2];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  temp = -f_[4] * f_[1] * f_[10];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  temp = -f_[0] * f_[9] * f_[6];
  if (temp >= 0)
    pos += temp;
  else
    neg += temp;
  det_1 = pos + neg;

  if (det_1 == 0.0) {
    // Error
  } else {
    det_1 = 1.0f / det_1;
    ret.f_[0] = (f_[5] * f_[10] - f_[9] * f_[6]) * det_1;
    ret.f_[1] = -(f_[1] * f_[10] - f_[9] * f_[2]) * det_1;
    ret.f_[2] = (f_[1] * f_[6] - f_[5] * f_[2]) * det_1;
    ret.f_[4] = -(f_[4] * f_[10] - f_[8] * f_[6]) * det_1;
    ret.f_[5] = (f_[0] * f_[10] - f_[8] * f_[2]) * det_1;
    ret.f_[6] = -(f_[0] * f_[6] - f_[4] * f_[2]) * det_1;
    ret.f_[8] = (f_[4] * f_[9] - f_[8] * f_[5]) * det_1;
    ret.f_[9] = -(f_[0] * f_[9] - f_[8] * f_[1]) * det_1;
    ret.f_[10] = (f_[0] * f_[5] - f_[4] * f_[1]) * det_1;

    /* Calculate -C * inverse(A) */
    ret.f_[12] =
        -(f_[12] * ret.f_[0] + f_[13] * ret.f_[4] + f_[14] * ret.f_[8]);
    ret.f_[13] =
        -(f_[12] * ret.f_[1] + f_[13] * ret.f_[5] + f_[14] * ret.f_[9]);
    ret.f_[14] =
        -(f_[12] * ret.f_[2] + f_[13] * ret.f_[6] + f_[14] * ret.f_[10]);

    ret.f_[3] = 0.0f;
    ret.f_[7] = 0.0f;
    ret.f_[11] = 0.0f;
    ret.f_[15] = 1.0f;
  }

  *this = ret;
  return *this;
}