Matrix3f.java revision 16ca64bcb2e832ed805387500ed982fa2a121e52
198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/* 298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2009-2012 The Android Open Source Project 398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License. 698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at 798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software 1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and 1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License. 1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript; 1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.Math; 2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log; 2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/** 2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Class for exposing the native Renderscript rs_matrix3x3 type back to the Android system. 2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/ 2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Matrix3f { 2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Creates a new identity 3x3 matrix 3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public Matrix3f() { 3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat = new float[9]; 3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams loadIdentity(); 3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Creates a new matrix and sets its values from the given 3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * parameter 4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param dataArray values to set the matrix to, must be 9 4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * floats long 4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public Matrix3f(float[] dataArray) { 4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat = new float[9]; 4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Return a reference to the internal array representing matrix 5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * values. Modifying this array will also change the matrix 5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @return internal array representing the matrix 5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public float[] getArray() { 5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return mMat; 5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Returns the value for a given row and column 6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x column of the value to return 6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y row of the value to return 6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @return value in the yth row and xth column 6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public float get(int x, int y) { 6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return mMat[x*3 + y]; 6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets the value for a given row and column 7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x column of the value to set 7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y row of the value to set 7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void set(int x, int y, float v) { 7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[x*3 + y] = v; 7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets the matrix values to identity 8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadIdentity() { 8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[0] = 1; 8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[1] = 0; 8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[2] = 0; 8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[3] = 0; 9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[4] = 1; 9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[5] = 0; 9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[6] = 0; 9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[7] = 0; 9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[8] = 1; 9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets the values of the matrix to those of the parameter 10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param src matrix to load the values from 10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void load(Matrix3f src) { 10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets current values to be a rotation matrix of certain angle 10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * about a given axis 11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rot angle of rotation 11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x rotation axis x 11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y rotation axis y 11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param z rotation axis z 11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadRotate(float rot, float x, float y, float z) { 11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float c, s; 11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams c = (float)java.lang.Math.cos(rot); 12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams s = (float)java.lang.Math.sin(rot); 12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (!(len != 1)) { 12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float recipLen = 1.f / len; 12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams x *= recipLen; 12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams y *= recipLen; 12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams z *= recipLen; 12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float nc = 1.0f - c; 13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float xy = x * y; 13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float yz = y * z; 13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float zx = z * x; 13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float xs = x * s; 13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float ys = y * s; 13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float zs = z * s; 13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[0] = x*x*nc + c; 13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[3] = xy*nc - zs; 13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[6] = zx*nc + ys; 13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[1] = xy*nc + zs; 14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[4] = y*y*nc + c; 14116ca64bcb2e832ed805387500ed982fa2a121e52Stephen Hines mMat[7] = yz*nc - xs; 14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[2] = zx*nc - ys; 14316ca64bcb2e832ed805387500ed982fa2a121e52Stephen Hines mMat[5] = yz*nc + xs; 14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[8] = z*z*nc + c; 14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Makes the upper 2x2 a rotation matrix of the given angle 14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rot rotation angle 15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadRotate(float rot) { 15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams loadIdentity(); 15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float c, s; 15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams c = (float)java.lang.Math.cos(rot); 15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams s = (float)java.lang.Math.sin(rot); 15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[0] = c; 15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[1] = -s; 16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[3] = s; 16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[4] = c; 16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Makes the upper 2x2 a scale matrix of given dimensions 16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x scale component x 16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y scale component y 16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadScale(float x, float y) { 17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams loadIdentity(); 17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[0] = x; 17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[4] = y; 17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets current values to be a scale matrix of given dimensions 17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x scale component x 18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y scale component y 18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param z scale component z 18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadScale(float x, float y, float z) { 18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams loadIdentity(); 18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[0] = x; 18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[4] = y; 18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[8] = z; 18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets current values to be a translation matrix of given 19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * dimensions 19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x translation component x 19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y translation component y 19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadTranslate(float x, float y) { 19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams loadIdentity(); 19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[6] = x; 20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[7] = y; 20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets current values to be the result of multiplying two given 20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * matrices 20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param lhs left hand side matrix 20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rhs right hand side matrix 20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void loadMultiply(Matrix3f lhs, Matrix3f rhs) { 21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for (int i=0 ; i<3 ; i++) { 21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float ri0 = 0; 21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float ri1 = 0; 21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float ri2 = 0; 21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for (int j=0 ; j<3 ; j++) { 21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float rhs_ij = rhs.get(i,j); 21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams ri0 += lhs.get(j,0) * rhs_ij; 21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams ri1 += lhs.get(j,1) * rhs_ij; 21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams ri2 += lhs.get(j,2) * rhs_ij; 22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams set(i,0, ri0); 22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams set(i,1, ri1); 22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams set(i,2, ri2); 22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Post-multiplies the current matrix by a given parameter 22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rhs right hand side to multiply by 23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void multiply(Matrix3f rhs) { 23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadMultiply(this, rhs); 23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams load(tmp); 23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Modifies the current matrix by post-multiplying it with a 24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * rotation matrix of certain angle about a given axis 24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rot angle of rotation 24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x rotation axis x 24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y rotation axis y 24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param z rotation axis z 24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void rotate(float rot, float x, float y, float z) { 24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadRotate(rot, x, y, z); 25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams multiply(tmp); 25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Modifies the upper 2x2 of the current matrix by 25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * post-multiplying it with a rotation matrix of given angle 25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rot angle of rotation 25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void rotate(float rot) { 26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadRotate(rot); 26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams multiply(tmp); 26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Modifies the upper 2x2 of the current matrix by 26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * post-multiplying it with a scale matrix of given dimensions 26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x scale component x 27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y scale component y 27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void scale(float x, float y) { 27398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadScale(x, y); 27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams multiply(tmp); 27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 27798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 27898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 27998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Modifies the current matrix by post-multiplying it with a 28098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * scale matrix of given dimensions 28198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x scale component x 28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y scale component y 28498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param z scale component z 28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void scale(float x, float y, float z) { 28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadScale(x, y, z); 28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams multiply(tmp); 29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Modifies the current matrix by post-multiplying it with a 29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * translation matrix of given dimensions 29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param x translation component x 29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param y translation component y 29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void translate(float x, float y) { 30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Matrix3f tmp = new Matrix3f(); 30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams tmp.loadTranslate(x, y); 30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams multiply(tmp); 30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Sets the current matrix to its transpose 30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 30898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void transpose() { 30998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for(int i = 0; i < 2; ++i) { 31098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for(int j = i + 1; j < 3; ++j) { 31198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams float temp = mMat[i*3 + j]; 31298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[i*3 + j] = mMat[j*3 + i]; 31398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mMat[j*3 + i] = temp; 31498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 31698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams final float[] mMat; 31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams} 32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 322