Wonder-Technology/Wonder.js

View on GitHub
lib/js/src/construct/domain_layer/library/structure/matrix/Matrix4.bs.js

Summary

Maintainability
D
1 day
Test Coverage
'use strict';

var Curry = require("bs-platform/lib/js/curry.js");
var Log$Wonderjs = require("../../log/Log.bs.js");
var Angle$Wonderjs = require("../Angle.bs.js");
var Result$Wonderjs = require("../Result.bs.js");
var Vector3$Wonderjs = require("../Vector3.bs.js");
var Contract$Wonderjs = require("../../contract/Contract.bs.js");
var DpContainer$Wonderjs = require("../../../dependency/container/DpContainer.bs.js");

function createIdentityMatrix4(param) {
  return new Float32Array([
              1,
              0,
              0,
              0,
              0,
              1,
              0,
              0,
              0,
              0,
              1,
              0,
              0,
              0,
              0,
              1
            ]);
}

function fromTranslationRotationScale(resultFloat32Arr, param, param$1, param$2) {
  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 multiply(resultFloat32Arr, aMatTypeArr, bMatTypeArr) {
  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 getTranslationTuple(matTypeArr) {
  return [
          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 [
            (matTypeArr[6] - matTypeArr[9]) / s,
            (matTypeArr[8] - matTypeArr[2]) / s,
            (matTypeArr[1] - matTypeArr[4]) / s,
            0.25 * s
          ];
  }
  if (matTypeArr[0] > matTypeArr[5] && matTypeArr[0] > matTypeArr[10]) {
    var s$1 = Math.sqrt(1.0 + matTypeArr[0] - matTypeArr[5] - matTypeArr[10]) * 2;
    return [
            0.25 * s$1,
            (matTypeArr[1] + matTypeArr[4]) / s$1,
            (matTypeArr[8] + matTypeArr[2]) / s$1,
            (matTypeArr[6] - matTypeArr[9]) / s$1
          ];
  }
  if (matTypeArr[5] > matTypeArr[10]) {
    var s$2 = Math.sqrt(1.0 + matTypeArr[5] - matTypeArr[0] - matTypeArr[10]) * 2;
    return [
            (matTypeArr[1] + matTypeArr[4]) / s$2,
            0.25 * s$2,
            (matTypeArr[6] + matTypeArr[9]) / s$2,
            (matTypeArr[8] - matTypeArr[2]) / s$2
          ];
  }
  var s$3 = Math.sqrt(1.0 + matTypeArr[10] - matTypeArr[0] - matTypeArr[5]) * 2;
  return [
          (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 [
          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 buildPerspective(resultFloat32Arr, param) {
  var far = param[3];
  var near = param[2];
  var aspect = param[1];
  var fovy = param[0];
  return Result$Wonderjs.mapSuccess(Contract$Wonderjs.requireCheck((function (param) {
                    return Contract$Wonderjs.test(Log$Wonderjs.buildAssertMessage("frustum not be null", "be"), (function (param) {
                                  var fovy$1 = Math.PI * fovy / 180 / 2;
                                  return Contract$Wonderjs.Operators.$less$great$eq$dot(Math.sin(fovy$1), 0);
                                }));
                  }), Curry._1(DpContainer$Wonderjs.unsafeGetConfigDp(undefined).getIsDebug, undefined)), (function (param) {
                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 / aspect;
                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(resultFloat32Arr, mat) {
  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) {
    return Result$Wonderjs.failWith(Log$Wonderjs.buildFatalMessage("invert", "det shouldn\'t be 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 Result$Wonderjs.succeed(resultFloat32Arr);
}

function invertTo3x3(resultFloat32Arr, mat) {
  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) {
    return Result$Wonderjs.failWith(Log$Wonderjs.buildFatalMessage("invert", "det shouldn\'t be 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 Result$Wonderjs.succeed(resultFloat32Arr);
}

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 Vector3$Wonderjs.scale(/* Float */0, [
              x,
              y,
              z
            ], Angle$Wonderjs.getRadToDeg(undefined));
}

function setLookAt(eye, center, up) {
  var z = Vector3$Wonderjs.normalize(Vector3$Wonderjs.sub(/* Float */0, eye, center));
  var y = Vector3$Wonderjs.normalize(up);
  var x = Vector3$Wonderjs.normalize(Vector3$Wonderjs.cross(y, z));
  var match = Vector3$Wonderjs.cross(z, x);
  return new Float32Array([
              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
            ]);
}

exports.createIdentityMatrix4 = createIdentityMatrix4;
exports.fromTranslationRotationScale = fromTranslationRotationScale;
exports.multiply = multiply;
exports.getTranslationTuple = getTranslationTuple;
exports.getRotationTuple = getRotationTuple;
exports.getScaleTuple = getScaleTuple;
exports.buildPerspective = buildPerspective;
exports.invert = invert;
exports.invertTo3x3 = invertTo3x3;
exports.getEulerAngles = getEulerAngles;
exports.setLookAt = setLookAt;
/* No side effect */