/*
 * 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 <math.h>
#include <stdlib.h>

#include <utils/Log.h>

#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("%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]);
}

};
