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 Sams 209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Class for exposing the native RenderScript rs_matrix3x3 type back to the Android system. 2225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 2325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams **/ 2425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix3f { 2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 269c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 27ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new identity 3x3 matrix 28ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 2925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public Matrix3f() { 3025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat = new float[9]; 3125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams loadIdentity(); 3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 3325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 35ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new matrix and sets its values from the given 36ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * parameter 37ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 38ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param dataArray values to set the matrix to, must be 9 39ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * floats long 40ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 41e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public Matrix3f(float[] dataArray) { 42e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk mMat = new float[9]; 43e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 44e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 45e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 47ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Return a reference to the internal array representing matrix 48ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * values. Modifying this array will also change the matrix 49ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @return internal array representing the matrix 51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 52e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public float[] getArray() { 53e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk return mMat; 54e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 55e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 569c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 57ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Returns the value for a given row and column 58ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 59ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to return 60ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to return 61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 62ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @return value in the yth row and xth column 63ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 64ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public float get(int x, int y) { 65ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines return mMat[x*3 + y]; 6625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 6725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 69ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the value for a given row and column 70ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 71ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to set 72ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to set 73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 74ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public void set(int x, int y, float v) { 75ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines mMat[x*3 + y] = v; 7625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 7725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 79ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the matrix values to identity 80ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 8125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadIdentity() { 8225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[0] = 1; 8325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[1] = 0; 8425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[2] = 0; 8525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 8625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[3] = 0; 8725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[4] = 1; 8825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[5] = 0; 8925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 9025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[6] = 0; 9125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[7] = 0; 9225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[8] = 1; 9325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 9425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 96ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the values of the matrix to those of the parameter 97ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 98ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param src matrix to load the values from 99ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 10025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void load(Matrix3f src) { 101b3b89f63af148031817c046ba8023b76241c1e7cAlex Sakhartchouk System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 10225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 10325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1049c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 105ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a rotation matrix of certain angle 106ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * about a given axis 107ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 108ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 109ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x rotation axis x 110ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y rotation axis y 111ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z rotation axis z 112ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 113cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot, float x, float y, float z) { 114cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 115cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 116cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 117cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 118cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 119cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 120cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk if (!(len != 1)) { 121cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float recipLen = 1.f / len; 122cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk x *= recipLen; 123cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk y *= recipLen; 124cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk z *= recipLen; 125cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 126cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float nc = 1.0f - c; 127cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float xy = x * y; 128cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float yz = y * z; 129cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float zx = z * x; 130cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float xs = x * s; 131cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ys = y * s; 132cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float zs = z * s; 133cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x*x*nc + c; 134cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = xy*nc - zs; 135cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[6] = zx*nc + ys; 136cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = xy*nc + zs; 137cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y*y*nc + c; 1380ce7cdaffdc039c035e7eea80f4b89fc0b4e7ee5Stephen Hines mMat[7] = yz*nc - xs; 139cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[2] = zx*nc - ys; 1403983754bbba587512dce6ff20a4145b311c15027Stephen Hines mMat[5] = yz*nc + xs; 141cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[8] = z*z*nc + c; 142cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 143cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1449c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 145ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Makes the upper 2x2 a rotation matrix of the given angle 146ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 147ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot rotation angle 148ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 149cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot) { 150ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk loadIdentity(); 151cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 152cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 153cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 154cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 155cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = c; 156cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = -s; 157cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = s; 158cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = c; 159cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 160cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1619c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 162ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Makes the upper 2x2 a scale matrix of given dimensions 163ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 164ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 165ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 166ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 167cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y) { 168cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 169cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 170cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y; 171cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 172cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1739c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 174ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a scale matrix of given dimensions 175ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 176ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 177ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 178ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z scale component z 179ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 180cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y, float z) { 181cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 182cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 183cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[4] = y; 184cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[8] = z; 185cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 186cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1879c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 188ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a translation matrix of given 189ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * dimensions 190ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 191ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x translation component x 192ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y translation component y 193ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 194cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadTranslate(float x, float y) { 195cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 196cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[6] = x; 197cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[7] = y; 198cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 199cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 2009c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 201ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be the result of multiplying two given 202ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * matrices 203ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 204ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param lhs left hand side matrix 205ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side matrix 206ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 207cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadMultiply(Matrix3f lhs, Matrix3f rhs) { 208cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int i=0 ; i<3 ; i++) { 209cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri0 = 0; 210cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri1 = 0; 211cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri2 = 0; 212cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int j=0 ; j<3 ; j++) { 213cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float rhs_ij = rhs.get(i,j); 214cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri0 += lhs.get(j,0) * rhs_ij; 215cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri1 += lhs.get(j,1) * rhs_ij; 216cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri2 += lhs.get(j,2) * rhs_ij; 217cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 218cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,0, ri0); 219cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,1, ri1); 220cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,2, ri2); 221cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 222cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 223cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 2249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 225ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Post-multiplies the current matrix by a given parameter 226ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 227ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side to multiply by 228ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 229cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void multiply(Matrix3f rhs) { 230cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 231cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadMultiply(this, rhs); 232cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk load(tmp); 233cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 234ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2359c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 236ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 237ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * rotation matrix of certain angle about a given axis 238ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 239ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 240ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x rotation axis x 241ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y rotation axis y 242ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z rotation axis z 243ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 244cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot, float x, float y, float z) { 245cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 246cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot, x, y, z); 247cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 248cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 249ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2509c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 251ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the upper 2x2 of the current matrix by 252ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * post-multiplying it with a rotation matrix of given angle 253ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 254ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 255ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 256cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot) { 257cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 258cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot); 259cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 260cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 261ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2629c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 263ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the upper 2x2 of the current matrix by 264ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * post-multiplying it with a scale matrix of given dimensions 265ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 266ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 267ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 268ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 269cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y) { 270cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 271cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y); 272cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 273cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 274ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 276ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 277ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * scale matrix of given dimensions 278ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 279ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 280ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 281ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param z scale component z 282ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 283cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y, float z) { 284cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 285cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y, z); 286cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 287cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 288ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 290ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 291ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * translation matrix of given dimensions 292ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 293ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x translation component x 294ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y translation component y 295ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 296cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void translate(float x, float y) { 297cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix3f tmp = new Matrix3f(); 298cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadTranslate(x, y); 299cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 300cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 301ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 3029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 303ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the current matrix to its transpose 304ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 305518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk public void transpose() { 306518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int i = 0; i < 2; ++i) { 307518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int j = i + 1; j < 3; ++j) { 308518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk float temp = mMat[i*3 + j]; 309518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[i*3 + j] = mMat[j*3 + i]; 310518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[j*3 + i] = temp; 311518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 312518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 313518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 314cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 31525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 31625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams} 31725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 31825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 319