/*
* JAME 6.2.1
* http://jame.sourceforge.net
*
* Copyright 2001, 2016 Andrea Medeghini
*
* This file is based on code from idx3dIII
* Copyright 1999, 2000 Peter Walser
* http://www.idx3d.ch/idx3d/idx3d.html
*
* This file is part of JAME.
*
* JAME is an application for creating fractals and other graphics artifacts.
*
* JAME is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JAME is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JAME. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.sf.jame.core.media.g3d;
public final class Matrix {
public static final Matrix unit = new Matrix();
float m00 = 1f;
float m01 = 0f;
float m02 = 0f;
float m03 = 0f;
float m10 = 0f;
float m11 = 1f;
float m12 = 0f;
float m13 = 0f;
float m20 = 0f;
float m21 = 0f;
float m22 = 1f;
float m23 = 0f;
float m30 = 0f;
float m31 = 0f;
float m32 = 0f;
float m33 = 1f;
public Matrix() {
}
public Matrix(final Matrix m) {
m00 = m.m00;
m10 = m.m10;
m20 = m.m20;
m30 = m.m30;
m01 = m.m01;
m11 = m.m11;
m21 = m.m21;
m31 = m.m31;
m02 = m.m02;
m12 = m.m12;
m22 = m.m22;
m32 = m.m32;
m03 = m.m03;
m13 = m.m13;
m23 = m.m23;
m33 = m.m33;
}
public Matrix(final Vector a, final Vector b, final Vector c) {
m00 = a.x;
m10 = a.y;
m20 = a.z;
m01 = b.x;
m11 = b.y;
m21 = b.z;
m02 = c.x;
m12 = c.y;
m22 = c.z;
}
public Matrix(final Vector a, final Vector b, final Vector c, final Vector d) {
m00 = a.x;
m10 = a.y;
m20 = a.z;
m01 = b.x;
m11 = b.y;
m21 = b.z;
m02 = c.x;
m12 = c.y;
m22 = c.z;
m03 = d.x;
m13 = d.y;
m23 = d.z;
}
public static Matrix shiftMatrix(final float dx, final float dy, final float dz) {
final Matrix m = new Matrix();
m.m03 = dx;
m.m13 = dy;
m.m23 = dz;
return (m);
}
public static Matrix scaleMatrix(final float dx, final float dy, final float dz) {
final Matrix m = new Matrix();
m.m00 = dx;
m.m11 = dy;
m.m22 = dz;
return (m);
}
public static Matrix rotateMatrix(final float dx, final float dy, final float dz) {
final Matrix q = new Matrix();
if (dx != 0f) {
final Matrix m = new Matrix();
final float SIN = Math.sin(dx);
final float COS = Math.cos(dx);
m.m11 = +COS;
m.m12 = +SIN;
m.m21 = -SIN;
m.m22 = +COS;
q.transform(m, true);
}
if (dy != 0f) {
final Matrix m = new Matrix();
final float SIN = Math.sin(dy);
final float COS = Math.cos(dy);
m.m00 = +COS;
m.m02 = +SIN;
m.m20 = -SIN;
m.m22 = +COS;
q.transform(m, true);
}
if (dz != 0f) {
final Matrix m = new Matrix();
final float SIN = Math.sin(dz);
final float COS = Math.cos(dz);
m.m00 = +COS;
m.m01 = +SIN;
m.m10 = -SIN;
m.m11 = +COS;
q.transform(m, true);
}
return (q);
}
public void shift(final float dx, final float dy, final float dz) {
transform(Matrix.shiftMatrix(dx, dy, dz), true);
}
public void scale(final float dx, final float dy, final float dz) {
transform(Matrix.scaleMatrix(dx, dy, dz), true);
}
public void rotate(final float dx, final float dy, final float dz) {
transform(Matrix.rotateMatrix(dx, dy, dz), true);
}
public void shiftSelf(final float dx, final float dy, final float dz) {
transform(Matrix.shiftMatrix(dx, dy, dz), false);
}
public void scaleSelf(final float dx, final float dy, final float dz) {
transform(Matrix.scaleMatrix(dx, dy, dz), false);
}
public void rotateSelf(final float dx, final float dy, final float dz) {
transform(Matrix.rotateMatrix(dx, dy, dz), false);
}
public void transform(final Matrix n, final boolean left) {
Matrix m = null;
if (left) {
m = Matrix.multiply(n, this);
}
else {
m = Matrix.multiply(this, n);
}
m00 = m.m00;
m01 = m.m01;
m02 = m.m02;
m03 = m.m03;
m10 = m.m10;
m11 = m.m11;
m12 = m.m12;
m13 = m.m13;
m20 = m.m20;
m21 = m.m21;
m22 = m.m22;
m23 = m.m23;
}
public final void reset() {
m00 = 1f;
m01 = 0f;
m02 = 0f;
m03 = 0f;
m10 = 0f;
m11 = 1f;
m12 = 0f;
m13 = 0f;
m20 = 0f;
m21 = 0f;
m22 = 1f;
m23 = 0f;
m30 = 0f;
m31 = 0f;
m32 = 0f;
m33 = 1f;
}
public static Matrix multiply(final Matrix m1, final Matrix m2) {
final Matrix m = new Matrix();
m.m00 = (m1.m00 * m2.m00) + (m1.m01 * m2.m10) + (m1.m02 * m2.m20);
m.m01 = (m1.m00 * m2.m01) + (m1.m01 * m2.m11) + (m1.m02 * m2.m21);
m.m02 = (m1.m00 * m2.m02) + (m1.m01 * m2.m12) + (m1.m02 * m2.m22);
m.m03 = (m1.m00 * m2.m03) + (m1.m01 * m2.m13) + (m1.m02 * m2.m23) + m1.m03;
m.m10 = (m1.m10 * m2.m00) + (m1.m11 * m2.m10) + (m1.m12 * m2.m20);
m.m11 = (m1.m10 * m2.m01) + (m1.m11 * m2.m11) + (m1.m12 * m2.m21);
m.m12 = (m1.m10 * m2.m02) + (m1.m11 * m2.m12) + (m1.m12 * m2.m22);
m.m13 = (m1.m10 * m2.m03) + (m1.m11 * m2.m13) + (m1.m12 * m2.m23) + m1.m13;
m.m20 = (m1.m20 * m2.m00) + (m1.m21 * m2.m10) + (m1.m22 * m2.m20);
m.m21 = (m1.m20 * m2.m01) + (m1.m21 * m2.m11) + (m1.m22 * m2.m21);
m.m22 = (m1.m20 * m2.m02) + (m1.m21 * m2.m12) + (m1.m22 * m2.m22);
m.m23 = (m1.m20 * m2.m03) + (m1.m21 * m2.m13) + (m1.m22 * m2.m23) + m1.m23;
return (m);
}
@Override
public String toString() {
final StringBuffer s = new StringBuffer("<matrix:\r\n");
s.append(m00 + "," + m01 + "," + m02 + "," + m03 + ",\r\n");
s.append(m10 + "," + m11 + "," + m12 + "," + m13 + ",\r\n");
s.append(m20 + "," + m21 + "," + m22 + "," + m23 + ",\r\n");
s.append(m30 + "," + m31 + "," + m32 + "," + m33 + ">");
return (s.toString());
}
}