Matrix4f.java revision b37c0a5db65cd8b72cac6a3250faddd1aecb722e
10826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams/* 20826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * Copyright (C) 2009 The Android Open Source Project 30826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 40826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 50826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * you may not use this file except in compliance with the License. 60826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * You may obtain a copy of the License at 70826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 80826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * http://www.apache.org/licenses/LICENSE-2.0 90826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * Unless required by applicable law or agreed to in writing, software 110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * See the License for the specific language governing permissions and 140826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * limitations under the License. 150826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams */ 160826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 170826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samspackage android.renderscript; 180826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 190826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsimport java.lang.Math; 200826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsimport android.util.Log; 210826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 220826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 230826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsclass Matrix { 240826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 250826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public Matrix() { 260826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat = new float[16]; 270826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 280826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 290826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 300826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public float get(int i, int j) { 310826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mMat[i*4 + j]; 320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void set(int i, int j, float v) { 350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[i*4 + j] = v; 360826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 370826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 380826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadIdentity() { 390826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 1; 400826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[1] = 0; 410826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[2] = 0; 420826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[3] = 0; 430826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 440826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[4] = 0; 450826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 1; 460826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[6] = 0; 470826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[7] = 0; 480826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 490826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[8] = 0; 500826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[9] = 0; 510826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = 1; 520826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11] = 0; 530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12] = 0; 550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13] = 0; 560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14] = 0; 570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15] = 1; 580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void load(Matrix src) { 610826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat = src.mMat; 620826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 630826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 640826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadRotate(float rot, float x, float y, float z) { 650826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float c, s; 660826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[3] = 0; 670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[7] = 0; 680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11]= 0; 690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12]= 0; 700826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13]= 0; 710826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14]= 0; 720826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15]= 1; 730826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 740826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams c = (float)java.lang.Math.cos(rot); 750826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams s = (float)java.lang.Math.sin(rot); 760826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 770826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 780826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams if (!(len != 1)) { 790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float recipLen = 1.f / len; 800826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams x *= recipLen; 810826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams y *= recipLen; 820826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams z *= recipLen; 830826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float nc = 1.0f - c; 850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float xy = x * y; 860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float yz = y * z; 870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float zx = z * x; 880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float xs = x * s; 890826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ys = y * s; 900826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float zs = z * s; 910826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 0] = x*x*nc + c; 920826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 4] = xy*nc - zs; 930826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 8] = zx*nc + ys; 940826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 1] = xy*nc + zs; 950826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 5] = y*y*nc + c; 960826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 9] = yz*nc - xs; 970826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 2] = zx*nc - ys; 980826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 6] = yz*nc + xs; 990826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = z*z*nc + c; 1000826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1010826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1020826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadScale(float x, float y, float z) { 1030826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1040826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = x; 1050826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = y; 1060826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = z; 1070826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1080826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1090826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadTranslate(float x, float y, float z) { 1100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12] = x; 1120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13] = y; 1130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14] = z; 1140826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1150826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1160826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadMultiply(Matrix lhs, Matrix rhs) { 1170826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams for (int i=0 ; i<4 ; i++) { 1180826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri0 = 0; 1190826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri1 = 0; 1200826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri2 = 0; 1210826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri3 = 0; 1220826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams for (int j=0 ; j<4 ; j++) { 1230826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float rhs_ij = rhs.get(i,j); 1240826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri0 += lhs.get(j,0) * rhs_ij; 1250826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri1 += lhs.get(j,1) * rhs_ij; 1260826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri2 += lhs.get(j,2) * rhs_ij; 1270826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri3 += lhs.get(j,3) * rhs_ij; 1280826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1290826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,0, ri0); 1300826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,1, ri1); 1310826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,2, ri2); 1320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,3, ri3); 1330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1360826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadOrtho(float l, float r, float b, float t, float n, float f) { 1370826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1380826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 2 / (r - l); 1390826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 2 / (t - b); 1400826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10]= -2 / (f - n); 1410826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12]= -(r + l) / (r - l); 142b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams mMat[13]= -(t + b) / (t - b); 143b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams mMat[14]= -(f + n) / (f - n); 1440826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1450826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1460826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadFrustum(float l, float r, float b, float t, float n, float f) { 1470826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1480826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 2 * n / (r - l); 1490826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 2 * n / (t - b); 1500826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[8] = (r + l) / (r - l); 1510826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[9] = (t + b) / (t - b); 1520826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10]= -(f + n) / (f - n); 1530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11]= -1; 1540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14]= -2*f*n / (f - n); 1550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15]= 0; 1560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void multiply(Matrix rhs) { 1590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Matrix tmp = new Matrix(); 1600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadMultiply(this, rhs); 1610826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams load(tmp); 1620826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1630826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void rotate(float rot, float x, float y, float z) { 1640826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Matrix tmp = new Matrix(); 1650826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadRotate(rot, x, y, z); 1660826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void scale(float x, float y, float z) { 1690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Matrix tmp = new Matrix(); 1700826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadScale(x, y, z); 1710826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1720826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1730826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void translate(float x, float y, float z) { 1740826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Matrix tmp = new Matrix(); 1750826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadTranslate(x, y, z); 1760826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1770826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1780826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1800826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1810826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float[] mMat; 1820826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1830826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams} 1840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 189