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