wonder.js
Version:
483 lines (460 loc) • 15.3 kB
JavaScript
'use strict';
var Log$WonderLog = require("wonder-log/lib/js/src/Log.js");
var Contract$WonderLog = require("wonder-log/lib/js/src/Contract.js");
var AngleService$Wonderjs = require("./AngleService.js");
var StateDataMain$Wonderjs = require("../state/main/data/StateDataMain.js");
var Matrix3Service$Wonderjs = require("./Matrix3Service.js");
var Vector3Service$Wonderjs = require("./Vector3Service.js");
var Matrix4Service$WonderWebgl = require("wonder-webgl/lib/js/src/service/atom/Matrix4Service.js");
var IsDebugMainService$Wonderjs = require("../state/main/state/IsDebugMainService.js");
function createIdentityMatrix4(param) {
return Matrix4Service$WonderWebgl.createIdentityMatrix4(/* () */0);
}
function fromTranslation(param, resultFloat32Arr) {
resultFloat32Arr[0] = 1;
resultFloat32Arr[1] = 0;
resultFloat32Arr[2] = 0;
resultFloat32Arr[3] = 0;
resultFloat32Arr[4] = 0;
resultFloat32Arr[5] = 1;
resultFloat32Arr[6] = 0;
resultFloat32Arr[7] = 0;
resultFloat32Arr[8] = 0;
resultFloat32Arr[9] = 0;
resultFloat32Arr[10] = 1;
resultFloat32Arr[11] = 0;
resultFloat32Arr[12] = param[0];
resultFloat32Arr[13] = param[1];
resultFloat32Arr[14] = param[2];
resultFloat32Arr[15] = 1;
return resultFloat32Arr;
}
function fromTranslationRotationScale(param, param$1, param$2, resultFloat32Arr) {
var sz = param$2[2];
var sy = param$2[1];
var sx = param$2[0];
var w = param$1[3];
var z = param$1[2];
var y = param$1[1];
var x = param$1[0];
var x2 = x + x;
var y2 = y + y;
var z2 = z + z;
var xx = x * x2;
var xy = x * y2;
var xz = x * z2;
var yy = y * y2;
var yz = y * z2;
var zz = z * z2;
var wx = w * x2;
var wy = w * y2;
var wz = w * z2;
resultFloat32Arr[0] = (1 - (yy + zz)) * sx;
resultFloat32Arr[1] = (xy + wz) * sx;
resultFloat32Arr[2] = (xz - wy) * sx;
resultFloat32Arr[3] = 0;
resultFloat32Arr[4] = (xy - wz) * sy;
resultFloat32Arr[5] = (1 - (xx + zz)) * sy;
resultFloat32Arr[6] = (yz + wx) * sy;
resultFloat32Arr[7] = 0;
resultFloat32Arr[8] = (xz + wy) * sz;
resultFloat32Arr[9] = (yz - wx) * sz;
resultFloat32Arr[10] = (1 - (xx + yy)) * sz;
resultFloat32Arr[11] = 0;
resultFloat32Arr[12] = param[0];
resultFloat32Arr[13] = param[1];
resultFloat32Arr[14] = param[2];
resultFloat32Arr[15] = 1;
return resultFloat32Arr;
}
function getX(matTypeArr) {
return /* tuple */[
matTypeArr[0],
matTypeArr[1],
matTypeArr[2]
];
}
function getY(matTypeArr) {
return /* tuple */[
matTypeArr[4],
matTypeArr[5],
matTypeArr[6]
];
}
function getZ(matTypeArr) {
return /* tuple */[
matTypeArr[8],
matTypeArr[9],
matTypeArr[10]
];
}
function getTranslationTypeArray(matTypeArr) {
return new Float32Array(/* array */[
matTypeArr[12],
matTypeArr[13],
matTypeArr[14]
]);
}
function getTranslationTuple(matTypeArr) {
return /* tuple */[
matTypeArr[12],
matTypeArr[13],
matTypeArr[14]
];
}
function getRotationTuple(matTypeArr) {
var trace = matTypeArr[0] + matTypeArr[5] + matTypeArr[10];
if (trace > 0) {
var s = Math.sqrt(trace + 1.0) * 2;
return /* tuple */[
(matTypeArr[6] - matTypeArr[9]) / s,
(matTypeArr[8] - matTypeArr[2]) / s,
(matTypeArr[1] - matTypeArr[4]) / s,
0.25 * s
];
} else if (matTypeArr[0] > matTypeArr[5] && matTypeArr[0] > matTypeArr[10]) {
var s$1 = Math.sqrt(1.0 + matTypeArr[0] - matTypeArr[5] - matTypeArr[10]) * 2;
return /* tuple */[
0.25 * s$1,
(matTypeArr[1] + matTypeArr[4]) / s$1,
(matTypeArr[8] + matTypeArr[2]) / s$1,
(matTypeArr[6] - matTypeArr[9]) / s$1
];
} else if (matTypeArr[5] > matTypeArr[10]) {
var s$2 = Math.sqrt(1.0 + matTypeArr[5] - matTypeArr[0] - matTypeArr[10]) * 2;
return /* tuple */[
(matTypeArr[1] + matTypeArr[4]) / s$2,
0.25 * s$2,
(matTypeArr[6] + matTypeArr[9]) / s$2,
(matTypeArr[8] - matTypeArr[2]) / s$2
];
} else {
var s$3 = Math.sqrt(1.0 + matTypeArr[10] - matTypeArr[0] - matTypeArr[5]) * 2;
return /* tuple */[
(matTypeArr[8] + matTypeArr[2]) / s$3,
(matTypeArr[6] + matTypeArr[9]) / s$3,
0.25 * s$3,
(matTypeArr[1] - matTypeArr[4]) / s$3
];
}
}
function getScaleTuple(matTypeArr) {
var m11 = matTypeArr[0];
var m12 = matTypeArr[1];
var m13 = matTypeArr[2];
var m21 = matTypeArr[4];
var m22 = matTypeArr[5];
var m23 = matTypeArr[6];
var m31 = matTypeArr[8];
var m32 = matTypeArr[9];
var m33 = matTypeArr[10];
return /* tuple */[
Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13),
Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23),
Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33)
];
}
function getEulerAngles(matTypeArr) {
var match = getScaleTuple(matTypeArr);
var sy = match[1];
var sx = match[0];
var a00 = matTypeArr[0];
var a01 = matTypeArr[1];
var a02 = matTypeArr[2];
var a10 = matTypeArr[4];
var a11 = matTypeArr[5];
var a12 = matTypeArr[6];
var a22 = matTypeArr[10];
var y = Math.asin(-a02 / sx);
var halfPi = Math.PI * 0.5;
var x = 0;
var z = 0;
if (y < halfPi) {
if (y > -halfPi) {
x = Math.atan2(a12 / sy, a22 / match[2]);
z = Math.atan2(a01 / sx, a00 / sx);
} else {
z = 0;
x = -Math.atan2(a11 / sy, a10 / sy);
}
} else {
z = 0;
x = Math.atan2(a11 / sy, a10 / sy);
}
return Vector3Service$Wonderjs.scale(/* Float */0, AngleService$Wonderjs.getRadToDeg(/* () */0), /* tuple */[
x,
y,
z
]);
}
function multiply(aMatTypeArr, bMatTypeArr, resultFloat32Arr) {
var a00 = aMatTypeArr[0];
var a01 = aMatTypeArr[1];
var a02 = aMatTypeArr[2];
var a03 = aMatTypeArr[3];
var a10 = aMatTypeArr[4];
var a11 = aMatTypeArr[5];
var a12 = aMatTypeArr[6];
var a13 = aMatTypeArr[7];
var a20 = aMatTypeArr[8];
var a21 = aMatTypeArr[9];
var a22 = aMatTypeArr[10];
var a23 = aMatTypeArr[11];
var a30 = aMatTypeArr[12];
var a31 = aMatTypeArr[13];
var a32 = aMatTypeArr[14];
var a33 = aMatTypeArr[15];
var b0 = bMatTypeArr[0];
var b1 = bMatTypeArr[1];
var b2 = bMatTypeArr[2];
var b3 = bMatTypeArr[3];
resultFloat32Arr[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
resultFloat32Arr[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
resultFloat32Arr[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
resultFloat32Arr[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
b0 = bMatTypeArr[4];
b1 = bMatTypeArr[5];
b2 = bMatTypeArr[6];
b3 = bMatTypeArr[7];
resultFloat32Arr[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
resultFloat32Arr[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
resultFloat32Arr[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
resultFloat32Arr[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
b0 = bMatTypeArr[8];
b1 = bMatTypeArr[9];
b2 = bMatTypeArr[10];
b3 = bMatTypeArr[11];
resultFloat32Arr[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
resultFloat32Arr[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
resultFloat32Arr[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
resultFloat32Arr[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
b0 = bMatTypeArr[12];
b1 = bMatTypeArr[13];
b2 = bMatTypeArr[14];
b3 = bMatTypeArr[15];
resultFloat32Arr[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
resultFloat32Arr[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
resultFloat32Arr[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
resultFloat32Arr[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
return resultFloat32Arr;
}
function buildPerspective(param, resultFloat32Arr) {
var far = param[3];
var near = param[2];
var fovy = param[0];
Contract$WonderLog.requireCheck((function (param) {
return Contract$WonderLog.test(Log$WonderLog.buildAssertMessage("frustum not be null", "be"), (function (param) {
var fovy$1 = Math.PI * fovy / 180 / 2;
return Contract$WonderLog.Operators[/* <>=. */4](Math.sin(fovy$1), 0);
}));
}), IsDebugMainService$Wonderjs.getIsDebug(StateDataMain$Wonderjs.stateData));
var fovy$1 = Math.PI * fovy / 180 / 2;
var s = Math.sin(fovy$1);
var rd = 1 / (far - near);
var ct = Math.cos(fovy$1) / s;
resultFloat32Arr[0] = ct / param[1];
resultFloat32Arr[1] = 0;
resultFloat32Arr[2] = 0;
resultFloat32Arr[3] = 0;
resultFloat32Arr[4] = 0;
resultFloat32Arr[5] = ct;
resultFloat32Arr[6] = 0;
resultFloat32Arr[7] = 0;
resultFloat32Arr[8] = 0;
resultFloat32Arr[9] = 0;
resultFloat32Arr[10] = -(far + near) * rd;
resultFloat32Arr[11] = -1;
resultFloat32Arr[12] = 0;
resultFloat32Arr[13] = 0;
resultFloat32Arr[14] = -2 * far * near * rd;
resultFloat32Arr[15] = 0;
return resultFloat32Arr;
}
function invert(mat, resultFloat32Arr) {
var a00 = mat[0];
var a01 = mat[1];
var a02 = mat[2];
var a03 = mat[3];
var a10 = mat[4];
var a11 = mat[5];
var a12 = mat[6];
var a13 = mat[7];
var a20 = mat[8];
var a21 = mat[9];
var a22 = mat[10];
var a23 = mat[11];
var a30 = mat[12];
var a31 = mat[13];
var a32 = mat[14];
var a33 = mat[15];
var b00 = a00 * a11 - a01 * a10;
var b01 = a00 * a12 - a02 * a10;
var b02 = a00 * a13 - a03 * a10;
var b03 = a01 * a12 - a02 * a11;
var b04 = a01 * a13 - a03 * a11;
var b05 = a02 * a13 - a03 * a12;
var b06 = a20 * a31 - a21 * a30;
var b07 = a20 * a32 - a22 * a30;
var b08 = a20 * a33 - a23 * a30;
var b09 = a21 * a32 - a22 * a31;
var b10 = a21 * a33 - a23 * a31;
var b11 = a22 * a33 - a23 * a32;
var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
var match = det;
if (match !== 0) {
det = 1.0 / det;
resultFloat32Arr[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
resultFloat32Arr[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
resultFloat32Arr[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
resultFloat32Arr[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
resultFloat32Arr[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
resultFloat32Arr[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
resultFloat32Arr[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
resultFloat32Arr[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
resultFloat32Arr[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
resultFloat32Arr[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
resultFloat32Arr[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
resultFloat32Arr[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
resultFloat32Arr[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
resultFloat32Arr[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
resultFloat32Arr[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
resultFloat32Arr[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
return resultFloat32Arr;
} else {
return Log$WonderLog.fatal(Log$WonderLog.buildFatalMessage("invert", "det shouldn\'t be 0.", "", "", ""));
}
}
function invertTo3x3(mat, resultFloat32Arr) {
var a00 = mat[0];
var a01 = mat[1];
var a02 = mat[2];
var a10 = mat[4];
var a11 = mat[5];
var a12 = mat[6];
var a20 = mat[8];
var a21 = mat[9];
var a22 = mat[10];
var b11 = a22 * a11 - a12 * a21;
var b21 = -a22 * a01 + a02 * a21;
var b31 = a12 * a01 - a02 * a11;
var b12 = -a22 * a10 + a12 * a20;
var b22 = a22 * a00 - a02 * a20;
var b32 = -a12 * a00 + a02 * a10;
var b13 = a21 * a10 - a11 * a20;
var b23 = -a21 * a00 + a01 * a20;
var b33 = a11 * a00 - a01 * a10;
var det = a00 * b11 + a01 * b12 + a02 * b13;
var match = det;
if (match !== 0) {
det = 1.0 / det;
resultFloat32Arr[0] = b11 * det;
resultFloat32Arr[1] = b21 * det;
resultFloat32Arr[2] = b31 * det;
resultFloat32Arr[3] = b12 * det;
resultFloat32Arr[4] = b22 * det;
resultFloat32Arr[5] = b32 * det;
resultFloat32Arr[6] = b13 * det;
resultFloat32Arr[7] = b23 * det;
resultFloat32Arr[8] = b33 * det;
return resultFloat32Arr;
} else {
return Matrix3Service$Wonderjs.createEmptyMatrix3(/* () */0);
}
}
function transposeSelf(mat) {
var a01 = mat[1];
var a02 = mat[2];
var a03 = mat[3];
var a12 = mat[6];
var a13 = mat[7];
var a23 = mat[11];
mat[1] = mat[4];
mat[2] = mat[8];
mat[3] = mat[12];
mat[4] = a01;
mat[6] = mat[9];
mat[7] = mat[13];
mat[8] = a02;
mat[9] = a12;
mat[11] = mat[14];
mat[12] = a03;
mat[13] = a13;
mat[14] = a23;
return mat;
}
function setLookAt(eye, center, up) {
var z = Vector3Service$Wonderjs.normalize(Vector3Service$Wonderjs.sub(/* Float */0, eye, center));
var y = Vector3Service$Wonderjs.normalize(up);
var x = Vector3Service$Wonderjs.normalize(Vector3Service$Wonderjs.cross(y, z));
var match = Vector3Service$Wonderjs.cross(z, x);
return new Float32Array(/* array */[
x[0],
x[1],
x[2],
0,
match[0],
match[1],
match[2],
0,
z[0],
z[1],
z[2],
0,
eye[0],
eye[1],
eye[2],
1
]);
}
function scale(param, mat, resultFloat32Arr) {
var scaleZ = param[2];
var scaleY = param[1];
var scaleX = param[0];
resultFloat32Arr[0] = mat[0] * scaleX;
resultFloat32Arr[1] = mat[1] * scaleX;
resultFloat32Arr[2] = mat[2] * scaleX;
resultFloat32Arr[3] = mat[3] * scaleX;
resultFloat32Arr[4] = mat[4] * scaleY;
resultFloat32Arr[5] = mat[5] * scaleY;
resultFloat32Arr[6] = mat[6] * scaleY;
resultFloat32Arr[7] = mat[7] * scaleY;
resultFloat32Arr[8] = mat[8] * scaleZ;
resultFloat32Arr[9] = mat[9] * scaleZ;
resultFloat32Arr[10] = mat[10] * scaleZ;
resultFloat32Arr[11] = mat[11] * scaleZ;
resultFloat32Arr[12] = mat[12];
resultFloat32Arr[13] = mat[13];
resultFloat32Arr[14] = mat[14];
resultFloat32Arr[15] = mat[15];
return resultFloat32Arr;
}
function copy(float32Arr) {
return float32Arr.slice();
}
function setTranslation(param, resultFloat32Arr) {
resultFloat32Arr[12] = param[0];
resultFloat32Arr[13] = param[1];
resultFloat32Arr[14] = param[2];
return resultFloat32Arr;
}
exports.createIdentityMatrix4 = createIdentityMatrix4;
exports.fromTranslation = fromTranslation;
exports.fromTranslationRotationScale = fromTranslationRotationScale;
exports.getX = getX;
exports.getY = getY;
exports.getZ = getZ;
exports.getTranslationTypeArray = getTranslationTypeArray;
exports.getTranslationTuple = getTranslationTuple;
exports.getRotationTuple = getRotationTuple;
exports.getScaleTuple = getScaleTuple;
exports.getEulerAngles = getEulerAngles;
exports.multiply = multiply;
exports.buildPerspective = buildPerspective;
exports.invert = invert;
exports.invertTo3x3 = invertTo3x3;
exports.transposeSelf = transposeSelf;
exports.setLookAt = setLookAt;
exports.scale = scale;
exports.copy = copy;
exports.setTranslation = setTranslation;
/* Log-WonderLog Not a pure module */