125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/* 2ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project 325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * you may not use this file except in compliance with the License. 625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * You may obtain a copy of the License at 725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 1025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Unless required by applicable law or agreed to in writing, software 1125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * See the License for the specific language governing permissions and 1425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * limitations under the License. 1525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams */ 1625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspackage android.renderscript; 1825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samsimport java.lang.Math; 2025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samsimport android.util.Log; 2125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 2225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 2411518acc8c416023d8c2192b441a1767205676d9Robert Ly * Class for exposing the native Renderscript rs_matrix3x3 type back to the Android system. 2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 2625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams **/ 2725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix3f { 2825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 30ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new identity 3x3 matrix 31ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public Matrix3f() { 3325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat = new float[9]; 3425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams loadIdentity(); 3525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 3625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 38ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new matrix and sets its values from the given 39ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * parameter 40ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 41ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param dataArray values to set the matrix to, must be 9 42ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * floats long 43ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 44e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public Matrix3f(float[] dataArray) { 45e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk mMat = new float[9]; 46e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 47e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 48e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 499c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Return a reference to the internal array representing matrix 51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * values. Modifying this array will also change the matrix 52ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 53ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @return internal array representing the matrix 54ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 55e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public float[] getArray() { 56e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk return mMat; 57e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 58e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Returns the value for a given row and column 61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 62ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to return 63ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to return 64ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 65ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @return value in the yth row and xth column 66ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 67ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public float get(int x, int y) { 68ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines return mMat[x*3 + y]; 6925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 7025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the value for a given row and column 73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 74ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to set 75ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to set 76ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 77ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public void set(int x, int y, float v) { 78ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines mMat[x*3 + y] = v; 7925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 8025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 819c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 82ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the matrix values to identity 83ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 8425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadIdentity() { 8525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[0] = 1; 8625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[1] = 0; 8725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[2] = 0; 8825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 8925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[3] = 0; 9025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[4] = 1; 9125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[5] = 0; 9225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 9325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[6] = 0; 9425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[7] = 0; 9525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[8] = 1; 9625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 9725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 99ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the values of the matrix to those of the parameter 100ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 101ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param src matrix to load the values from 102ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 10325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void load(Matrix3f src) { 104b3b89f63af148031817c046ba8023b76241c1e7cAlex Sakhartchouk System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 10525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 10625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 108ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a rotation matrix of certain angle 109ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * about a given axis 110ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 111ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 112ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x rotation axis x 113ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y rotation axis y 114ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z rotation axis z 115ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 116cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot, float x, float y, float z) { 117cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 118cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 119cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 120cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 121cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 122cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 123cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk if (!(len != 1)) { 124cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float recipLen = 1.f / len; 125cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk x *= recipLen; 126cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk y *= recipLen; 127cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk z *= recipLen; 128cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 129cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float nc = 1.0f - c; 130cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float xy = x * y; 131cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float yz = y * z; 132cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float zx = z * x; 133cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float xs = x * s; 134cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ys = y * s; 135cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float zs = z * s; 136cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x*x*nc + c; 137cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = xy*nc - zs; 138cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[6] = zx*nc + ys; 139cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = xy*nc + zs; 140cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y*y*nc + c; 141cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[9] = yz*nc - xs; 142cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[2] = zx*nc - ys; 143cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[6] = yz*nc + xs; 144cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[8] = z*z*nc + c; 145cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 146cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 148ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Makes the upper 2x2 a rotation matrix of the given angle 149ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 150ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot rotation angle 151ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 152cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot) { 153ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk loadIdentity(); 154cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 155cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 156cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 157cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 158cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = c; 159cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = -s; 160cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = s; 161cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = c; 162cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 163cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 165ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Makes the upper 2x2 a scale matrix of given dimensions 166ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 167ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 168ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 169ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 170cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y) { 171cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 172cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 173cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y; 174cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 175cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 177ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a scale matrix of given dimensions 178ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 179ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 180ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 181ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z scale component z 182ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 183cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y, float z) { 184cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 185cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 186cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y; 187cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[8] = z; 188cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 189cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 191ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a translation matrix of given 192ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * dimensions 193ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 194ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x translation component x 195ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y translation component y 196ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 197cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadTranslate(float x, float y) { 198cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 199cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[6] = x; 200cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[7] = y; 201cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 202cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 2039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 204ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be the result of multiplying two given 205ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * matrices 206ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 207ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param lhs left hand side matrix 208ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side matrix 209ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 210cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadMultiply(Matrix3f lhs, Matrix3f rhs) { 211cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int i=0 ; i<3 ; i++) { 212cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri0 = 0; 213cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri1 = 0; 214cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri2 = 0; 215cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int j=0 ; j<3 ; j++) { 216cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float rhs_ij = rhs.get(i,j); 217cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri0 += lhs.get(j,0) * rhs_ij; 218cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri1 += lhs.get(j,1) * rhs_ij; 219cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri2 += lhs.get(j,2) * rhs_ij; 220cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 221cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,0, ri0); 222cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,1, ri1); 223cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,2, ri2); 224cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 225cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 226cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 2279c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 228ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Post-multiplies the current matrix by a given parameter 229ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 230ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side to multiply by 231ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 232cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void multiply(Matrix3f rhs) { 233cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 234cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadMultiply(this, rhs); 235cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk load(tmp); 236cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 237ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 239ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 240ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * rotation matrix of certain angle about a given axis 241ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 242ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 243ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x rotation axis x 244ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y rotation axis y 245ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z rotation axis z 246ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 247cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot, float x, float y, float z) { 248cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 249cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot, x, y, z); 250cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 251cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 252ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2539c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 254ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the upper 2x2 of the current matrix by 255ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * post-multiplying it with a rotation matrix of given angle 256ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 257ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 258ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 259cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot) { 260cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 261cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot); 262cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 263cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 264ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 266ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the upper 2x2 of the current matrix by 267ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * post-multiplying it with a scale matrix of given dimensions 268ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 269ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 270ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 271ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 272cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y) { 273cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 274cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y); 275cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 276cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 277ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 279ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 280ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * scale matrix of given dimensions 281ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 282ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 283ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 284ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z scale component z 285ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 286cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y, float z) { 287cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 288cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y, z); 289cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 290cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 291ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 293ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 294ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * translation matrix of given dimensions 295ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 296ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x translation component x 297ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y translation component y 298ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 299cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void translate(float x, float y) { 300cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 301cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadTranslate(x, y); 302cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 303cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 304ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 3059c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 306ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the current matrix to its transpose 307ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 308518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk public void transpose() { 309518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int i = 0; i < 2; ++i) { 310518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int j = i + 1; j < 3; ++j) { 311518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk float temp = mMat[i*3 + j]; 312518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[i*3 + j] = mMat[j*3 + i]; 313518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[j*3 + i] = temp; 314518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 315518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 316518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 317cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 31825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 31925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams} 32025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 32125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 322