public boolean equals(final Matrix4 m2) {
   m2.toFloatArray(mTmp);
   if (m[0] != mTmp[0]
       || m[1] != mTmp[1]
       || m[2] != mTmp[2]
       || m[3] != mTmp[3]
       || m[4] != mTmp[4]
       || m[5] != mTmp[5]
       || m[6] != mTmp[6]
       || m[7] != mTmp[7]
       || m[8] != mTmp[8]
       || m[9] != mTmp[9]
       || m[10] != mTmp[10]
       || m[11] != mTmp[11]
       || m[12] != mTmp[12]
       || m[13] != mTmp[13]
       || m[14] != mTmp[14]
       || m[15] != mTmp[15]) return false;
   return true;
 }
 public Matrix4 subtract(final Matrix4 m2) {
   m2.toFloatArray(mTmp);
   return new Matrix4(
       m[0] - mTmp[0],
       m[1] - mTmp[1],
       m[2] - mTmp[2],
       m[3] - mTmp[3],
       m[4] - mTmp[4],
       m[5] - mTmp[5],
       m[6] - mTmp[6],
       m[7] - mTmp[7],
       m[8] - mTmp[8],
       m[9] - mTmp[9],
       m[10] - mTmp[10],
       m[11] - mTmp[11],
       m[12] - mTmp[12],
       m[13] - mTmp[13],
       m[14] - mTmp[14],
       m[15] - mTmp[15]);
 }
 public Matrix4 multiply(final Matrix4 m2) {
   m2.toFloatArray(mTmp);
   return new Matrix4(
       m[0] * mTmp[0] + m[1] * mTmp[4] + m[2] * mTmp[8] + m[3] * mTmp[12],
       m[0] * mTmp[1] + m[1] * mTmp[5] + m[2] * mTmp[9] + m[3] * mTmp[13],
       m[0] * mTmp[2] + m[1] * mTmp[6] + m[2] * mTmp[10] + m[3] * mTmp[14],
       m[0] * mTmp[3] + m[1] * mTmp[7] + m[2] * mTmp[11] + m[3] * mTmp[15],
       m[4] * mTmp[0] + m[5] * mTmp[4] + m[6] * mTmp[8] + m[7] * mTmp[12],
       m[4] * mTmp[1] + m[5] * mTmp[5] + m[6] * mTmp[9] + m[7] * mTmp[13],
       m[4] * mTmp[2] + m[5] * mTmp[6] + m[6] * mTmp[10] + m[7] * mTmp[14],
       m[4] * mTmp[3] + m[5] * mTmp[7] + m[6] * mTmp[11] + m[7] * mTmp[15],
       m[8] * mTmp[0] + m[9] * mTmp[4] + m[10] * mTmp[8] + m[11] * mTmp[12],
       m[8] * mTmp[1] + m[9] * mTmp[5] + m[10] * mTmp[9] + m[11] * mTmp[13],
       m[8] * mTmp[2] + m[9] * mTmp[6] + m[10] * mTmp[10] + m[11] * mTmp[14],
       m[8] * mTmp[3] + m[9] * mTmp[7] + m[10] * mTmp[11] + m[11] * mTmp[15],
       m[12] * mTmp[0] + m[13] * mTmp[4] + m[14] * mTmp[8] + m[15] * mTmp[12],
       m[12] * mTmp[1] + m[13] * mTmp[5] + m[14] * mTmp[9] + m[15] * mTmp[13],
       m[12] * mTmp[2] + m[13] * mTmp[6] + m[14] * mTmp[10] + m[15] * mTmp[14],
       m[12] * mTmp[3] + m[13] * mTmp[7] + m[14] * mTmp[11] + m[15] * mTmp[15]);
 }
 public Matrix4 add(Matrix4 m2) {
   m2.toFloatArray(mTmp);
   return new Matrix4(
       m[0] + mTmp[0],
       m[1] + mTmp[1],
       m[2] + mTmp[2],
       m[3] + mTmp[3],
       m[4] + mTmp[4],
       m[5] + mTmp[5],
       m[6] + mTmp[6],
       m[7] + mTmp[7],
       m[8] + mTmp[8],
       m[9] + mTmp[9],
       m[10] + mTmp[10],
       m[11] + mTmp[11],
       m[12] + mTmp[12],
       m[13] + mTmp[13],
       m[14] + mTmp[14],
       m[15] + mTmp[15]);
 }
 public Matrix4(Matrix4 other) {
   this();
   other.toFloatArray(mTmp);
   set(mTmp);
 }