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