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