[go: nahoru, domu]

198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2009-2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.Math;
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Class for exposing the native RenderScript rs_matrix3x3 type back to the Android system.
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Matrix3f {
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Creates a new identity 3x3 matrix
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Matrix3f() {
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat = new float[9];
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Creates a new matrix and sets its values from the given
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * parameter
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param dataArray values to set the matrix to, must be 9
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *                  floats long
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Matrix3f(float[] dataArray) {
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat = new float[9];
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Return a reference to the internal array representing matrix
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * values. Modifying this array will also change the matrix
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return internal array representing the matrix
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public float[] getArray() {
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mMat;
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Returns the value for a given row and column
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x column of the value to return
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y row of the value to return
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return value in the yth row and xth column
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public float get(int x, int y) {
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mMat[x*3 + y];
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the value for a given row and column
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x column of the value to set
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y row of the value to set
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void set(int x, int y, float v) {
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[x*3 + y] = v;
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the matrix values to identity
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadIdentity() {
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = 1;
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] = 0;
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[2] = 0;
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] = 0;
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[4] = 1;
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[5] = 0;
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[6] = 0;
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[7] = 0;
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[8] = 1;
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the values of the matrix to those of the parameter
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param src matrix to load the values from
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void load(Matrix3f src) {
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be a rotation matrix of certain angle
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * about a given axis
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot angle of rotation
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x rotation axis x
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y rotation axis y
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param z rotation axis z
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadRotate(float rot, float x, float y, float z) {
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float c, s;
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rot *= (float)(java.lang.Math.PI / 180.0f);
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        c = (float)java.lang.Math.cos(rot);
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        s = (float)java.lang.Math.sin(rot);
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!(len != 1)) {
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float recipLen = 1.f / len;
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            x *= recipLen;
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            y *= recipLen;
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            z *= recipLen;
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float nc = 1.0f - c;
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float xy = x * y;
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float yz = y * z;
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float zx = z * x;
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float xs = x * s;
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float ys = y * s;
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float zs = z * s;
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = x*x*nc +  c;
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] =  xy*nc - zs;
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[6] =  zx*nc + ys;
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] =  xy*nc + zs;
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[4] = y*y*nc +  c;
14116ca64bcb2e832ed805387500ed982fa2a121e52Stephen Hines        mMat[7] =  yz*nc - xs;
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[2] =  zx*nc - ys;
14316ca64bcb2e832ed805387500ed982fa2a121e52Stephen Hines        mMat[5] =  yz*nc + xs;
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[8] = z*z*nc +  c;
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Makes the upper 2x2 a rotation matrix of the given angle
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot rotation angle
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadRotate(float rot) {
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float c, s;
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rot *= (float)(java.lang.Math.PI / 180.0f);
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        c = (float)java.lang.Math.cos(rot);
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        s = (float)java.lang.Math.sin(rot);
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = c;
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] = -s;
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] = s;
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[4] = c;
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Makes the upper 2x2 a scale matrix of given dimensions
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadScale(float x, float y) {
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = x;
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[4] = y;
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be a scale matrix of given dimensions
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param z scale component z
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadScale(float x, float y, float z) {
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = x;
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[4] = y;
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[8] = z;
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be a translation matrix of given
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * dimensions
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x translation component x
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y translation component y
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadTranslate(float x, float y) {
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[6] = x;
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[7] = y;
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be the result of multiplying two given
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * matrices
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param lhs left hand side matrix
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rhs right hand side matrix
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadMultiply(Matrix3f lhs, Matrix3f rhs) {
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int i=0 ; i<3 ; i++) {
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float ri0 = 0;
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float ri1 = 0;
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float ri2 = 0;
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            for (int j=0 ; j<3 ; j++) {
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                float rhs_ij = rhs.get(i,j);
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ri0 += lhs.get(j,0) * rhs_ij;
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ri1 += lhs.get(j,1) * rhs_ij;
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ri2 += lhs.get(j,2) * rhs_ij;
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            set(i,0, ri0);
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            set(i,1, ri1);
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            set(i,2, ri2);
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Post-multiplies the current matrix by a given parameter
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rhs right hand side to multiply by
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void multiply(Matrix3f rhs) {
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadMultiply(this, rhs);
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        load(tmp);
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the current matrix by post-multiplying it with a
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * rotation matrix of certain angle about a given axis
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot angle of rotation
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x rotation axis x
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y rotation axis y
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param z rotation axis z
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void rotate(float rot, float x, float y, float z) {
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadRotate(rot, x, y, z);
25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the upper 2x2 of the current matrix by
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * post-multiplying it with a rotation matrix of given angle
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot angle of rotation
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void rotate(float rot) {
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadRotate(rot);
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the upper 2x2 of the current matrix by
26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * post-multiplying it with a scale matrix of given dimensions
26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void scale(float x, float y) {
27398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadScale(x, y);
27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
27798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
27898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
27998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the current matrix by post-multiplying it with a
28098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * scale matrix of given dimensions
28198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
28498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param z scale component z
28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void scale(float x, float y, float z) {
28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadScale(x, y, z);
28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the current matrix by post-multiplying it with a
29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * translation matrix of given dimensions
29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x translation component x
29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y translation component y
29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void translate(float x, float y) {
30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix3f tmp = new Matrix3f();
30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadTranslate(x, y);
30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the current matrix to its transpose
30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
30898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void transpose() {
30998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for(int i = 0; i < 2; ++i) {
31098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            for(int j = i + 1; j < 3; ++j) {
31198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                float temp = mMat[i*3 + j];
31298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mMat[i*3 + j] = mMat[j*3 + i];
31398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mMat[j*3 + i] = temp;
31498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
31698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    final float[] mMat;
31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
322