Matrix3f.java revision 793ddb49b2c081efa6427b3f730ca633f0204225
145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/* 245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2009-2012 The Android Open Source Project 345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License. 645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at 745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software 1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and 1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License. 1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript; 1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.Math; 2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log; 2145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/** 2445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Class for exposing the native Renderscript rs_matrix3x3 type back to the Android system. 2545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 2645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/ 2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Matrix3f { 2845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 3045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Creates a new identity 3x3 matrix 3145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Matrix3f() { 3345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat = new float[9]; 3445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams loadIdentity(); 3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 3645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Creates a new matrix and sets its values from the given 3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * parameter 4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param dataArray values to set the matrix to, must be 9 4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * floats long 4345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Matrix3f(float[] dataArray) { 4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat = new float[9]; 4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return a reference to the internal array representing matrix 5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * values. Modifying this array will also change the matrix 5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return internal array representing the matrix 5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public float[] getArray() { 5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mMat; 5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 6045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Returns the value for a given row and column 6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x column of the value to return 6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y row of the value to return 6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return value in the yth row and xth column 6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public float get(int x, int y) { 6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mMat[x*3 + y]; 6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets the value for a given row and column 7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x column of the value to set 7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y row of the value to set 7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void set(int x, int y, float v) { 7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[x*3 + y] = v; 7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets the matrix values to identity 8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadIdentity() { 8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[0] = 1; 8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[1] = 0; 8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[2] = 0; 8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[3] = 0; 9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[4] = 1; 9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[5] = 0; 9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[6] = 0; 9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[7] = 0; 9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[8] = 1; 9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets the values of the matrix to those of the parameter 10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param src matrix to load the values from 10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void load(Matrix3f src) { 10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets current values to be a rotation matrix of certain angle 10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * about a given axis 11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rot angle of rotation 11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x rotation axis x 11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y rotation axis y 11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param z rotation axis z 11545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadRotate(float rot, float x, float y, float z) { 11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float c, s; 11845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 11945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams c = (float)java.lang.Math.cos(rot); 12045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams s = (float)java.lang.Math.sin(rot); 12145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 12245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 12345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (!(len != 1)) { 12445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float recipLen = 1.f / len; 12545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams x *= recipLen; 12645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams y *= recipLen; 12745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams z *= recipLen; 12845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 12945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float nc = 1.0f - c; 13045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float xy = x * y; 13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float yz = y * z; 13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float zx = z * x; 13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float xs = x * s; 13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float ys = y * s; 13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float zs = z * s; 13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[0] = x*x*nc + c; 13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[3] = xy*nc - zs; 13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[6] = zx*nc + ys; 13945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[1] = xy*nc + zs; 14045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[4] = y*y*nc + c; 141793ddb49b2c081efa6427b3f730ca633f0204225Stephen Hines mMat[7] = yz*nc - xs; 14245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[2] = zx*nc - ys; 143793ddb49b2c081efa6427b3f730ca633f0204225Stephen Hines mMat[5] = yz*nc + xs; 14445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[8] = z*z*nc + c; 14545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 14645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 14745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Makes the upper 2x2 a rotation matrix of the given angle 14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rot rotation angle 15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadRotate(float rot) { 15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams loadIdentity(); 15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float c, s; 15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams c = (float)java.lang.Math.cos(rot); 15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams s = (float)java.lang.Math.sin(rot); 15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[0] = c; 15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[1] = -s; 16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[3] = s; 16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[4] = c; 16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Makes the upper 2x2 a scale matrix of given dimensions 16645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 16745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x scale component x 16845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y scale component y 16945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 17045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadScale(float x, float y) { 17145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams loadIdentity(); 17245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[0] = x; 17345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[4] = y; 17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 17645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 17745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets current values to be a scale matrix of given dimensions 17845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 17945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x scale component x 18045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y scale component y 18145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param z scale component z 18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadScale(float x, float y, float z) { 18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams loadIdentity(); 18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[0] = x; 18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[4] = y; 18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[8] = z; 18845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets current values to be a translation matrix of given 19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * dimensions 19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x translation component x 19545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y translation component y 19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 19745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadTranslate(float x, float y) { 19845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams loadIdentity(); 19945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[6] = x; 20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[7] = y; 20145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 20245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 20345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 20445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets current values to be the result of multiplying two given 20545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * matrices 20645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 20745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param lhs left hand side matrix 20845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rhs right hand side matrix 20945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 21045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void loadMultiply(Matrix3f lhs, Matrix3f rhs) { 21145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams for (int i=0 ; i<3 ; i++) { 21245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float ri0 = 0; 21345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float ri1 = 0; 21445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float ri2 = 0; 21545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams for (int j=0 ; j<3 ; j++) { 21645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float rhs_ij = rhs.get(i,j); 21745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams ri0 += lhs.get(j,0) * rhs_ij; 21845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams ri1 += lhs.get(j,1) * rhs_ij; 21945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams ri2 += lhs.get(j,2) * rhs_ij; 22045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 22145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams set(i,0, ri0); 22245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams set(i,1, ri1); 22345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams set(i,2, ri2); 22445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 22545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 22645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 22745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 22845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Post-multiplies the current matrix by a given parameter 22945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 23045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rhs right hand side to multiply by 23145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 23245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void multiply(Matrix3f rhs) { 23345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 23445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadMultiply(this, rhs); 23545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams load(tmp); 23645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 23745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 23845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 23945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Modifies the current matrix by post-multiplying it with a 24045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * rotation matrix of certain angle about a given axis 24145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 24245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rot angle of rotation 24345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x rotation axis x 24445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y rotation axis y 24545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param z rotation axis z 24645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void rotate(float rot, float x, float y, float z) { 24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 24945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadRotate(rot, x, y, z); 25045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams multiply(tmp); 25145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 25245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 25345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 25445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Modifies the upper 2x2 of the current matrix by 25545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * post-multiplying it with a rotation matrix of given angle 25645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 25745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rot angle of rotation 25845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 25945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void rotate(float rot) { 26045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 26145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadRotate(rot); 26245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams multiply(tmp); 26345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 26445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 26545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 26645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Modifies the upper 2x2 of the current matrix by 26745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * post-multiplying it with a scale matrix of given dimensions 26845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 26945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x scale component x 27045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y scale component y 27145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 27245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void scale(float x, float y) { 27345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 27445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadScale(x, y); 27545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams multiply(tmp); 27645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 27745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 27845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 27945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Modifies the current matrix by post-multiplying it with a 28045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * scale matrix of given dimensions 28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x scale component x 28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y scale component y 28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param z scale component z 28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 28645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void scale(float x, float y, float z) { 28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadScale(x, y, z); 28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams multiply(tmp); 29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Modifies the current matrix by post-multiplying it with a 29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * translation matrix of given dimensions 29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param x translation component x 29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param y translation component y 29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void translate(float x, float y) { 30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Matrix3f tmp = new Matrix3f(); 30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams tmp.loadTranslate(x, y); 30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams multiply(tmp); 30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Sets the current matrix to its transpose 30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public void transpose() { 30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams for(int i = 0; i < 2; ++i) { 31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams for(int j = i + 1; j < 3; ++j) { 31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams float temp = mMat[i*3 + j]; 31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[i*3 + j] = mMat[j*3 + i]; 31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mMat[j*3 + i] = temp; 31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams final float[] mMat; 31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams} 32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 322