Matrix3f.java revision 518f033b68649c151cc8725ea8c557eae01cc567
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 } 168518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk public void transpose() { 169518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int i = 0; i < 2; ++i) { 170518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk for(int j = i + 1; j < 3; ++j) { 171518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk float temp = mMat[i*3 + j]; 172518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[i*3 + j] = mMat[j*3 + i]; 173518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[j*3 + i] = temp; 174518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 175518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 176518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 177cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 17825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 17925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams} 18025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 18125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 182