/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "UIMatrix" #include #include #include #include #include "Matrix.h" namespace android { void Matrix4::loadIdentity() { mMat[0] = 1; mMat[1] = 0; mMat[2] = 0; mMat[3] = 0; mMat[4] = 0; mMat[5] = 1; mMat[6] = 0; mMat[7] = 0; mMat[8] = 0; mMat[9] = 0; mMat[10] = 1; mMat[11] = 0; mMat[12] = 0; mMat[13] = 0; mMat[14] = 0; mMat[15] = 1; } void Matrix4::load(const float* v) { memcpy(mMat, v, sizeof(mMat)); } void Matrix4::load(const Matrix4& v) { memcpy(mMat, v.mMat, sizeof(mMat)); } void Matrix4::copyTo(float* v) const { memcpy(v, mMat, sizeof(mMat)); } void Matrix4::loadTranslate(float x, float y, float z) { loadIdentity(); mMat[12] = x; mMat[13] = y; mMat[14] = z; } void Matrix4::loadScale(float sx, float sy, float sz) { loadIdentity(); mMat[0] = sx; mMat[5] = sy; mMat[10] = sz; } void Matrix4::loadRotate(float angle, float x, float y, float z) { mMat[3] = 0; mMat[7] = 0; mMat[11] = 0; mMat[12] = 0; mMat[13] = 0; mMat[14] = 0; mMat[15] = 1; angle *= float(M_PI / 180.0f); float c = cosf(angle); float s = sinf(angle); const float length = sqrtf(x * x + y * y + z * z); const float nc = 1.0f - c; const float xy = x * y; const float yz = y * z; const float zx = z * x; const float xs = x * s; const float ys = y * s; const float zs = z * s; mMat[0] = x * x * nc + c; mMat[4] = xy * nc - zs; mMat[8] = zx * nc + ys; mMat[1] = xy * nc + zs; mMat[5] = y * y * nc + c; mMat[9] = yz * nc - xs; mMat[2] = zx * nc - ys; mMat[6] = yz * nc + xs; mMat[10] = z * z * nc + c; } void Matrix4::loadMultiply(const Matrix4& u, const Matrix4& v) { for (int i = 0 ; i < 4 ; i++) { float x = 0; float y = 0; float z = 0; float w = 0; for (int j = 0 ; j < 4 ; j++) { const float e = v.get(i,j); x += u.get(j, 0) * e; y += u.get(j, 1) * e; z += u.get(j, 2) * e; w += u.get(j, 3) * e; } set(i, 0, x); set(i, 1, y); set(i, 2, z); set(i, 3, w); } } void Matrix4::loadOrtho(float left, float right, float bottom, float top, float near, float far) { loadIdentity(); mMat[0] = 2 / (right - left); mMat[5] = 2 / (top - bottom); mMat[10] = -2 / (far - near); mMat[12] = -(right + left) / (right - left); mMat[13] = -(top + bottom) / (top - bottom); mMat[14] = -(far + near) / (far - near); } void Matrix4::dump() const { LOGD("Matrix4["); LOGD(" %f %f %f %f", mMat[0], mMat[4], mMat[ 8], mMat[12]); LOGD(" %f %f %f %f", mMat[1], mMat[5], mMat[ 9], mMat[13]); LOGD(" %f %f %f %f", mMat[2], mMat[6], mMat[10], mMat[14]); LOGD(" %f %f %f %f", mMat[3], mMat[7], mMat[11], mMat[15]); LOGD("]"); } };