Matrix3f.java revision cf9a44cdf3647c8b31499ad6250f63259c0e34e2
125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/*
225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Copyright (C) 2009 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
2325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/**
2425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * @hide
2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams *
2625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams **/
2725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix3f {
2825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
2925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public Matrix3f() {
3025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat = new float[9];
3125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        loadIdentity();
3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
3325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
3425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public float get(int i, int j) {
3525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        return mMat[i*3 + j];
3625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
3725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
3825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public void set(int i, int j, float v) {
3925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[i*3 + j] = v;
4025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
4125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
4225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public void loadIdentity() {
4325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[0] = 1;
4425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[1] = 0;
4525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[2] = 0;
4625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
4725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[3] = 0;
4825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[4] = 1;
4925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[5] = 0;
5025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
5125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[6] = 0;
5225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[7] = 0;
5325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[8] = 1;
5425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
5525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
5625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public void load(Matrix3f src) {
5725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        System.arraycopy(mMat, 0, src, 0, 9);
5825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
5925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
60cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadRotate(float rot, float x, float y, float z) {
61cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float c, s;
62cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        rot *= (float)(java.lang.Math.PI / 180.0f);
63cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        c = (float)java.lang.Math.cos(rot);
64cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        s = (float)java.lang.Math.sin(rot);
65cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
66cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
67cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        if (!(len != 1)) {
68cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            float recipLen = 1.f / len;
69cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            x *= recipLen;
70cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            y *= recipLen;
71cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            z *= recipLen;
72cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        }
73cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float nc = 1.0f - c;
74cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float xy = x * y;
75cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float yz = y * z;
76cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float zx = z * x;
77cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float xs = x * s;
78cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float ys = y * s;
79cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float zs = z * s;
80cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[0] = x*x*nc +  c;
81cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[3] =  xy*nc - zs;
82cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[6] =  zx*nc + ys;
83cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[1] =  xy*nc + zs;
84cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[4] = y*y*nc +  c;
85cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[9] =  yz*nc - xs;
86cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[2] =  zx*nc - ys;
87cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[6] =  yz*nc + xs;
88cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[8] = z*z*nc +  c;
89cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
90cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
91cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadRotate(float rot) {
92cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        float c, s;
93cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        rot *= (float)(java.lang.Math.PI / 180.0f);
94cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        c = (float)java.lang.Math.cos(rot);
95cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        s = (float)java.lang.Math.sin(rot);
96cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[0] = c;
97cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[1] = -s;
98cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[3] = s;
99cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[4] = c;
100cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
101cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
102cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadScale(float x, float y) {
103cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        loadIdentity();
104cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[0] = x;
105cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[4] = y;
106cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
107cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
108cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadScale(float x, float y, float z) {
109cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        loadIdentity();
110cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[0] = x;
111cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[4] = y;
112cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[8] = z;
113cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
114cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
115cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadTranslate(float x, float y) {
116cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        loadIdentity();
117cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[6] = x;
118cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        mMat[7] = y;
119cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
120cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
121cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void loadMultiply(Matrix3f lhs, Matrix3f rhs) {
122cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        for (int i=0 ; i<3 ; i++) {
123cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            float ri0 = 0;
124cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            float ri1 = 0;
125cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            float ri2 = 0;
126cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            for (int j=0 ; j<3 ; j++) {
127cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk                float rhs_ij = rhs.get(i,j);
128cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk                ri0 += lhs.get(j,0) * rhs_ij;
129cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk                ri1 += lhs.get(j,1) * rhs_ij;
130cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk                ri2 += lhs.get(j,2) * rhs_ij;
131cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            }
132cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            set(i,0, ri0);
133cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            set(i,1, ri1);
134cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk            set(i,2, ri2);
135cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        }
136cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
137cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
138cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void multiply(Matrix3f rhs) {
139cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
140cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadMultiply(this, rhs);
141cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        load(tmp);
142cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
143cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void rotate(float rot, float x, float y, float z) {
144cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
145cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadRotate(rot, x, y, z);
146cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        multiply(tmp);
147cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
148cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void rotate(float rot) {
149cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
150cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadRotate(rot);
151cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        multiply(tmp);
152cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
153cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void scale(float x, float y) {
154cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
155cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadScale(x, y);
156cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        multiply(tmp);
157cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
158cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void scale(float x, float y, float z) {
159cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
160cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadScale(x, y, z);
161cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        multiply(tmp);
162cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
163cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    public void translate(float x, float y) {
164cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        Matrix3f tmp = new Matrix3f();
165cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        tmp.loadTranslate(x, y);
166cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk        multiply(tmp);
167cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk    }
168cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk
16925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    final float[] mMat;
17025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams}
17125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
17225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
173