import {ArrayUtil} from '../common/lang/ArrayUtil';
import {Matrix4} from './Matrix4';
//==========================================================
// 矩阵函数管理类
//
// @author maocy
// @version 141231
//==========================================================
export class MatrixUtil {
// 单位三维矩阵
public static identity3x3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];
// 单位四维矩阵
public static identity4x4 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
// 临时内容16数组
public static Value16: Array = new Array(16);
//==========================================================
// 构造处理。
//==========================================================
// public static tempMatrix = function() {
// var matrix = new Matrix4();
// return function ():Matrix4{
// return matrix;
// }
// }();
//==========================================================
// 计算左手矩阵。
//
// @param matrix 矩阵
// @param width 宽度
// @param height 高度
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static perspectiveLH(matrix: Matrix4, width: number, height: number, znear: number, zfar: number) {
var data = matrix.elements;
// 填充行1数据
data[0] = 2 * znear / width;
data[1] = 0;
data[2] = 0;
data[3] = 0;
// 填充行2数据
data[4] = 0;
data[5] = 2 * znear / height;
data[6] = 0;
data[7] = 0;
// 填充行3数据
data[8] = 0;
data[9] = 0;
data[10] = zfar / (zfar - znear);
data[11] = 1;
// 填充行4数据
data[12] = 0;
data[13] = 0;
data[14] = (znear * zfar) / (znear - zfar);
data[15] = 0;
}
//==========================================================
// 计算右手矩阵。
//
// @param matrix 矩阵
// @param width 宽度
// @param width 高度
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static perspectiveRH(matrix: Matrix4, width: number, height: number, znear: number, zfar: number) {
var data = matrix.elements;
// 填充行1数据
data[0] = 2 * znear / width;
data[1] = 0;
data[2] = 0;
data[3] = 0;
// 填充行2数据
data[4] = 0;
data[5] = 2 * znear / height;
data[6] = 0;
data[7] = 0;
// 填充行3数据
data[8] = 0;
data[9] = 0;
data[10] = zfar / (znear - zfar);
data[11] = 1;
// 填充行4数据
data[12] = 0;
data[13] = 0;
data[14] = (znear * zfar) / (znear - zfar);
data[15] = 0;
}
//==========================================================
// 根据FOV计算左手矩阵。
//
// @param matrix 矩阵
// @param fieldOfView 夹角
// @param aspectRatio 高宽比率
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static perspectiveFieldOfViewLH(matrix: Matrix4, fieldOfView: number, aspectRatio: number, znear: number, zfar: number) {
var data = matrix.elements;
var sy = 1 / Math.tan(fieldOfView * 0.5);
var sx = sy / aspectRatio;
// 填充行1数据
data[0] = sx;
data[1] = 0;
data[2] = 0;
data[3] = 0;
// 填充行2数据
data[4] = 0;
data[5] = sy;
data[6] = 0;
data[7] = 0;
// 填充行3数据
data[8] = 0;
data[9] = 0;
data[10] = zfar / (zfar - znear);
data[11] = 1;
// 填充行4数据
data[12] = 0;
data[13] = 0;
data[14] = (znear * zfar) / (znear - zfar);
data[15] = 0;
}
//==========================================================
// 根据FOV计算右手矩阵。
//
// @param matrix 矩阵
// @param fieldOfView 夹角
// @param aspectRatio 高宽比率
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static perspectiveFieldOfViewRH(matrix: Matrix4, fieldOfView: number, aspectRatio: number, znear: number, zfar: number) {
var data = matrix.elements;
var sy = 1 / Math.tan(fieldOfView * 0.5);
var sx = sy / aspectRatio;
// 填充行1数据
data[0] = sx;
data[1] = 0;
data[2] = 0;
data[3] = 0;
// 填充行2数据
data[4] = 0;
data[5] = sy;
data[6] = 0;
data[7] = 0;
// 填充行3数据
data[8] = 0;
data[9] = 0;
data[10] = zfar / (znear - zfar);
data[11] = 1;
// 填充行4数据
data[12] = 0;
data[13] = 0;
data[14] = (znear * zfar) / (zfar - znear);
data[15] = 0;
}
//==========================================================
// 计算正交投影矩阵。
//
// @param matrix 矩阵
// @param left 左位置
// @param top 上位置
// @param width 宽度
// @param height 高度
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static orthoLH(matrix: Matrix4, left: number, top: number, width: number, height: number, znear: number, zfar: number) {
// 计算变量
var right = left + width;
var bottom = top + height;
var distance = zfar - znear;
var x = (left + right) / width;
var y = (top + bottom) / height;
var z = znear / distance;
// 设置数据
var data = ArrayUtil.copy(this.identity4x4, 0, 16, matrix.elements as any, 0);
data[0] = 2 / width;
data[5] = 2 / height;
data[10] = 1 / distance;
data[12] = -x;
data[13] = -y;
data[14] = -z;
}
//==========================================================
// 计算正交投影矩阵。
//
// @param matrix 矩阵
// @param left 左位置
// @param top 上位置
// @param width 宽度
// @param height 高度
// @param znear 近平面
// @param zfar 远平面
//==========================================================
public static orthoRH(matrix: Matrix4, left: number, top: number, width: number, height: number, znear: number, zfar: number) {
// 计算变量
var right = left + width;
var bottom = top + height;
var distance = zfar - znear;
var x = (left + right) / width;
var y = (top + bottom) / height;
var z = (znear + zfar) / distance;
// 设置数据
var data = ArrayUtil.copy(this.identity4x4, 0, 16, matrix.elements as any, 0);
data[0] = 2 / width;
data[5] = 2 / height;
data[10] = -2 / distance;
data[12] = -x;
data[13] = -y;
data[14] = -z;
}
}