Matrix.h revision 08ae317c21ec3086b5017672bba87420cc38a407
108ae317c21ec3086b5017672bba87420cc38a407Romain Guy/* 208ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Copyright (C) 2010 The Android Open Source Project 308ae317c21ec3086b5017672bba87420cc38a407Romain Guy * 408ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 508ae317c21ec3086b5017672bba87420cc38a407Romain Guy * you may not use this file except in compliance with the License. 608ae317c21ec3086b5017672bba87420cc38a407Romain Guy * You may obtain a copy of the License at 708ae317c21ec3086b5017672bba87420cc38a407Romain Guy * 808ae317c21ec3086b5017672bba87420cc38a407Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 908ae317c21ec3086b5017672bba87420cc38a407Romain Guy * 1008ae317c21ec3086b5017672bba87420cc38a407Romain Guy * Unless required by applicable law or agreed to in writing, software 1108ae317c21ec3086b5017672bba87420cc38a407Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 1208ae317c21ec3086b5017672bba87420cc38a407Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308ae317c21ec3086b5017672bba87420cc38a407Romain Guy * See the License for the specific language governing permissions and 1408ae317c21ec3086b5017672bba87420cc38a407Romain Guy * limitations under the License. 1508ae317c21ec3086b5017672bba87420cc38a407Romain Guy */ 1608ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1708ae317c21ec3086b5017672bba87420cc38a407Romain Guy#ifndef ANDROID_UI_MATRIX_H 1808ae317c21ec3086b5017672bba87420cc38a407Romain Guy#define ANDROID_UI_MATRIX_H 1908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 2008ae317c21ec3086b5017672bba87420cc38a407Romain Guynamespace android { 2108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 2208ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 2308ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Classes 2408ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 2508ae317c21ec3086b5017672bba87420cc38a407Romain Guy 2608ae317c21ec3086b5017672bba87420cc38a407Romain Guyclass Matrix4 { 2708ae317c21ec3086b5017672bba87420cc38a407Romain Guypublic: 2808ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4() { 2908ae317c21ec3086b5017672bba87420cc38a407Romain Guy loadIdentity(); 3008ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 3108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 3208ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4(const float* v) { 3308ae317c21ec3086b5017672bba87420cc38a407Romain Guy load(v); 3408ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 3508ae317c21ec3086b5017672bba87420cc38a407Romain Guy 3608ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4(const Matrix4& v) { 3708ae317c21ec3086b5017672bba87420cc38a407Romain Guy load(v); 3808ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 3908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 4008ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadIdentity(); 4108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 4208ae317c21ec3086b5017672bba87420cc38a407Romain Guy void load(const float* v); 4308ae317c21ec3086b5017672bba87420cc38a407Romain Guy void load(const Matrix4& v); 4408ae317c21ec3086b5017672bba87420cc38a407Romain Guy 4508ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadTranslate(float x, float y, float z); 4608ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadScale(float sx, float sy, float sz); 4708ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadRotate(float angle, float x, float y, float z); 4808ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadMultiply(const Matrix4& u, const Matrix4& v); 4908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 5008ae317c21ec3086b5017672bba87420cc38a407Romain Guy void loadOrtho(float left, float right, float bottom, float top, float near, float far); 5108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 5208ae317c21ec3086b5017672bba87420cc38a407Romain Guy void multiply(const Matrix4& v) { 5308ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4 u; 5408ae317c21ec3086b5017672bba87420cc38a407Romain Guy u.loadMultiply(*this, v); 5508ae317c21ec3086b5017672bba87420cc38a407Romain Guy load(u); 5608ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 5708ae317c21ec3086b5017672bba87420cc38a407Romain Guy 5808ae317c21ec3086b5017672bba87420cc38a407Romain Guy void translate(float x, float y, float z) { 5908ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4 u; 6008ae317c21ec3086b5017672bba87420cc38a407Romain Guy u.loadTranslate(x, y, z); 6108ae317c21ec3086b5017672bba87420cc38a407Romain Guy multiply(u); 6208ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 6308ae317c21ec3086b5017672bba87420cc38a407Romain Guy 6408ae317c21ec3086b5017672bba87420cc38a407Romain Guy void scale(float sx, float sy, float sz) { 6508ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4 u; 6608ae317c21ec3086b5017672bba87420cc38a407Romain Guy u.loadScale(sx, sy, sz); 6708ae317c21ec3086b5017672bba87420cc38a407Romain Guy multiply(u); 6808ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 6908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 7008ae317c21ec3086b5017672bba87420cc38a407Romain Guy void rotate(float angle, float x, float y, float z) { 7108ae317c21ec3086b5017672bba87420cc38a407Romain Guy Matrix4 u; 7208ae317c21ec3086b5017672bba87420cc38a407Romain Guy u.loadRotate(angle, x, y, z); 7308ae317c21ec3086b5017672bba87420cc38a407Romain Guy multiply(u); 7408ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 7508ae317c21ec3086b5017672bba87420cc38a407Romain Guy 7608ae317c21ec3086b5017672bba87420cc38a407Romain Guy void copyTo(float* v) const; 7708ae317c21ec3086b5017672bba87420cc38a407Romain Guy 7808ae317c21ec3086b5017672bba87420cc38a407Romain Guy void dump() const; 7908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 8008ae317c21ec3086b5017672bba87420cc38a407Romain Guy//private: 8108ae317c21ec3086b5017672bba87420cc38a407Romain Guy inline float get(int i, int j) const { 8208ae317c21ec3086b5017672bba87420cc38a407Romain Guy return mMat[i * 4 + j]; 8308ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 8408ae317c21ec3086b5017672bba87420cc38a407Romain Guy 8508ae317c21ec3086b5017672bba87420cc38a407Romain Guy inline void set(int i, int j, float v) { 8608ae317c21ec3086b5017672bba87420cc38a407Romain Guy mMat[i * 4 + j] = v; 8708ae317c21ec3086b5017672bba87420cc38a407Romain Guy } 8808ae317c21ec3086b5017672bba87420cc38a407Romain Guy 8908ae317c21ec3086b5017672bba87420cc38a407Romain Guy float mMat[16]; 9008ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // class Matrix4 9108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 9208ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 9308ae317c21ec3086b5017672bba87420cc38a407Romain Guy// Types 9408ae317c21ec3086b5017672bba87420cc38a407Romain Guy/////////////////////////////////////////////////////////////////////////////// 9508ae317c21ec3086b5017672bba87420cc38a407Romain Guy 9608ae317c21ec3086b5017672bba87420cc38a407Romain Guytypedef Matrix4 mat4; 9708ae317c21ec3086b5017672bba87420cc38a407Romain Guy 9808ae317c21ec3086b5017672bba87420cc38a407Romain Guy}; // namespace android 9908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 10008ae317c21ec3086b5017672bba87420cc38a407Romain Guy#endif // ANDROID_UI_MATRIX_H 101