// Matrix.java public class Matrix { public Matrix () {} public final float determinant () { return (m11 * m22 * m33 + m21 * m32 * m13 + m31 * m12 * m23) - m31 * m22 * m13 - m21 * m12 * m33 - m11 * m32 * m23; } public final void identity () { m11 = 1F; m12 = 0F; m13 = 0F; m14 = 0F; m21 = 0F; m22 = 1F; m23 = 0F; m24 = 0F; m31 = 0F; m32 = 0F; m33 = 1F; m34 = 0F; m41 = 0F; m42 = 0F; m43 = 0F; m44 = 1F; } public final void inverse (Matrix matrix) { float f = 1.0F / determinant (); matrix.m11 = (m22 * m33 - m32 * m23) * f; matrix.m12 = (m32 * m13 - m12 * m33) * f; matrix.m13 = (m12 * m23 - m22 * m13) * f; matrix.m21 = (m23 * m31 - m33 * m21) * f; matrix.m22 = (m33 * m11 - m13 * m31) * f; matrix.m23 = (m13 * m21 - m23 * m11) * f; matrix.m31 = (m21 * m32 - m31 * m22) * f; matrix.m32 = (m31 * m12 - m11 * m32) * f; matrix.m33 = (m11 * m22 - m21 * m12) * f; matrix.m14 = -(matrix.m11 * m14 + matrix.m12 * m24 + matrix.m13 * m34); matrix.m24 = -(matrix.m21 * m14 + matrix.m22 * m24 + matrix.m23 * m34); matrix.m34 = -(matrix.m31 * m14 + matrix.m32 * m24 + matrix.m33 * m34); matrix.m41 = m41; matrix.m42 = m42; matrix.m43 = m43; matrix.m44 = m44; } public final void load (Matrix matrix) { m11 = matrix.m11; m12 = matrix.m12; m13 = matrix.m13; m14 = matrix.m14; m21 = matrix.m21; m22 = matrix.m22; m23 = matrix.m23; m24 = matrix.m24; m31 = matrix.m31; m32 = matrix.m32; m33 = matrix.m33; m34 = matrix.m34; m41 = matrix.m41; m42 = matrix.m42; m43 = matrix.m43; m44 = matrix.m44; } public final void lookat (Vector vector, Vector vector1, Vector vector2) { float f = vector1.x - vector.x; float f1 = vector1.y - vector.y; float f2 = vector1.z - vector.z; float f3 = (float)Math.sqrt (f * f + f1 * f1 + f2 * f2); if (f3 == 0.0F) { f = 1.0F; f1 = 0.0F; f2 = 0.0F; } else { float f4 = 1.0F / f3; f *= f4; f1 *= f4; f2 *= f4; } float f5 = -(f * vector2.x + f * vector2.y + f * vector2.z); float f6 = -(f1 * vector2.x + f1 * vector2.y + f1 * vector2.z); float f7 = -(f2 * vector2.x + f2 * vector2.y + f2 * vector2.z); f3 = (float)Math.sqrt (f5 * f5 + f6 * f6 + f7 * f7); if (f3 == 0.0F) { f5 = 1.0F; f6 = 0.0F; f7 = 0.0F; } else { float f8 = 1.0F / f3; f5 *= f8; f6 *= f8; f7 *= f8; } float f9 = f * f5 + f * f6 + f * f7; float f10 = f1 * f5 + f1 * f6 + f1 * f7; float f11 = f2 * f5 + f2 * f6 + f2 * f7; f3 = (float)Math.sqrt (f9 * f9 + f10 * f10 + f11 * f11); if (f3 == 0.0F) { f9 = 1.0F; f10 = 0.0F; f11 = 0.0F; } else { float f12 = 1.0F / f3; f9 *= f12; f10 *= f12; f11 *= f12; } m11 = f5; m21 = f6; m31 = f7; m12 = f9; m22 = f10; m32 = f11; m13 = f; m23 = f; m33 = f; m14 = 0.0F; m24 = 0.0F; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void multiply (Matrix matrix, Matrix matrix1) { matrix1.m11 = m11 * matrix.m11 + m12 * matrix.m21 + m13 * matrix.m31 + m14 * matrix.m41; matrix1.m12 = m11 * matrix.m12 + m12 * matrix.m22 + m13 * matrix.m32 + m14 * matrix.m42; matrix1.m13 = m11 * matrix.m13 + m12 * matrix.m23 + m13 * matrix.m33 + m14 * matrix.m43; matrix1.m14 = m11 * matrix.m14 + m12 * matrix.m24 + m13 * matrix.m34 + m14 * matrix.m44; matrix1.m21 = m21 * matrix.m11 + m22 * matrix.m21 + m23 * matrix.m31 + m24 * matrix.m41; matrix1.m22 = m21 * matrix.m12 + m22 * matrix.m22 + m23 * matrix.m32 + m24 * matrix.m42; matrix1.m23 = m21 * matrix.m13 + m22 * matrix.m23 + m23 * matrix.m33 + m24 * matrix.m43; matrix1.m24 = m21 * matrix.m14 + m22 * matrix.m24 + m23 * matrix.m34 + m24 * matrix.m44; matrix1.m31 = m31 * matrix.m11 + m32 * matrix.m21 + m33 * matrix.m31 + m34 * matrix.m41; matrix1.m32 = m31 * matrix.m12 + m32 * matrix.m22 + m33 * matrix.m32 + m34 * matrix.m42; matrix1.m33 = m31 * matrix.m13 + m32 * matrix.m23 + m33 * matrix.m33 + m34 * matrix.m43; matrix1.m34 = m31 * matrix.m14 + m32 * matrix.m24 + m33 * matrix.m34 + m34 * matrix.m44; matrix1.m41 = m41 * matrix.m11 + m42 * matrix.m21 + m43 * matrix.m31 + m44 * matrix.m41; matrix1.m42 = m41 * matrix.m12 + m42 * matrix.m22 + m43 * matrix.m32 + m44 * matrix.m42; matrix1.m43 = m41 * matrix.m13 + m42 * matrix.m23 + m43 * matrix.m33 + m44 * matrix.m43; matrix1.m44 = m41 * matrix.m14 + m42 * matrix.m24 + m43 * matrix.m34 + m44 * matrix.m44; } public final void orthographic (float f, float f1, float f2, float f3, float f4, float f5) { float f6 = 1.0F / (f1 - f); float f7 = 1.0F / (f3 - f2); float f8 = 1.0F / (f5 - f4); m11 = 2.0F * f6; m12 = 0.0F; m13 = 0.0F; m14 = (f1 + f) * f6; m21 = 0.0F; m22 = 2.0F * f7; m23 = 0.0F; m24 = (f3 + f2) * f7; m31 = 0.0F; m32 = 0.0F; m33 = -2F * f8; m34 = (f4 + f5) * f8; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void pretransform (Vector vector, Vector vector1) { vector1.x = vector.x * m11 + vector.x * m12 + vector.x * m13 + vector.x * m14; vector1.y = vector.y * m21 + vector.y * m22 + vector.y * m23 + vector.y * m24; vector1.z = vector.z * m31 + vector.z * m32 + vector.z * m33 + vector.z * m34; vector1.w = vector.w * m41 + vector.w * m42 + vector.w * m43 + vector.w * m44; } public final void projection(float f, float f1, float f2, float f3, float f4, float f5) { float f6 = 1.0F / (f1 - f); float f7 = 1.0F / (f2 - f3); float f8 = 1.0F / (f5 - f4); float f9 = f5 + f4; m11 = 2.0F * f4 * f6; m12 = 0.0F; m13 = (f1 + f) * f6; m14 = 0.0F; m21 = 0.0F; m22 = 2.0F * f4 * f7; m23 = (f2 + f3) * f7; m24 = 0.0F; m31 = 0.0F; m32 = 0.0F; m33 = -f9 * f8; m34 = f9 * f8; m41 = 0.0F; m42 = 0.0F; m43 = -1F; m44 = 0.0F; } public final void rotate (float f, Vector vector) {} public final void rotateX (float f) { float f1 = (float)Math.cos (f); float f2 = (float)Math.sin (f); m11 = 1.0F; m12 = 0.0F; m13 = 0.0F; m14 = 0.0F; m21 = 0.0F; m22 = f1; m23 = -f2; m24 = 0.0F; m31 = 0.0F; m32 = f2; m33 = f1; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void rotateY (float f) { float f1 = (float)Math.cos (f); float f2 = (float)Math.sin (f); m11 = f1; m12 = 0.0F; m13 = f2; m14 = 0.0F; m21 = 0.0F; m22 = 1.0F; m23 = 0.0F; m24 = 0.0F; m31 = -f2; m32 = 0.0F; m33 = f1; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void rotateZ (float f) { float f1 = (float)Math.cos (f); float f2 = (float)Math.sin (f); m11 = f1; m12 = -f2; m13 = 0.0F; m14 = 0.0F; m21 = f2; m22 = f1; m23 = 0.0F; m24 = 0.0F; m31 = 0.0F; m32 = 0.0F; m33 = 1.0F; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void scale (float f) { m11 = f; m12 = 0.0F; m13 = 0.0F; m14 = 0.0F; m21 = 0.0F; m22 = f; m23 = 0.0F; m24 = 0.0F; m31 = 0.0F; m32 = 0.0F; m33 = f; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void scale (float f, float f1, float f2) { m11 = f; m12 = 0.0F; m13 = 0.0F; m14 = 0.0F; m21 = 0.0F; m22 = f1; m23 = 0.0F; m24 = 0.0F; m31 = 0.0F; m32 = 0.0F; m33 = f2; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void transform (Vector vector, Vector vector1) { vector1.x = vector.x * m11 + vector.y * m12 + vector.z * m13 + vector.w * m14; vector1.y = vector.x * m21 + vector.y * m22 + vector.z * m23 + vector.w * m24; vector1.z = vector.x * m31 + vector.y * m32 + vector.z * m33 + vector.w * m34; vector1.w = vector.x * m41 + vector.y * m42 + vector.z * m43 + vector.w * m44; } public final void translate (float f, float f1, float f2) { m11 = 1.0F; m12 = 0.0F; m13 = 0.0F; m14 = f; m21 = 0.0F; m22 = 1.0F; m23 = 0.0F; m24 = f1; m31 = 0.0F; m32 = 0.0F; m33 = 1.0F; m34 = f2; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 1.0F; } public final void transpose (Matrix matrix) { matrix.m11 = m11; matrix.m12 = m21; matrix.m13 = m31; matrix.m14 = m41; matrix.m21 = m12; matrix.m22 = m22; matrix.m23 = m32; matrix.m24 = m42; matrix.m31 = m13; matrix.m32 = m23; matrix.m33 = m33; matrix.m34 = m43; matrix.m41 = m14; matrix.m42 = m24; matrix.m43 = m34; matrix.m44 = m44; } public final void zero () { m11 = 0.0F; m12 = 0.0F; m13 = 0.0F; m14 = 0.0F; m21 = 0.0F; m22 = 0.0F; m23 = 0.0F; m24 = 0.0F; m31 = 0.0F; m32 = 0.0F; m33 = 0.0F; m34 = 0.0F; m41 = 0.0F; m42 = 0.0F; m43 = 0.0F; m44 = 0.0F; } public float m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; }