package javajs.util; /** * A base class for both M3 and M4 to conserve code size. * * @author Kenji hiranabe * * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique * constructor and method names for the optimization of compiled * JavaScript using Java2Script and for subclassing to M3 and M4 * */ public abstract class M34 { /** * The first element of the first row */ public float m00; /** * The second element of the first row. */ public float m01; /** * third element of the first row. */ public float m02; /** * The first element of the second row. */ public float m10; /** * The second element of the second row. */ public float m11; /** * The third element of the second row. */ public float m12; /** * The first element of the third row. */ public float m20; /** * The second element of the third row. */ public float m21; /** * The third element of the third row. */ public float m22; protected void setAA33(A4 a) { double x = a.x; double y = a.y; double z = a.z; double angle = a.angle; // Taken from Rick's which is taken from Wertz. pg. 412 // Bug Fixed and changed into right-handed by hiranabe double n = Math.sqrt(x * x + y * y + z * z); // zero-div may occur n = 1 / n; x *= n; y *= n; z *= n; double c = Math.cos(angle); double s = Math.sin(angle); double omc = 1.0 - c; m00 = (float) (c + x * x * omc); m11 = (float) (c + y * y * omc); m22 = (float) (c + z * z * omc); double tmp1 = x * y * omc; double tmp2 = z * s; m01 = (float) (tmp1 - tmp2); m10 = (float) (tmp1 + tmp2); tmp1 = x * z * omc; tmp2 = y * s; m02 = (float) (tmp1 + tmp2); m20 = (float) (tmp1 - tmp2); tmp1 = y * z * omc; tmp2 = x * s; m12 = (float) (tmp1 - tmp2); m21 = (float) (tmp1 + tmp2); } public void rotate(T3 t) { // alias-safe rotate2(t, t); } /** * Transform the vector vec using this Matrix3f and place the result into * vecOut. * * @param t * the single precision vector to be transformed * @param result * the vector into which the transformed values are placed */ public void rotate2(T3 t, T3 result) { // alias-safe result.set(m00 * t.x + m01 * t.y + m02 * t.z, m10 * t.x + m11 * t.y + m12 * t.z, m20 * t.x + m21 * t.y + m22 * t.z); } /** * Sets the value of this matrix to the double value of the Matrix3f argument. * * @param m1 * the matrix3f */ protected void setM33(M34 m1) { m00 = m1.m00; m01 = m1.m01; m02 = m1.m02; m10 = m1.m10; m11 = m1.m11; m12 = m1.m12; m20 = m1.m20; m21 = m1.m21; m22 = m1.m22; } protected void clear33() { m00 = m01 = m02 = m10 = m11 = m12 = m20 = m21 = m22 = 0.0f; } protected void set33(int row, int col, float v) { switch (row) { case 0: switch (col) { case 0: m00 = v; return; case 1: m01 = v; return; case 2: m02 = v; return; } break; case 1: switch (col) { case 0: m10 = v; return; case 1: m11 = v; return; case 2: m12 = v; return; } break; case 2: switch (col) { case 0: m20 = v; return; case 1: m21 = v; return; case 2: m22 = v; return; } break; } err(); } protected float get33(int row, int col) { switch (row) { case 0: switch (col) { case 0: return m00; case 1: return m01; case 2: return m02; } break; case 1: switch (col) { case 0: return m10; case 1: return m11; case 2: return m12; } break; case 2: switch (col) { case 0: return m20; case 1: return m21; case 2: return m22; } break; } err(); return 0; } protected void setRow33(int row, float v[]) { switch (row) { case 0: m00 = v[0]; m01 = v[1]; m02 = v[2]; return; case 1: m10 = v[0]; m11 = v[1]; m12 = v[2]; return; case 2: m20 = v[0]; m21 = v[1]; m22 = v[2]; return; default: err(); } } public abstract void getRow(int row, float v[]); protected void getRow33(int row, float v[]) { switch (row) { case 0: v[0] = m00; v[1] = m01; v[2] = m02; return; case 1: v[0] = m10; v[1] = m11; v[2] = m12; return; case 2: v[0] = m20; v[1] = m21; v[2] = m22; return; } err(); } protected void setColumn33(int column, float v[]) { switch(column) { case 0: m00 = v[0]; m10 = v[1]; m20 = v[2]; break; case 1: m01 = v[0]; m11 = v[1]; m21 = v[2]; break; case 2: m02 = v[0]; m12 = v[1]; m22 = v[2]; break; default: err(); } } protected void getColumn33(int column, float v[]) { switch(column) { case 0: v[0] = m00; v[1] = m10; v[2] = m20; break; case 1: v[0] = m01; v[1] = m11; v[2] = m21; break; case 2: v[0] = m02; v[1] = m12; v[2] = m22; break; default: err(); } } protected void add33(M34 m1) { m00 += m1.m00; m01 += m1.m01; m02 += m1.m02; m10 += m1.m10; m11 += m1.m11; m12 += m1.m12; m20 += m1.m20; m21 += m1.m21; m22 += m1.m22; } protected void sub33(M34 m1) { m00 -= m1.m00; m01 -= m1.m01; m02 -= m1.m02; m10 -= m1.m10; m11 -= m1.m11; m12 -= m1.m12; m20 -= m1.m20; m21 -= m1.m21; m22 -= m1.m22; } protected void mul33(float x) { m00 *= x; m01 *= x; m02 *= x; m10 *= x; m11 *= x; m12 *= x; m20 *= x; m21 *= x; m22 *= x; } protected void transpose33() { float tmp = m01; m01 = m10; m10 = tmp; tmp = m02; m02 = m20; m20 = tmp; tmp = m12; m12 = m21; m21 = tmp; } protected void setXRot(float angle) { double c = Math.cos(angle); double s = Math.sin(angle); m00 = 1.0f; m01 = 0.0f; m02 = 0.0f; m10 = 0.0f; m11 = (float) c; m12 = (float) -s; m20 = 0.0f; m21 = (float) s; m22 = (float) c; } protected void setYRot(float angle) { double c = Math.cos(angle); double s = Math.sin(angle); m00 = (float) c; m01 = 0.0f; m02 = (float) s; m10 = 0.0f; m11 = 1.0f; m12 = 0.0f; m20 = (float) -s; m21 = 0.0f; m22 = (float) c; } protected void setZRot(float angle) { double c = Math.cos(angle); double s = Math.sin(angle); m00 = (float) c; m01 = (float) -s; m02 = 0.0f; m10 = (float) s; m11 = (float) c; m12 = 0.0f; m20 = 0.0f; m21 = 0.0f; m22 = 1.0f; } /** * @return 3x3 determinant */ public float determinant3() { return m00 * (m11 * m22 - m21 * m12) - m01 * (m10 * m22 - m20 * m12) + m02 * (m10 * m21 - m20 * m11); } protected void err() { throw new ArrayIndexOutOfBoundsException( "matrix column/row out of bounds"); } }