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