Wonder-Technology/Wonder.js

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

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

var Angle$Wonderjs = require("./Angle.bs.js");
var Vector3$Wonderjs = require("./Vector3.bs.js");

function conjugate(param) {
  return [
          param[0] * -1.0,
          param[1] * -1.0,
          param[2] * -1.0,
          param[3]
        ];
}

function length(param) {
  var w = param[3];
  var z = param[2];
  var y = param[1];
  var x = param[0];
  return Math.sqrt(x * x + y * y + z * z + w * w);
}

function normalize(tuple) {
  var len = length(tuple);
  if (len !== 0) {
    return [
            tuple[0] / len,
            tuple[1] / len,
            tuple[2] / len,
            tuple[3] / len
          ];
  } else {
    return [
            0,
            0,
            0,
            1
          ];
  }
}

function invert(tuple) {
  return normalize(conjugate(tuple));
}

function multiply(param, param$1) {
  var q2w = param$1[3];
  var q2z = param$1[2];
  var q2y = param$1[1];
  var q2x = param$1[0];
  var q1w = param[3];
  var q1z = param[2];
  var q1y = param[1];
  var q1x = param[0];
  return [
          q1w * q2x + q1x * q2w + q1y * q2z - q1z * q2y,
          q1w * q2y + q1y * q2w + q1z * q2x - q1x * q2z,
          q1w * q2z + q1z * q2w + q1x * q2y - q1y * q2x,
          q1w * q2w - q1x * q2x - q1y * q2y - q1z * q2z
        ];
}

var setFromMatrix = ((matrixTypeArray) => {
            var m00, m01, m02, m10, m11, m12, m20, m21, m22,
                tr, s, rs, lx, ly, lz, m;
                var x,y,z,w;

            m = matrixTypeArray;

            // Cache matrix values for super-speed
            m00 = m[0];
            m01 = m[1];
            m02 = m[2];
            m10 = m[4];
            m11 = m[5];
            m12 = m[6];
            m20 = m[8];
            m21 = m[9];
            m22 = m[10];

            // Remove the scale from the matrix
            lx = 1 / Math.sqrt(m00 * m00 + m01 * m01 + m02 * m02);
            ly = 1 / Math.sqrt(m10 * m10 + m11 * m11 + m12 * m12);
            lz = 1 / Math.sqrt(m20 * m20 + m21 * m21 + m22 * m22);

            m00 *= lx;
            m01 *= lx;
            m02 *= lx;
            m10 *= ly;
            m11 *= ly;
            m12 *= ly;
            m20 *= lz;
            m21 *= lz;
            m22 *= lz;

            // http://www.cs.ucr.edu/~vbz/resources/quatut.pdf

            tr = m00 + m11 + m22;
            if (tr >= 0) {
                s = Math.sqrt(tr + 1);
                w = s * 0.5;
                s = 0.5 / s;
                x = (m12 - m21) * s;
                y = (m20 - m02) * s;
                z = (m01 - m10) * s;
            } else {
                if (m00 > m11) {
                    if (m00 > m22) {
                        // XDiagDomMatrix
                        rs = (m00 - (m11 + m22)) + 1;
                        rs = Math.sqrt(rs);

                        x = rs * 0.5;
                        rs = 0.5 / rs;
                        w = (m12 - m21) * rs;
                        y = (m01 + m10) * rs;
                        z = (m02 + m20) * rs;
                    } else {
                        // ZDiagDomMatrix
                        rs = (m22 - (m00 + m11)) + 1;
                        rs = Math.sqrt(rs);

                        z = rs * 0.5;
                        rs = 0.5 / rs;
                        w = (m01 - m10) * rs;
                        x = (m20 + m02) * rs;
                        y = (m21 + m12) * rs;
                    }
                } else if (m11 > m22) {
                    // YDiagDomMatrix
                    rs = (m11 - (m22 + m00)) + 1;
                    rs = Math.sqrt(rs);

                    y = rs * 0.5;
                    rs = 0.5 / rs;
                    w = (m20 - m02) * rs;
                    z = (m12 + m21) * rs;
                    x = (m10 + m01) * rs;
                } else {
                    // ZDiagDomMatrix
                    rs = (m22 - (m00 + m11)) + 1;
                    rs = Math.sqrt(rs);

                    z = rs * 0.5;
                    rs = 0.5 / rs;
                    w = (m01 - m10) * rs;
                    x = (m20 + m02) * rs;
                    y = (m21 + m12) * rs;
                }
            }

            return [x,y,z,w]
    });

function setFromEulerAngles(param) {
  var halfToRad = 0.5 * Angle$Wonderjs.getDegToRad(undefined);
  var ex = param[0] * halfToRad;
  var ey = param[1] * halfToRad;
  var ez = param[2] * halfToRad;
  var sx = Math.sin(ex);
  var cx = Math.cos(ex);
  var sy = Math.sin(ey);
  var cy = Math.cos(ey);
  var sz = Math.sin(ez);
  var cz = Math.cos(ez);
  return [
          sx * cy * cz - cx * sy * sz,
          cx * sy * cz + sx * cy * sz,
          cx * cy * sz - sx * sy * cz,
          cx * cy * cz + sx * sy * sz
        ];
}

var _getEulerAngles = (function(quat){
            var x, y, z, qx, qy, qz, qw, a2;

            qx = quat[0];
            qy = quat[1];
            qz = quat[2];
            qw = quat[3];

            a2 = 2 * (qw * qy - qx * qz);
            if (a2 <= -0.99999) {
                x = 2 * Math.atan2(qx, qw);
                y = -Math.PI / 2;
                z = 0;
            } else if (a2 >= 0.99999) {
                x = 2 * Math.atan2(qx, qw);
                y = Math.PI / 2;
                z = 0;
            } else {
                x = Math.atan2(2 * (qw * qx + qy * qz), 1 - 2 * (qx * qx + qy * qy));
                y = Math.asin(a2);
                z = Math.atan2(2 * (qw * qz + qx * qy), 1 - 2 * (qy * qy + qz * qz));
            }

            return [x, y, z];
   });

function getEulerAngles(quat) {
  var rad_to_deg = 180 / Math.PI;
  return Vector3$Wonderjs.scale(/* Float */0, _getEulerAngles(quat), rad_to_deg);
}

function setFromAxisAngle(angle, axis) {
  var match = Vector3$Wonderjs.normalize(axis);
  var angle$1 = angle * 0.5 * Angle$Wonderjs.getDegToRad(undefined);
  var sa = Math.sin(angle$1);
  var ca = Math.cos(angle$1);
  return [
          sa * match[0],
          sa * match[1],
          sa * match[2],
          ca
        ];
}

exports.conjugate = conjugate;
exports.length = length;
exports.normalize = normalize;
exports.invert = invert;
exports.multiply = multiply;
exports.setFromMatrix = setFromMatrix;
exports.setFromEulerAngles = setFromEulerAngles;
exports._getEulerAngles = _getEulerAngles;
exports.getEulerAngles = getEulerAngles;
exports.setFromAxisAngle = setFromAxisAngle;
/* No side effect */