152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/*
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License.
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.graphics.kube;
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/**
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * A 4x4 float matrix
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpublic class M4 {
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public float[][] m = new float[4][4];
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public M4() {
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public M4(M4 other) {
3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		for (int i = 0; i < 4; i++) {
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			for (int j = 0; j < 4; j++) {
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				m[i][j] = other.m[i][j];
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			}
3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		}
3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public void multiply(GLVertex src, GLVertex dest) {
3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		dest.x = src.x * m[0][0] + src.y * m[1][0] + src.z * m[2][0] + m[3][0];
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		dest.y = src.x * m[0][1] + src.y * m[1][1] + src.z * m[2][1] + m[3][1];
4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		dest.z = src.x * m[0][2] + src.y * m[1][2] + src.z * m[2][2] + m[3][2];
4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public M4 multiply(M4 other) {
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		M4 result = new M4();
4652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		float[][] m1 = m;
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		float[][] m2 = other.m;
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		for (int i = 0; i < 4; i++) {
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			for (int j = 0; j < 4; j++) {
5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				result.m[i][j] = m1[i][0]*m2[0][j] + m1[i][1]*m2[1][j] + m1[i][2]*m2[2][j] + m1[i][3]*m2[3][j];
5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			}
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		}
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		return result;
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public void setIdentity() {
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		for (int i = 0; i < 4; i++) {
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			for (int j = 0; j < 4; j++) {
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				m[i][j] = (i == j ? 1f : 0f);
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			}
6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		}
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	@Override
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	public String toString() {
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		StringBuilder builder = new StringBuilder("[ ");
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		for (int i = 0; i < 4; i++) {
7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			for (int j = 0; j < 4; j++) {
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				builder.append(m[i][j]);
7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				builder.append(" ");
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			}
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project			if (i < 2)
7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project				builder.append("\n  ");
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		}
7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		builder.append(" ]");
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project		return builder.toString();
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project	}
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}
81