Matrix4f.java revision 25430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4e
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 23e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams/** 24e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams * @hide 25e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams * 26e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams **/ 2725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix4f { 280826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 2925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public Matrix4f() { 300826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat = new float[16]; 310826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public float get(int i, int j) { 350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mMat[i*4 + j]; 360826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 370826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 380826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void set(int i, int j, float v) { 390826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[i*4 + j] = v; 400826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 410826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 420826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadIdentity() { 430826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 1; 440826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[1] = 0; 450826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[2] = 0; 460826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[3] = 0; 470826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 480826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[4] = 0; 490826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 1; 500826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[6] = 0; 510826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[7] = 0; 5225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[8] = 0; 540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[9] = 0; 550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = 1; 560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11] = 0; 570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12] = 0; 590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13] = 0; 600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14] = 0; 610826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15] = 1; 620826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 630826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 6425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void load(Matrix4f src) { 6525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams System.arraycopy(mMat, 0, src, 0, 16); 660826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadRotate(float rot, float x, float y, float z) { 690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float c, s; 700826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[3] = 0; 710826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[7] = 0; 720826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11]= 0; 730826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12]= 0; 740826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13]= 0; 750826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14]= 0; 760826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15]= 1; 770826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams rot *= (float)(java.lang.Math.PI / 180.0f); 780826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams c = (float)java.lang.Math.cos(rot); 790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams s = (float)java.lang.Math.sin(rot); 8025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 810826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z); 820826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams if (!(len != 1)) { 830826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float recipLen = 1.f / len; 840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams x *= recipLen; 850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams y *= recipLen; 860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams z *= recipLen; 870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float nc = 1.0f - c; 890826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float xy = x * y; 900826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float yz = y * z; 910826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float zx = z * x; 920826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float xs = x * s; 930826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ys = y * s; 9425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams float zs = z * s; 950826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 0] = x*x*nc + c; 960826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 4] = xy*nc - zs; 970826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 8] = zx*nc + ys; 980826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 1] = xy*nc + zs; 990826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 5] = y*y*nc + c; 1000826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 9] = yz*nc - xs; 1010826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 2] = zx*nc - ys; 1020826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[ 6] = yz*nc + xs; 1030826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = z*z*nc + c; 1040826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1050826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1060826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadScale(float x, float y, float z) { 1070826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1080826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = x; 1090826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = y; 1100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10] = z; 1110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 11225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadTranslate(float x, float y, float z) { 1140826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1150826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12] = x; 1160826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[13] = y; 1170826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14] = z; 1180826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1190826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 12025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadMultiply(Matrix4f lhs, Matrix4f rhs) { 1210826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams for (int i=0 ; i<4 ; i++) { 1220826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri0 = 0; 1230826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri1 = 0; 1240826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri2 = 0; 1250826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float ri3 = 0; 1260826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams for (int j=0 ; j<4 ; j++) { 1270826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float rhs_ij = rhs.get(i,j); 1280826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri0 += lhs.get(j,0) * rhs_ij; 1290826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri1 += lhs.get(j,1) * rhs_ij; 1300826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri2 += lhs.get(j,2) * rhs_ij; 1310826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ri3 += lhs.get(j,3) * rhs_ij; 1320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,0, ri0); 1340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,1, ri1); 1350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,2, ri2); 1360826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams set(i,3, ri3); 1370826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1380826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1390826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1400826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadOrtho(float l, float r, float b, float t, float n, float f) { 1410826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1420826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 2 / (r - l); 1430826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 2 / (t - b); 1440826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10]= -2 / (f - n); 1450826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[12]= -(r + l) / (r - l); 146b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams mMat[13]= -(t + b) / (t - b); 147b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams mMat[14]= -(f + n) / (f - n); 1480826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1490826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1500826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void loadFrustum(float l, float r, float b, float t, float n, float f) { 1510826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams loadIdentity(); 1520826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[0] = 2 * n / (r - l); 1530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[5] = 2 * n / (t - b); 1540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[8] = (r + l) / (r - l); 1550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[9] = (t + b) / (t - b); 1560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[10]= -(f + n) / (f - n); 1570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[11]= -1; 1580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[14]= -2*f*n / (f - n); 1590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mMat[15]= 0; 1600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1610826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 16225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void multiply(Matrix4f rhs) { 16325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f tmp = new Matrix4f(); 1640826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadMultiply(this, rhs); 1650826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams load(tmp); 1660826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void rotate(float rot, float x, float y, float z) { 16825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f tmp = new Matrix4f(); 1690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadRotate(rot, x, y, z); 1700826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1710826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1720826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void scale(float x, float y, float z) { 17325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f tmp = new Matrix4f(); 1740826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadScale(x, y, z); 1750826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1760826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1770826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams public void translate(float x, float y, float z) { 17825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f tmp = new Matrix4f(); 1790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams tmp.loadTranslate(x, y, z); 1800826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams multiply(tmp); 1810826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1820826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 18325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 1840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams} 1850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1890826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 190