From 3042ffc241420bf389ce255ddd04f27467bb4410 Mon Sep 17 00:00:00 2001 From: Brulijam Date: Thu, 30 Nov 2023 10:08:48 +0100 Subject: [PATCH] =?UTF-8?q?Prepared=20Abgabe=204=20and=20=C3=9Cbung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Abgabe_4/lightTODOs/common/gl-matrix.js | 5555 ++++++++++++++ Abgabe_4/lightTODOs/common/initShaders.js | 46 + Abgabe_4/lightTODOs/common/objects3D.js | 1847 +++++ Abgabe_4/lightTODOs/index.html | 77 + Abgabe_4/lightTODOs/main.js | 205 + index.html | 2 + Übung_30112023/Insel/common/glMatrix.js | 7861 ++++++++++++++++++++ Übung_30112023/Insel/common/initShaders.js | 46 + Übung_30112023/Insel/common/objects3D.js | 437 ++ Übung_30112023/Insel/index.html | 69 + Übung_30112023/Insel/main.js | 534 ++ Übung_30112023/uebung-woche7.pdf | Bin 0 -> 561678 bytes 12 files changed, 16679 insertions(+) create mode 100644 Abgabe_4/lightTODOs/common/gl-matrix.js create mode 100644 Abgabe_4/lightTODOs/common/initShaders.js create mode 100644 Abgabe_4/lightTODOs/common/objects3D.js create mode 100644 Abgabe_4/lightTODOs/index.html create mode 100644 Abgabe_4/lightTODOs/main.js create mode 100644 Übung_30112023/Insel/common/glMatrix.js create mode 100644 Übung_30112023/Insel/common/initShaders.js create mode 100644 Übung_30112023/Insel/common/objects3D.js create mode 100644 Übung_30112023/Insel/index.html create mode 100644 Übung_30112023/Insel/main.js create mode 100644 Übung_30112023/uebung-woche7.pdf diff --git a/Abgabe_4/lightTODOs/common/gl-matrix.js b/Abgabe_4/lightTODOs/common/gl-matrix.js new file mode 100644 index 0000000..5e7dfaa --- /dev/null +++ b/Abgabe_4/lightTODOs/common/gl-matrix.js @@ -0,0 +1,5555 @@ +/** + * @fileoverview gl-matrix - High performance matrix and vector operations + * @author Brandon Jones + * @author Colin MacKenzie IV + * @version 2.3.2 + */ + +/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define(factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @fileoverview gl-matrix - High performance matrix and vector operations + * @author Brandon Jones + * @author Colin MacKenzie IV + * @version 2.3.2 + */ + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + // END HEADER + + exports.glMatrix = __webpack_require__(1); + exports.mat2 = __webpack_require__(2); + exports.mat2d = __webpack_require__(3); + exports.mat3 = __webpack_require__(4); + exports.mat4 = __webpack_require__(5); + exports.quat = __webpack_require__(6); + exports.vec2 = __webpack_require__(9); + exports.vec3 = __webpack_require__(7); + exports.vec4 = __webpack_require__(8); + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + /** + * @class Common utilities + * @name glMatrix + */ + var glMatrix = {}; + + // Configuration Constants + glMatrix.EPSILON = 0.000001; + glMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array; + glMatrix.RANDOM = Math.random; + glMatrix.ENABLE_SIMD = false; + + // Capability detection + glMatrix.SIMD_AVAILABLE = (glMatrix.ARRAY_TYPE === Float32Array) && ('SIMD' in this); + glMatrix.USE_SIMD = glMatrix.ENABLE_SIMD && glMatrix.SIMD_AVAILABLE; + + /** + * Sets the type of array used when creating new vectors and matrices + * + * @param {Type} type Array type, such as Float32Array or Array + */ + glMatrix.setMatrixArrayType = function(type) { + glMatrix.ARRAY_TYPE = type; + } + + var degree = Math.PI / 180; + + /** + * Convert Degree To Radian + * + * @param {Number} Angle in Degrees + */ + glMatrix.toRadian = function(a){ + return a * degree; + } + + module.exports = glMatrix; + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 2x2 Matrix + * @name mat2 + */ + var mat2 = {}; + + /** + * Creates a new identity mat2 + * + * @returns {mat2} a new 2x2 matrix + */ + mat2.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + }; + + /** + * Creates a new mat2 initialized with values from an existing matrix + * + * @param {mat2} a matrix to clone + * @returns {mat2} a new 2x2 matrix + */ + mat2.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + }; + + /** + * Copy the values from one mat2 to another + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ + mat2.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + }; + + /** + * Set a mat2 to the identity matrix + * + * @param {mat2} out the receiving matrix + * @returns {mat2} out + */ + mat2.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + }; + + /** + * Transpose the values of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ + mat2.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a1 = a[1]; + out[1] = a[2]; + out[2] = a1; + } else { + out[0] = a[0]; + out[1] = a[2]; + out[2] = a[1]; + out[3] = a[3]; + } + + return out; + }; + + /** + * Inverts a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ + mat2.invert = function(out, a) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + + // Calculate the determinant + det = a0 * a3 - a2 * a1; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = a3 * det; + out[1] = -a1 * det; + out[2] = -a2 * det; + out[3] = a0 * det; + + return out; + }; + + /** + * Calculates the adjugate of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the source matrix + * @returns {mat2} out + */ + mat2.adjoint = function(out, a) { + // Caching this value is nessecary if out == a + var a0 = a[0]; + out[0] = a[3]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a0; + + return out; + }; + + /** + * Calculates the determinant of a mat2 + * + * @param {mat2} a the source matrix + * @returns {Number} determinant of a + */ + mat2.determinant = function (a) { + return a[0] * a[3] - a[2] * a[1]; + }; + + /** + * Multiplies two mat2's + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the first operand + * @param {mat2} b the second operand + * @returns {mat2} out + */ + mat2.multiply = function (out, a, b) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + return out; + }; + + /** + * Alias for {@link mat2.multiply} + * @function + */ + mat2.mul = mat2.multiply; + + /** + * Rotates a mat2 by the given angle + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ + mat2.rotate = function (out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + return out; + }; + + /** + * Scales the mat2 by the dimensions in the given vec2 + * + * @param {mat2} out the receiving matrix + * @param {mat2} a the matrix to rotate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat2} out + **/ + mat2.scale = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + v0 = v[0], v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + return out; + }; + + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.rotate(dest, dest, rad); + * + * @param {mat2} out mat2 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ + mat2.fromRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + return out; + } + + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.scale(dest, dest, vec); + * + * @param {mat2} out mat2 receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat2} out + */ + mat2.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + return out; + } + + /** + * Returns a string representation of a mat2 + * + * @param {mat2} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ + mat2.str = function (a) { + return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; + }; + + /** + * Returns Frobenius norm of a mat2 + * + * @param {mat2} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + mat2.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2))) + }; + + /** + * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix + * @param {mat2} L the lower triangular matrix + * @param {mat2} D the diagonal matrix + * @param {mat2} U the upper triangular matrix + * @param {mat2} a the input matrix to factorize + */ + + mat2.LDU = function (L, D, U, a) { + L[2] = a[2]/a[0]; + U[0] = a[0]; + U[1] = a[1]; + U[3] = a[3] - L[2] * U[1]; + return [L, D, U]; + }; + + + module.exports = mat2; + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 2x3 Matrix + * @name mat2d + * + * @description + * A mat2d contains six elements defined as: + *
+	 * [a, c, tx,
+	 *  b, d, ty]
+	 * 
+ * This is a short form for the 3x3 matrix: + *
+	 * [a, c, tx,
+	 *  b, d, ty,
+	 *  0, 0, 1]
+	 * 
+ * The last row is ignored so the array is shorter and operations are faster. + */ + var mat2d = {}; + + /** + * Creates a new identity mat2d + * + * @returns {mat2d} a new 2x3 matrix + */ + mat2d.create = function() { + var out = new glMatrix.ARRAY_TYPE(6); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + }; + + /** + * Creates a new mat2d initialized with values from an existing matrix + * + * @param {mat2d} a matrix to clone + * @returns {mat2d} a new 2x3 matrix + */ + mat2d.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(6); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; + }; + + /** + * Copy the values from one mat2d to another + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the source matrix + * @returns {mat2d} out + */ + mat2d.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; + }; + + /** + * Set a mat2d to the identity matrix + * + * @param {mat2d} out the receiving matrix + * @returns {mat2d} out + */ + mat2d.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + }; + + /** + * Inverts a mat2d + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the source matrix + * @returns {mat2d} out + */ + mat2d.invert = function(out, a) { + var aa = a[0], ab = a[1], ac = a[2], ad = a[3], + atx = a[4], aty = a[5]; + + var det = aa * ad - ab * ac; + if(!det){ + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + }; + + /** + * Calculates the determinant of a mat2d + * + * @param {mat2d} a the source matrix + * @returns {Number} determinant of a + */ + mat2d.determinant = function (a) { + return a[0] * a[3] - a[1] * a[2]; + }; + + /** + * Multiplies two mat2d's + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the first operand + * @param {mat2d} b the second operand + * @returns {mat2d} out + */ + mat2d.multiply = function (out, a, b) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + out[4] = a0 * b4 + a2 * b5 + a4; + out[5] = a1 * b4 + a3 * b5 + a5; + return out; + }; + + /** + * Alias for {@link mat2d.multiply} + * @function + */ + mat2d.mul = mat2d.multiply; + + /** + * Rotates a mat2d by the given angle + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ + mat2d.rotate = function (out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + out[4] = a4; + out[5] = a5; + return out; + }; + + /** + * Scales the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to translate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat2d} out + **/ + mat2d.scale = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + v0 = v[0], v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + out[4] = a4; + out[5] = a5; + return out; + }; + + /** + * Translates the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {mat2d} a the matrix to translate + * @param {vec2} v the vec2 to translate the matrix by + * @returns {mat2d} out + **/ + mat2d.translate = function(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], + v0 = v[0], v1 = v[1]; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = a0 * v0 + a2 * v1 + a4; + out[5] = a1 * v0 + a3 * v1 + a5; + return out; + }; + + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.rotate(dest, dest, rad); + * + * @param {mat2d} out mat2d receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ + mat2d.fromRotation = function(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + out[4] = 0; + out[5] = 0; + return out; + } + + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.scale(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat2d} out + */ + mat2d.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + out[4] = 0; + out[5] = 0; + return out; + } + + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.translate(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {vec2} v Translation vector + * @returns {mat2d} out + */ + mat2d.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = v[0]; + out[5] = v[1]; + return out; + } + + /** + * Returns a string representation of a mat2d + * + * @param {mat2d} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + mat2d.str = function (a) { + return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + + a[3] + ', ' + a[4] + ', ' + a[5] + ')'; + }; + + /** + * Returns Frobenius norm of a mat2d + * + * @param {mat2d} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + mat2d.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1)) + }; + + module.exports = mat2d; + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 3x3 Matrix + * @name mat3 + */ + var mat3 = {}; + + /** + * Creates a new identity mat3 + * + * @returns {mat3} a new 3x3 matrix + */ + mat3.create = function() { + var out = new glMatrix.ARRAY_TYPE(9); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + }; + + /** + * Copies the upper-left 3x3 values into the given mat3. + * + * @param {mat3} out the receiving 3x3 matrix + * @param {mat4} a the source 4x4 matrix + * @returns {mat3} out + */ + mat3.fromMat4 = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; + }; + + /** + * Creates a new mat3 initialized with values from an existing matrix + * + * @param {mat3} a matrix to clone + * @returns {mat3} a new 3x3 matrix + */ + mat3.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(9); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + }; + + /** + * Copy the values from one mat3 to another + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ + mat3.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + }; + + /** + * Set a mat3 to the identity matrix + * + * @param {mat3} out the receiving matrix + * @returns {mat3} out + */ + mat3.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + }; + + /** + * Transpose the values of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ + mat3.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], a02 = a[2], a12 = a[5]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + } else { + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a[1]; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a[2]; + out[7] = a[5]; + out[8] = a[8]; + } + + return out; + }; + + /** + * Inverts a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ + mat3.invert = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + b01 = a22 * a11 - a12 * a21, + b11 = -a22 * a10 + a12 * a20, + b21 = a21 * a10 - a11 * a20, + + // Calculate the determinant + det = a00 * b01 + a01 * b11 + a02 * b21; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = b01 * det; + out[1] = (-a22 * a01 + a02 * a21) * det; + out[2] = (a12 * a01 - a02 * a11) * det; + out[3] = b11 * det; + out[4] = (a22 * a00 - a02 * a20) * det; + out[5] = (-a12 * a00 + a02 * a10) * det; + out[6] = b21 * det; + out[7] = (-a21 * a00 + a01 * a20) * det; + out[8] = (a11 * a00 - a01 * a10) * det; + return out; + }; + + /** + * Calculates the adjugate of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the source matrix + * @returns {mat3} out + */ + mat3.adjoint = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8]; + + out[0] = (a11 * a22 - a12 * a21); + out[1] = (a02 * a21 - a01 * a22); + out[2] = (a01 * a12 - a02 * a11); + out[3] = (a12 * a20 - a10 * a22); + out[4] = (a00 * a22 - a02 * a20); + out[5] = (a02 * a10 - a00 * a12); + out[6] = (a10 * a21 - a11 * a20); + out[7] = (a01 * a20 - a00 * a21); + out[8] = (a00 * a11 - a01 * a10); + return out; + }; + + /** + * Calculates the determinant of a mat3 + * + * @param {mat3} a the source matrix + * @returns {Number} determinant of a + */ + mat3.determinant = function (a) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8]; + + return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); + }; + + /** + * Multiplies two mat3's + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the first operand + * @param {mat3} b the second operand + * @returns {mat3} out + */ + mat3.multiply = function (out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + b00 = b[0], b01 = b[1], b02 = b[2], + b10 = b[3], b11 = b[4], b12 = b[5], + b20 = b[6], b21 = b[7], b22 = b[8]; + + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b00 * a02 + b01 * a12 + b02 * a22; + + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b10 * a02 + b11 * a12 + b12 * a22; + + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b20 * a02 + b21 * a12 + b22 * a22; + return out; + }; + + /** + * Alias for {@link mat3.multiply} + * @function + */ + mat3.mul = mat3.multiply; + + /** + * Translate a mat3 by the given vector + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to translate + * @param {vec2} v vector to translate by + * @returns {mat3} out + */ + mat3.translate = function(out, a, v) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + x = v[0], y = v[1]; + + out[0] = a00; + out[1] = a01; + out[2] = a02; + + out[3] = a10; + out[4] = a11; + out[5] = a12; + + out[6] = x * a00 + y * a10 + a20; + out[7] = x * a01 + y * a11 + a21; + out[8] = x * a02 + y * a12 + a22; + return out; + }; + + /** + * Rotates a mat3 by the given angle + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ + mat3.rotate = function (out, a, rad) { + var a00 = a[0], a01 = a[1], a02 = a[2], + a10 = a[3], a11 = a[4], a12 = a[5], + a20 = a[6], a21 = a[7], a22 = a[8], + + s = Math.sin(rad), + c = Math.cos(rad); + + out[0] = c * a00 + s * a10; + out[1] = c * a01 + s * a11; + out[2] = c * a02 + s * a12; + + out[3] = c * a10 - s * a00; + out[4] = c * a11 - s * a01; + out[5] = c * a12 - s * a02; + + out[6] = a20; + out[7] = a21; + out[8] = a22; + return out; + }; + + /** + * Scales the mat3 by the dimensions in the given vec2 + * + * @param {mat3} out the receiving matrix + * @param {mat3} a the matrix to rotate + * @param {vec2} v the vec2 to scale the matrix by + * @returns {mat3} out + **/ + mat3.scale = function(out, a, v) { + var x = v[0], y = v[1]; + + out[0] = x * a[0]; + out[1] = x * a[1]; + out[2] = x * a[2]; + + out[3] = y * a[3]; + out[4] = y * a[4]; + out[5] = y * a[5]; + + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + }; + + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.translate(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {vec2} v Translation vector + * @returns {mat3} out + */ + mat3.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = v[0]; + out[7] = v[1]; + out[8] = 1; + return out; + } + + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.rotate(dest, dest, rad); + * + * @param {mat3} out mat3 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ + mat3.fromRotation = function(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + + out[0] = c; + out[1] = s; + out[2] = 0; + + out[3] = -s; + out[4] = c; + out[5] = 0; + + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + } + + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.scale(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {vec2} v Scaling vector + * @returns {mat3} out + */ + mat3.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + + out[3] = 0; + out[4] = v[1]; + out[5] = 0; + + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + } + + /** + * Copies the values from a mat2d into a mat3 + * + * @param {mat3} out the receiving matrix + * @param {mat2d} a the matrix to copy + * @returns {mat3} out + **/ + mat3.fromMat2d = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = 0; + + out[3] = a[2]; + out[4] = a[3]; + out[5] = 0; + + out[6] = a[4]; + out[7] = a[5]; + out[8] = 1; + return out; + }; + + /** + * Calculates a 3x3 matrix from the given quaternion + * + * @param {mat3} out mat3 receiving operation result + * @param {quat} q Quaternion to create matrix from + * + * @returns {mat3} out + */ + mat3.fromQuat = function (out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + yx = y * x2, + yy = y * y2, + zx = z * x2, + zy = z * y2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - yy - zz; + out[3] = yx - wz; + out[6] = zx + wy; + + out[1] = yx + wz; + out[4] = 1 - xx - zz; + out[7] = zy - wx; + + out[2] = zx - wy; + out[5] = zy + wx; + out[8] = 1 - xx - yy; + + return out; + }; + + /** + * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix + * + * @param {mat3} out mat3 receiving operation result + * @param {mat4} a Mat4 to derive the normal matrix from + * + * @returns {mat3} out + */ + mat3.normalFromMat4 = function (out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + // Calculate the determinant + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + + out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + + out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + + return out; + }; + + /** + * Returns a string representation of a mat3 + * + * @param {mat3} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ + mat3.str = function (a) { + return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; + }; + + /** + * Returns Frobenius norm of a mat3 + * + * @param {mat3} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + mat3.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2))) + }; + + + module.exports = mat3; + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 4x4 Matrix + * @name mat4 + */ + var mat4 = { + scalar: {}, + SIMD: {}, + }; + + /** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ + mat4.create = function() { + var out = new glMatrix.ARRAY_TYPE(16); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + }; + + /** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {mat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ + mat4.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + }; + + /** + * Copy the values from one mat4 to another + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + }; + + /** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ + mat4.identity = function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + }; + + /** + * Transpose the values of a mat4 not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.scalar.transpose = function(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], a02 = a[2], a03 = a[3], + a12 = a[6], a13 = a[7], + a23 = a[11]; + + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; + }; + + /** + * Transpose the values of a mat4 using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.SIMD.transpose = function(out, a) { + var a0, a1, a2, a3, + tmp01, tmp23, + out0, out1, out2, out3; + + a0 = SIMD.Float32x4.load(a, 0); + a1 = SIMD.Float32x4.load(a, 4); + a2 = SIMD.Float32x4.load(a, 8); + a3 = SIMD.Float32x4.load(a, 12); + + tmp01 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5); + tmp23 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5); + out0 = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6); + out1 = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7); + SIMD.Float32x4.store(out, 0, out0); + SIMD.Float32x4.store(out, 4, out1); + + tmp01 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7); + tmp23 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7); + out2 = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6); + out3 = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7); + SIMD.Float32x4.store(out, 8, out2); + SIMD.Float32x4.store(out, 12, out3); + + return out; + }; + + /** + * Transpse a mat4 using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.transpose = glMatrix.USE_SIMD ? mat4.SIMD.transpose : mat4.scalar.transpose; + + /** + * Inverts a mat4 not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.scalar.invert = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + // Calculate the determinant + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + + return out; + }; + + /** + * Inverts a mat4 using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.SIMD.invert = function(out, a) { + var row0, row1, row2, row3, + tmp1, + minor0, minor1, minor2, minor3, + det, + a0 = SIMD.Float32x4.load(a, 0), + a1 = SIMD.Float32x4.load(a, 4), + a2 = SIMD.Float32x4.load(a, 8), + a3 = SIMD.Float32x4.load(a, 12); + + // Compute matrix adjugate + tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5); + row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5); + row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6); + row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7); + tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7); + row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7); + row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6); + row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7); + + tmp1 = SIMD.Float32x4.mul(row2, row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor0 = SIMD.Float32x4.mul(row1, tmp1); + minor1 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0); + minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1); + minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(row1, row2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0); + minor3 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1)); + minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3); + minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + row2 = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0); + minor2 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1)); + minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2); + minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(row0, row1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2); + minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2); + minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1)); + + tmp1 = SIMD.Float32x4.mul(row0, row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1)); + minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1); + minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1)); + + tmp1 = SIMD.Float32x4.mul(row0, row2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1); + minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1)); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1)); + minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3); + + // Compute matrix determinant + det = SIMD.Float32x4.mul(row0, minor0); + det = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 2, 3, 0, 1), det); + det = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 1, 0, 3, 2), det); + tmp1 = SIMD.Float32x4.reciprocalApproximation(det); + det = SIMD.Float32x4.sub( + SIMD.Float32x4.add(tmp1, tmp1), + SIMD.Float32x4.mul(det, SIMD.Float32x4.mul(tmp1, tmp1))); + det = SIMD.Float32x4.swizzle(det, 0, 0, 0, 0); + if (!det) { + return null; + } + + // Compute matrix inverse + SIMD.Float32x4.store(out, 0, SIMD.Float32x4.mul(det, minor0)); + SIMD.Float32x4.store(out, 4, SIMD.Float32x4.mul(det, minor1)); + SIMD.Float32x4.store(out, 8, SIMD.Float32x4.mul(det, minor2)); + SIMD.Float32x4.store(out, 12, SIMD.Float32x4.mul(det, minor3)); + return out; + } + + /** + * Inverts a mat4 using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.invert = glMatrix.USE_SIMD ? mat4.SIMD.invert : mat4.scalar.invert; + + /** + * Calculates the adjugate of a mat4 not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.scalar.adjoint = function(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + + out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22)); + out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); + out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12)); + out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); + out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); + out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22)); + out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); + out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12)); + out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21)); + out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); + out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11)); + out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); + out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); + out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21)); + out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); + out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11)); + return out; + }; + + /** + * Calculates the adjugate of a mat4 using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.SIMD.adjoint = function(out, a) { + var a0, a1, a2, a3; + var row0, row1, row2, row3; + var tmp1; + var minor0, minor1, minor2, minor3; + + var a0 = SIMD.Float32x4.load(a, 0); + var a1 = SIMD.Float32x4.load(a, 4); + var a2 = SIMD.Float32x4.load(a, 8); + var a3 = SIMD.Float32x4.load(a, 12); + + // Transpose the source matrix. Sort of. Not a true transpose operation + tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5); + row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5); + row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6); + row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7); + + tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7); + row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7); + row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6); + row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7); + + tmp1 = SIMD.Float32x4.mul(row2, row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor0 = SIMD.Float32x4.mul(row1, tmp1); + minor1 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0); + minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1); + minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(row1, row2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0); + minor3 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1)); + minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3); + minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + row2 = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0); + minor2 = SIMD.Float32x4.mul(row0, tmp1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1)); + minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2); + minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1); + + tmp1 = SIMD.Float32x4.mul(row0, row1); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2); + minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2); + minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1)); + + tmp1 = SIMD.Float32x4.mul(row0, row3); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1)); + minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1); + minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1)); + + tmp1 = SIMD.Float32x4.mul(row0, row2); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2); + minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1); + minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1)); + tmp1 = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1); + minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1)); + minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3); + + SIMD.Float32x4.store(out, 0, minor0); + SIMD.Float32x4.store(out, 4, minor1); + SIMD.Float32x4.store(out, 8, minor2); + SIMD.Float32x4.store(out, 12, minor3); + return out; + }; + + /** + * Calculates the adjugate of a mat4 using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ + mat4.adjoint = glMatrix.USE_SIMD ? mat4.SIMD.adjoint : mat4.scalar.adjoint; + + /** + * Calculates the determinant of a mat4 + * + * @param {mat4} a the source matrix + * @returns {Number} determinant of a + */ + mat4.determinant = function (a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32; + + // Calculate the determinant + return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + }; + + /** + * Multiplies two mat4's explicitly using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the first operand, must be a Float32Array + * @param {mat4} b the second operand, must be a Float32Array + * @returns {mat4} out + */ + mat4.SIMD.multiply = function (out, a, b) { + var a0 = SIMD.Float32x4.load(a, 0); + var a1 = SIMD.Float32x4.load(a, 4); + var a2 = SIMD.Float32x4.load(a, 8); + var a3 = SIMD.Float32x4.load(a, 12); + + var b0 = SIMD.Float32x4.load(b, 0); + var out0 = SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 0, 0, 0, 0), a0), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 1, 1, 1, 1), a1), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 2, 2, 2, 2), a2), + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 3, 3, 3, 3), a3)))); + SIMD.Float32x4.store(out, 0, out0); + + var b1 = SIMD.Float32x4.load(b, 4); + var out1 = SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 0, 0, 0, 0), a0), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 1, 1, 1, 1), a1), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 2, 2, 2, 2), a2), + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 3, 3, 3, 3), a3)))); + SIMD.Float32x4.store(out, 4, out1); + + var b2 = SIMD.Float32x4.load(b, 8); + var out2 = SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 0, 0, 0, 0), a0), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 1, 1, 1, 1), a1), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 2, 2, 2, 2), a2), + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 3, 3, 3, 3), a3)))); + SIMD.Float32x4.store(out, 8, out2); + + var b3 = SIMD.Float32x4.load(b, 12); + var out3 = SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 0, 0, 0, 0), a0), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 1, 1, 1, 1), a1), + SIMD.Float32x4.add( + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 2, 2, 2, 2), a2), + SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 3, 3, 3, 3), a3)))); + SIMD.Float32x4.store(out, 12, out3); + + return out; + }; + + /** + * Multiplies two mat4's explicitly not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the first operand + * @param {mat4} b the second operand + * @returns {mat4} out + */ + mat4.scalar.multiply = function (out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + + // Cache only the current line of the second matrix + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; + out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; + out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; + out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + return out; + }; + + /** + * Multiplies two mat4's using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the first operand + * @param {mat4} b the second operand + * @returns {mat4} out + */ + mat4.multiply = glMatrix.USE_SIMD ? mat4.SIMD.multiply : mat4.scalar.multiply; + + /** + * Alias for {@link mat4.multiply} + * @function + */ + mat4.mul = mat4.multiply; + + /** + * Translate a mat4 by the given vector not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to translate + * @param {vec3} v vector to translate by + * @returns {mat4} out + */ + mat4.scalar.translate = function (out, a, v) { + var x = v[0], y = v[1], z = v[2], + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; + out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; + out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; + + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; + }; + + /** + * Translates a mat4 by the given vector using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to translate + * @param {vec3} v vector to translate by + * @returns {mat4} out + */ + mat4.SIMD.translate = function (out, a, v) { + var a0 = SIMD.Float32x4.load(a, 0), + a1 = SIMD.Float32x4.load(a, 4), + a2 = SIMD.Float32x4.load(a, 8), + a3 = SIMD.Float32x4.load(a, 12), + vec = SIMD.Float32x4(v[0], v[1], v[2] , 0); + + if (a !== out) { + out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; + out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; + out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; + } + + a0 = SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0)); + a1 = SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1)); + a2 = SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2)); + + var t0 = SIMD.Float32x4.add(a0, SIMD.Float32x4.add(a1, SIMD.Float32x4.add(a2, a3))); + SIMD.Float32x4.store(out, 12, t0); + + return out; + }; + + /** + * Translates a mat4 by the given vector using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to translate + * @param {vec3} v vector to translate by + * @returns {mat4} out + */ + mat4.translate = glMatrix.USE_SIMD ? mat4.SIMD.translate : mat4.scalar.translate; + + /** + * Scales the mat4 by the dimensions in the given vec3 not using vectorization + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to scale + * @param {vec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ + mat4.scalar.scale = function(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + }; + + /** + * Scales the mat4 by the dimensions in the given vec3 using vectorization + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to scale + * @param {vec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ + mat4.SIMD.scale = function(out, a, v) { + var a0, a1, a2; + var vec = SIMD.Float32x4(v[0], v[1], v[2], 0); + + a0 = SIMD.Float32x4.load(a, 0); + SIMD.Float32x4.store( + out, 0, SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0))); + + a1 = SIMD.Float32x4.load(a, 4); + SIMD.Float32x4.store( + out, 4, SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1))); + + a2 = SIMD.Float32x4.load(a, 8); + SIMD.Float32x4.store( + out, 8, SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2))); + + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + }; + + /** + * Scales the mat4 by the dimensions in the given vec3 using SIMD if available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to scale + * @param {vec3} v the vec3 to scale the matrix by + * @returns {mat4} out + */ + mat4.scale = glMatrix.USE_SIMD ? mat4.SIMD.scale : mat4.scalar.scale; + + /** + * Rotates a mat4 by the given angle around the given axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {vec3} axis the axis to rotate around + * @returns {mat4} out + */ + mat4.rotate = function (out, a, rad, axis) { + var x = axis[0], y = axis[1], z = axis[2], + len = Math.sqrt(x * x + y * y + z * z), + s, c, t, + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23, + b00, b01, b02, + b10, b11, b12, + b20, b21, b22; + + if (Math.abs(len) < glMatrix.EPSILON) { return null; } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + // Construct the elements of the rotation matrix + b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; + b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; + b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; + + // Perform rotation-specific matrix multiplication + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + return out; + }; + + /** + * Rotates a matrix by the given angle around the X axis not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.scalar.rotateX = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; + }; + + /** + * Rotates a matrix by the given angle around the X axis using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.SIMD.rotateX = function (out, a, rad) { + var s = SIMD.Float32x4.splat(Math.sin(rad)), + c = SIMD.Float32x4.splat(Math.cos(rad)); + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + var a_1 = SIMD.Float32x4.load(a, 4); + var a_2 = SIMD.Float32x4.load(a, 8); + SIMD.Float32x4.store(out, 4, + SIMD.Float32x4.add(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_2, s))); + SIMD.Float32x4.store(out, 8, + SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_2, c), SIMD.Float32x4.mul(a_1, s))); + return out; + }; + + /** + * Rotates a matrix by the given angle around the X axis using SIMD if availabe and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.rotateX = glMatrix.USE_SIMD ? mat4.SIMD.rotateX : mat4.scalar.rotateX; + + /** + * Rotates a matrix by the given angle around the Y axis not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.scalar.rotateY = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; + }; + + /** + * Rotates a matrix by the given angle around the Y axis using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.SIMD.rotateY = function (out, a, rad) { + var s = SIMD.Float32x4.splat(Math.sin(rad)), + c = SIMD.Float32x4.splat(Math.cos(rad)); + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + var a_0 = SIMD.Float32x4.load(a, 0); + var a_2 = SIMD.Float32x4.load(a, 8); + SIMD.Float32x4.store(out, 0, + SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_2, s))); + SIMD.Float32x4.store(out, 8, + SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, s), SIMD.Float32x4.mul(a_2, c))); + return out; + }; + + /** + * Rotates a matrix by the given angle around the Y axis if SIMD available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.rotateY = glMatrix.USE_SIMD ? mat4.SIMD.rotateY : mat4.scalar.rotateY; + + /** + * Rotates a matrix by the given angle around the Z axis not using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.scalar.rotateZ = function (out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; + }; + + /** + * Rotates a matrix by the given angle around the Z axis using SIMD + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.SIMD.rotateZ = function (out, a, rad) { + var s = SIMD.Float32x4.splat(Math.sin(rad)), + c = SIMD.Float32x4.splat(Math.cos(rad)); + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + var a_0 = SIMD.Float32x4.load(a, 0); + var a_1 = SIMD.Float32x4.load(a, 4); + SIMD.Float32x4.store(out, 0, + SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_1, s))); + SIMD.Float32x4.store(out, 4, + SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_0, s))); + return out; + }; + + /** + * Rotates a matrix by the given angle around the Z axis if SIMD available and enabled + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.rotateZ = glMatrix.USE_SIMD ? mat4.SIMD.rotateZ : mat4.scalar.rotateZ; + + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {vec3} v Translation vector + * @returns {mat4} out + */ + mat4.fromTranslation = function(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {vec3} v Scaling vector + * @returns {mat4} out + */ + mat4.fromScaling = function(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {vec3} axis the axis to rotate around + * @returns {mat4} out + */ + mat4.fromRotation = function(out, rad, axis) { + var x = axis[0], y = axis[1], z = axis[2], + len = Math.sqrt(x * x + y * y + z * z), + s, c, t; + + if (Math.abs(len) < glMatrix.EPSILON) { return null; } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + + // Perform rotation-specific matrix multiplication + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.fromXRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.fromYRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + mat4.fromZRotation = function(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + + // Perform axis-specific matrix multiplication + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + + /** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @returns {mat4} out + */ + mat4.fromRotationTranslation = function (out, q, v) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + + return out; + }; + + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @param {vec3} s Scaling vector + * @returns {mat4} out + */ + mat4.fromRotationTranslationScale = function (out, q, v, s) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2, + sx = s[0], + sy = s[1], + sz = s[2]; + + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + + return out; + }; + + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @param {vec3} s Scaling vector + * @param {vec3} o The origin vector around which to scale and rotate + * @returns {mat4} out + */ + mat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2, + + sx = s[0], + sy = s[1], + sz = s[2], + + ox = o[0], + oy = o[1], + oz = o[2]; + + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz); + out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz); + out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz); + out[15] = 1; + + return out; + }; + + mat4.fromQuat = function (out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + yx = y * x2, + yy = y * y2, + zx = z * x2, + zy = z * y2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + + return out; + }; + + /** + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out + */ + mat4.frustum = function (out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left), + tb = 1 / (top - bottom), + nf = 1 / (near - far); + out[0] = (near * 2) * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = (near * 2) * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = (far * near * 2) * nf; + out[15] = 0; + return out; + }; + + /** + * Generates a perspective projection matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + mat4.perspective = function (out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf = 1 / (near - far); + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = (2 * far * near) * nf; + out[15] = 0; + return out; + }; + + /** + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + mat4.perspectiveFromFieldOfView = function (out, fov, near, far) { + var upTan = Math.tan(fov.upDegrees * Math.PI/180.0), + downTan = Math.tan(fov.downDegrees * Math.PI/180.0), + leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0), + rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0), + xScale = 2.0 / (leftTan + rightTan), + yScale = 2.0 / (upTan + downTan); + + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = ((upTan - downTan) * yScale * 0.5); + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = (far * near) / (near - far); + out[15] = 0.0; + return out; + } + + /** + * Generates a orthogonal projection matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + mat4.ortho = function (out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right), + bt = 1 / (bottom - top), + nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; + }; + + /** + * Generates a look-at matrix with the given eye position, focal point, and up axis + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {vec3} eye Position of the viewer + * @param {vec3} center Point the viewer is looking at + * @param {vec3} up vec3 pointing up + * @returns {mat4} out + */ + mat4.lookAt = function (out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, + eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2], + centerx = center[0], + centery = center[1], + centerz = center[2]; + + if (Math.abs(eyex - centerx) < glMatrix.EPSILON && + Math.abs(eyey - centery) < glMatrix.EPSILON && + Math.abs(eyez - centerz) < glMatrix.EPSILON) { + return mat4.identity(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + + len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); + z0 *= len; + z1 *= len; + z2 *= len; + + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + + len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + + return out; + }; + + /** + * Returns a string representation of a mat4 + * + * @param {mat4} mat matrix to represent as a string + * @returns {String} string representation of the matrix + */ + mat4.str = function (a) { + return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; + }; + + /** + * Returns Frobenius norm of a mat4 + * + * @param {mat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + mat4.frob = function (a) { + return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) )) + }; + + + module.exports = mat4; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + var mat3 = __webpack_require__(4); + var vec3 = __webpack_require__(7); + var vec4 = __webpack_require__(8); + + /** + * @class Quaternion + * @name quat + */ + var quat = {}; + + /** + * Creates a new identity quat + * + * @returns {quat} a new quaternion + */ + quat.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + }; + + /** + * Sets a quaternion to represent the shortest rotation from one + * vector to another. + * + * Both vectors are assumed to be unit length. + * + * @param {quat} out the receiving quaternion. + * @param {vec3} a the initial vector + * @param {vec3} b the destination vector + * @returns {quat} out + */ + quat.rotationTo = (function() { + var tmpvec3 = vec3.create(); + var xUnitVec3 = vec3.fromValues(1,0,0); + var yUnitVec3 = vec3.fromValues(0,1,0); + + return function(out, a, b) { + var dot = vec3.dot(a, b); + if (dot < -0.999999) { + vec3.cross(tmpvec3, xUnitVec3, a); + if (vec3.length(tmpvec3) < 0.000001) + vec3.cross(tmpvec3, yUnitVec3, a); + vec3.normalize(tmpvec3, tmpvec3); + quat.setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + vec3.cross(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot; + return quat.normalize(out, out); + } + }; + })(); + + /** + * Sets the specified quaternion with values corresponding to the given + * axes. Each axis is a vec3 and is expected to be unit length and + * perpendicular to all other specified axes. + * + * @param {vec3} view the vector representing the viewing direction + * @param {vec3} right the vector representing the local "right" direction + * @param {vec3} up the vector representing the local "up" direction + * @returns {quat} out + */ + quat.setAxes = (function() { + var matr = mat3.create(); + + return function(out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + + return quat.normalize(out, quat.fromMat3(out, matr)); + }; + })(); + + /** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {quat} a quaternion to clone + * @returns {quat} a new quaternion + * @function + */ + quat.clone = vec4.clone; + + /** + * Creates a new quat initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} a new quaternion + * @function + */ + quat.fromValues = vec4.fromValues; + + /** + * Copy the values from one quat to another + * + * @param {quat} out the receiving quaternion + * @param {quat} a the source quaternion + * @returns {quat} out + * @function + */ + quat.copy = vec4.copy; + + /** + * Set the components of a quat to the given values + * + * @param {quat} out the receiving quaternion + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} out + * @function + */ + quat.set = vec4.set; + + /** + * Set a quat to the identity quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ + quat.identity = function(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + }; + + /** + * Sets a quat from the given angle and rotation axis, + * then returns it. + * + * @param {quat} out the receiving quaternion + * @param {vec3} axis the axis around which to rotate + * @param {Number} rad the angle in radians + * @returns {quat} out + **/ + quat.setAxisAngle = function(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; + }; + + /** + * Adds two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {quat} out + * @function + */ + quat.add = vec4.add; + + /** + * Multiplies two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {quat} out + */ + quat.multiply = function(out, a, b) { + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = b[0], by = b[1], bz = b[2], bw = b[3]; + + out[0] = ax * bw + aw * bx + ay * bz - az * by; + out[1] = ay * bw + aw * by + az * bx - ax * bz; + out[2] = az * bw + aw * bz + ax * by - ay * bx; + out[3] = aw * bw - ax * bx - ay * by - az * bz; + return out; + }; + + /** + * Alias for {@link quat.multiply} + * @function + */ + quat.mul = quat.multiply; + + /** + * Scales a quat by a scalar number + * + * @param {quat} out the receiving vector + * @param {quat} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {quat} out + * @function + */ + quat.scale = vec4.scale; + + /** + * Rotates a quaternion by the given angle about the X axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + quat.rotateX = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw + aw * bx; + out[1] = ay * bw + az * bx; + out[2] = az * bw - ay * bx; + out[3] = aw * bw - ax * bx; + return out; + }; + + /** + * Rotates a quaternion by the given angle about the Y axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + quat.rotateY = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + by = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw - az * by; + out[1] = ay * bw + aw * by; + out[2] = az * bw + ax * by; + out[3] = aw * bw - ay * by; + return out; + }; + + /** + * Rotates a quaternion by the given angle about the Z axis + * + * @param {quat} out quat receiving operation result + * @param {quat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + quat.rotateZ = function (out, a, rad) { + rad *= 0.5; + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bz = Math.sin(rad), bw = Math.cos(rad); + + out[0] = ax * bw + ay * bz; + out[1] = ay * bw - ax * bz; + out[2] = az * bw + aw * bz; + out[3] = aw * bw - az * bz; + return out; + }; + + /** + * Calculates the W component of a quat from the X, Y, and Z components. + * Assumes that quaternion is 1 unit in length. + * Any existing W component will be ignored. + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate W component of + * @returns {quat} out + */ + quat.calculateW = function (out, a) { + var x = a[0], y = a[1], z = a[2]; + + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); + return out; + }; + + /** + * Calculates the dot product of two quat's + * + * @param {quat} a the first operand + * @param {quat} b the second operand + * @returns {Number} dot product of a and b + * @function + */ + quat.dot = vec4.dot; + + /** + * Performs a linear interpolation between two quat's + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {quat} out + * @function + */ + quat.lerp = vec4.lerp; + + /** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {quat} out + */ + quat.slerp = function (out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = b[0], by = b[1], bz = b[2], bw = b[3]; + + var omega, cosom, sinom, scale0, scale1; + + // calc cosine + cosom = ax * bx + ay * by + az * bz + aw * bw; + // adjust signs (if necessary) + if ( cosom < 0.0 ) { + cosom = -cosom; + bx = - bx; + by = - by; + bz = - bz; + bw = - bw; + } + // calculate coefficients + if ( (1.0 - cosom) > 0.000001 ) { + // standard case (slerp) + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1.0 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t; + scale1 = t; + } + // calculate final values + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + + return out; + }; + + /** + * Performs a spherical linear interpolation with two control points + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {quat} c the third operand + * @param {quat} d the fourth operand + * @param {Number} t interpolation amount + * @returns {quat} out + */ + quat.sqlerp = (function () { + var temp1 = quat.create(); + var temp2 = quat.create(); + + return function (out, a, b, c, d, t) { + quat.slerp(temp1, a, d, t); + quat.slerp(temp2, b, c, t); + quat.slerp(out, temp1, temp2, 2 * t * (1 - t)); + + return out; + }; + }()); + + /** + * Calculates the inverse of a quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate inverse of + * @returns {quat} out + */ + quat.invert = function(out, a) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + dot = a0*a0 + a1*a1 + a2*a2 + a3*a3, + invDot = dot ? 1.0/dot : 0; + + // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 + + out[0] = -a0*invDot; + out[1] = -a1*invDot; + out[2] = -a2*invDot; + out[3] = a3*invDot; + return out; + }; + + /** + * Calculates the conjugate of a quat + * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. + * + * @param {quat} out the receiving quaternion + * @param {quat} a quat to calculate conjugate of + * @returns {quat} out + */ + quat.conjugate = function (out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + return out; + }; + + /** + * Calculates the length of a quat + * + * @param {quat} a vector to calculate length of + * @returns {Number} length of a + * @function + */ + quat.length = vec4.length; + + /** + * Alias for {@link quat.length} + * @function + */ + quat.len = quat.length; + + /** + * Calculates the squared length of a quat + * + * @param {quat} a vector to calculate squared length of + * @returns {Number} squared length of a + * @function + */ + quat.squaredLength = vec4.squaredLength; + + /** + * Alias for {@link quat.squaredLength} + * @function + */ + quat.sqrLen = quat.squaredLength; + + /** + * Normalize a quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a quaternion to normalize + * @returns {quat} out + * @function + */ + quat.normalize = vec4.normalize; + + /** + * Creates a quaternion from the given 3x3 rotation matrix. + * + * NOTE: The resultant quaternion is not normalized, so you should be sure + * to renormalize the quaternion yourself where necessary. + * + * @param {quat} out the receiving quaternion + * @param {mat3} m rotation matrix + * @returns {quat} out + * @function + */ + quat.fromMat3 = function(out, m) { + // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes + // article "Quaternion Calculus and Fast Animation". + var fTrace = m[0] + m[4] + m[8]; + var fRoot; + + if ( fTrace > 0.0 ) { + // |w| > 1/2, may as well choose w > 1/2 + fRoot = Math.sqrt(fTrace + 1.0); // 2w + out[3] = 0.5 * fRoot; + fRoot = 0.5/fRoot; // 1/(4w) + out[0] = (m[5]-m[7])*fRoot; + out[1] = (m[6]-m[2])*fRoot; + out[2] = (m[1]-m[3])*fRoot; + } else { + // |w| <= 1/2 + var i = 0; + if ( m[4] > m[0] ) + i = 1; + if ( m[8] > m[i*3+i] ) + i = 2; + var j = (i+1)%3; + var k = (i+2)%3; + + fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j*3+k] - m[k*3+j]) * fRoot; + out[j] = (m[j*3+i] + m[i*3+j]) * fRoot; + out[k] = (m[k*3+i] + m[i*3+k]) * fRoot; + } + + return out; + }; + + /** + * Returns a string representation of a quatenion + * + * @param {quat} vec vector to represent as a string + * @returns {String} string representation of the vector + */ + quat.str = function (a) { + return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; + }; + + module.exports = quat; + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 3 Dimensional Vector + * @name vec3 + */ + var vec3 = {}; + + /** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ + vec3.create = function() { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = 0; + out[1] = 0; + out[2] = 0; + return out; + }; + + /** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {vec3} a vector to clone + * @returns {vec3} a new 3D vector + */ + vec3.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + }; + + /** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ + vec3.fromValues = function(x, y, z) { + var out = new glMatrix.ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; + }; + + /** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {vec3} a the source vector + * @returns {vec3} out + */ + vec3.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + }; + + /** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ + vec3.set = function(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; + }; + + /** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; + }; + + /** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; + }; + + /** + * Alias for {@link vec3.subtract} + * @function + */ + vec3.sub = vec3.subtract; + + /** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; + }; + + /** + * Alias for {@link vec3.multiply} + * @function + */ + vec3.mul = vec3.multiply; + + /** + * Divides two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; + }; + + /** + * Alias for {@link vec3.divide} + * @function + */ + vec3.div = vec3.divide; + + /** + * Returns the minimum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + return out; + }; + + /** + * Returns the maximum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + return out; + }; + + /** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ + vec3.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; + }; + + /** + * Adds two vec3's after scaling the second operand by a scalar value + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec3} out + */ + vec3.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + out[2] = a[2] + (b[2] * scale); + return out; + }; + + /** + * Calculates the euclidian distance between two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} distance between a and b + */ + vec3.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2]; + return Math.sqrt(x*x + y*y + z*z); + }; + + /** + * Alias for {@link vec3.distance} + * @function + */ + vec3.dist = vec3.distance; + + /** + * Calculates the squared euclidian distance between two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} squared distance between a and b + */ + vec3.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2]; + return x*x + y*y + z*z; + }; + + /** + * Alias for {@link vec3.squaredDistance} + * @function + */ + vec3.sqrDist = vec3.squaredDistance; + + /** + * Calculates the length of a vec3 + * + * @param {vec3} a vector to calculate length of + * @returns {Number} length of a + */ + vec3.length = function (a) { + var x = a[0], + y = a[1], + z = a[2]; + return Math.sqrt(x*x + y*y + z*z); + }; + + /** + * Alias for {@link vec3.length} + * @function + */ + vec3.len = vec3.length; + + /** + * Calculates the squared length of a vec3 + * + * @param {vec3} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + vec3.squaredLength = function (a) { + var x = a[0], + y = a[1], + z = a[2]; + return x*x + y*y + z*z; + }; + + /** + * Alias for {@link vec3.squaredLength} + * @function + */ + vec3.sqrLen = vec3.squaredLength; + + /** + * Negates the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to negate + * @returns {vec3} out + */ + vec3.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + return out; + }; + + /** + * Returns the inverse of the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to invert + * @returns {vec3} out + */ + vec3.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + return out; + }; + + /** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to normalize + * @returns {vec3} out + */ + vec3.normalize = function(out, a) { + var x = a[0], + y = a[1], + z = a[2]; + var len = x*x + y*y + z*z; + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + } + return out; + }; + + /** + * Calculates the dot product of two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} dot product of a and b + */ + vec3.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + }; + + /** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ + vec3.cross = function(out, a, b) { + var ax = a[0], ay = a[1], az = a[2], + bx = b[0], by = b[1], bz = b[2]; + + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; + }; + + /** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ + vec3.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1], + az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; + }; + + /** + * Performs a hermite interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {vec3} c the third operand + * @param {vec3} d the fourth operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ + vec3.hermite = function (out, a, b, c, d, t) { + var factorTimes2 = t * t, + factor1 = factorTimes2 * (2 * t - 3) + 1, + factor2 = factorTimes2 * (t - 2) + t, + factor3 = factorTimes2 * (t - 1), + factor4 = factorTimes2 * (3 - 2 * t); + + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + + return out; + }; + + /** + * Performs a bezier interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {vec3} c the third operand + * @param {vec3} d the fourth operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ + vec3.bezier = function (out, a, b, c, d, t) { + var inverseFactor = 1 - t, + inverseFactorTimesTwo = inverseFactor * inverseFactor, + factorTimes2 = t * t, + factor1 = inverseFactorTimesTwo * inverseFactor, + factor2 = 3 * t * inverseFactorTimesTwo, + factor3 = 3 * factorTimes2 * inverseFactor, + factor4 = factorTimes2 * t; + + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + + return out; + }; + + /** + * Generates a random vector with the given scale + * + * @param {vec3} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec3} out + */ + vec3.random = function (out, scale) { + scale = scale || 1.0; + + var r = glMatrix.RANDOM() * 2.0 * Math.PI; + var z = (glMatrix.RANDOM() * 2.0) - 1.0; + var zScale = Math.sqrt(1.0-z*z) * scale; + + out[0] = Math.cos(r) * zScale; + out[1] = Math.sin(r) * zScale; + out[2] = z * scale; + return out; + }; + + /** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec3} out + */ + vec3.transformMat4 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2], + w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; + }; + + /** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {mat4} m the 3x3 matrix to transform with + * @returns {vec3} out + */ + vec3.transformMat3 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; + }; + + /** + * Transforms the vec3 with a quat + * + * @param {vec3} out the receiving vector + * @param {vec3} a the vector to transform + * @param {quat} q quaternion to transform with + * @returns {vec3} out + */ + vec3.transformQuat = function(out, a, q) { + // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations + + var x = a[0], y = a[1], z = a[2], + qx = q[0], qy = q[1], qz = q[2], qw = q[3], + + // calculate quat * vec + ix = qw * x + qy * z - qz * y, + iy = qw * y + qz * x - qx * z, + iz = qw * z + qx * y - qy * x, + iw = -qx * x - qy * y - qz * z; + + // calculate result * inverse quat + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + return out; + }; + + /** + * Rotate a 3D vector around the x-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ + vec3.rotateX = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[0]; + r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c); + r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c); + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; + }; + + /** + * Rotate a 3D vector around the y-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ + vec3.rotateY = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c); + r[1] = p[1]; + r[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c); + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; + }; + + /** + * Rotate a 3D vector around the z-axis + * @param {vec3} out The receiving vec3 + * @param {vec3} a The vec3 point to rotate + * @param {vec3} b The origin of the rotation + * @param {Number} c The angle of rotation + * @returns {vec3} out + */ + vec3.rotateZ = function(out, a, b, c){ + var p = [], r=[]; + //Translate point to the origin + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; + + //perform rotation + r[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c); + r[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c); + r[2] = p[2]; + + //translate to correct position + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + + return out; + }; + + /** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + vec3.forEach = (function() { + var vec = vec3.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 3; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; + } + + return a; + }; + })(); + + /** + * Get the angle between two 3D vectors + * @param {vec3} a The first operand + * @param {vec3} b The second operand + * @returns {Number} The angle in radians + */ + vec3.angle = function(a, b) { + + var tempA = vec3.fromValues(a[0], a[1], a[2]); + var tempB = vec3.fromValues(b[0], b[1], b[2]); + + vec3.normalize(tempA, tempA); + vec3.normalize(tempB, tempB); + + var cosine = vec3.dot(tempA, tempB); + + if(cosine > 1.0){ + return 0; + } else { + return Math.acos(cosine); + } + }; + + /** + * Returns a string representation of a vector + * + * @param {vec3} vec vector to represent as a string + * @returns {String} string representation of the vector + */ + vec3.str = function (a) { + return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; + }; + + module.exports = vec3; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 4 Dimensional Vector + * @name vec4 + */ + var vec4 = {}; + + /** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ + vec4.create = function() { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + return out; + }; + + /** + * Creates a new vec4 initialized with values from an existing vector + * + * @param {vec4} a vector to clone + * @returns {vec4} a new 4D vector + */ + vec4.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + }; + + /** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ + vec4.fromValues = function(x, y, z, w) { + var out = new glMatrix.ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; + }; + + /** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {vec4} a the source vector + * @returns {vec4} out + */ + vec4.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + }; + + /** + * Set the components of a vec4 to the given values + * + * @param {vec4} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} out + */ + vec4.set = function(out, x, y, z, w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; + }; + + /** + * Adds two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; + }; + + /** + * Subtracts vector b from vector a + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; + }; + + /** + * Alias for {@link vec4.subtract} + * @function + */ + vec4.sub = vec4.subtract; + + /** + * Multiplies two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; + }; + + /** + * Alias for {@link vec4.multiply} + * @function + */ + vec4.mul = vec4.multiply; + + /** + * Divides two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + out[3] = a[3] / b[3]; + return out; + }; + + /** + * Alias for {@link vec4.divide} + * @function + */ + vec4.div = vec4.divide; + + /** + * Returns the minimum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + out[3] = Math.min(a[3], b[3]); + return out; + }; + + /** + * Returns the maximum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {vec4} out + */ + vec4.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + out[3] = Math.max(a[3], b[3]); + return out; + }; + + /** + * Scales a vec4 by a scalar number + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec4} out + */ + vec4.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; + }; + + /** + * Adds two vec4's after scaling the second operand by a scalar value + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec4} out + */ + vec4.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + out[2] = a[2] + (b[2] * scale); + out[3] = a[3] + (b[3] * scale); + return out; + }; + + /** + * Calculates the euclidian distance between two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} distance between a and b + */ + vec4.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2], + w = b[3] - a[3]; + return Math.sqrt(x*x + y*y + z*z + w*w); + }; + + /** + * Alias for {@link vec4.distance} + * @function + */ + vec4.dist = vec4.distance; + + /** + * Calculates the squared euclidian distance between two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} squared distance between a and b + */ + vec4.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1], + z = b[2] - a[2], + w = b[3] - a[3]; + return x*x + y*y + z*z + w*w; + }; + + /** + * Alias for {@link vec4.squaredDistance} + * @function + */ + vec4.sqrDist = vec4.squaredDistance; + + /** + * Calculates the length of a vec4 + * + * @param {vec4} a vector to calculate length of + * @returns {Number} length of a + */ + vec4.length = function (a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + return Math.sqrt(x*x + y*y + z*z + w*w); + }; + + /** + * Alias for {@link vec4.length} + * @function + */ + vec4.len = vec4.length; + + /** + * Calculates the squared length of a vec4 + * + * @param {vec4} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + vec4.squaredLength = function (a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + return x*x + y*y + z*z + w*w; + }; + + /** + * Alias for {@link vec4.squaredLength} + * @function + */ + vec4.sqrLen = vec4.squaredLength; + + /** + * Negates the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to negate + * @returns {vec4} out + */ + vec4.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = -a[3]; + return out; + }; + + /** + * Returns the inverse of the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to invert + * @returns {vec4} out + */ + vec4.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + out[3] = 1.0 / a[3]; + return out; + }; + + /** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {vec4} a vector to normalize + * @returns {vec4} out + */ + vec4.normalize = function(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = x*x + y*y + z*z + w*w; + if (len > 0) { + len = 1 / Math.sqrt(len); + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + } + return out; + }; + + /** + * Calculates the dot product of two vec4's + * + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @returns {Number} dot product of a and b + */ + vec4.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + }; + + /** + * Performs a linear interpolation between two vec4's + * + * @param {vec4} out the receiving vector + * @param {vec4} a the first operand + * @param {vec4} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec4} out + */ + vec4.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + out[3] = aw + t * (b[3] - aw); + return out; + }; + + /** + * Generates a random vector with the given scale + * + * @param {vec4} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec4} out + */ + vec4.random = function (out, scale) { + scale = scale || 1.0; + + //TODO: This is a pretty awful way of doing this. Find something better. + out[0] = glMatrix.RANDOM(); + out[1] = glMatrix.RANDOM(); + out[2] = glMatrix.RANDOM(); + out[3] = glMatrix.RANDOM(); + vec4.normalize(out, out); + vec4.scale(out, out, scale); + return out; + }; + + /** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec4} out + */ + vec4.transformMat4 = function(out, a, m) { + var x = a[0], y = a[1], z = a[2], w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; + }; + + /** + * Transforms the vec4 with a quat + * + * @param {vec4} out the receiving vector + * @param {vec4} a the vector to transform + * @param {quat} q quaternion to transform with + * @returns {vec4} out + */ + vec4.transformQuat = function(out, a, q) { + var x = a[0], y = a[1], z = a[2], + qx = q[0], qy = q[1], qz = q[2], qw = q[3], + + // calculate quat * vec + ix = qw * x + qy * z - qz * y, + iy = qw * y + qz * x - qx * z, + iz = qw * z + qx * y - qy * x, + iw = -qx * x - qy * y - qz * z; + + // calculate result * inverse quat + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + out[3] = a[3]; + return out; + }; + + /** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + vec4.forEach = (function() { + var vec = vec4.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 4; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3]; + } + + return a; + }; + })(); + + /** + * Returns a string representation of a vector + * + * @param {vec4} vec vector to represent as a string + * @returns {String} string representation of the vector + */ + vec4.str = function (a) { + return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; + }; + + module.exports = vec4; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ + + var glMatrix = __webpack_require__(1); + + /** + * @class 2 Dimensional Vector + * @name vec2 + */ + var vec2 = {}; + + /** + * Creates a new, empty vec2 + * + * @returns {vec2} a new 2D vector + */ + vec2.create = function() { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = 0; + out[1] = 0; + return out; + }; + + /** + * Creates a new vec2 initialized with values from an existing vector + * + * @param {vec2} a vector to clone + * @returns {vec2} a new 2D vector + */ + vec2.clone = function(a) { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = a[0]; + out[1] = a[1]; + return out; + }; + + /** + * Creates a new vec2 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} a new 2D vector + */ + vec2.fromValues = function(x, y) { + var out = new glMatrix.ARRAY_TYPE(2); + out[0] = x; + out[1] = y; + return out; + }; + + /** + * Copy the values from one vec2 to another + * + * @param {vec2} out the receiving vector + * @param {vec2} a the source vector + * @returns {vec2} out + */ + vec2.copy = function(out, a) { + out[0] = a[0]; + out[1] = a[1]; + return out; + }; + + /** + * Set the components of a vec2 to the given values + * + * @param {vec2} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} out + */ + vec2.set = function(out, x, y) { + out[0] = x; + out[1] = y; + return out; + }; + + /** + * Adds two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.add = function(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + return out; + }; + + /** + * Subtracts vector b from vector a + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.subtract = function(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + return out; + }; + + /** + * Alias for {@link vec2.subtract} + * @function + */ + vec2.sub = vec2.subtract; + + /** + * Multiplies two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.multiply = function(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + return out; + }; + + /** + * Alias for {@link vec2.multiply} + * @function + */ + vec2.mul = vec2.multiply; + + /** + * Divides two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.divide = function(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + return out; + }; + + /** + * Alias for {@link vec2.divide} + * @function + */ + vec2.div = vec2.divide; + + /** + * Returns the minimum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.min = function(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + return out; + }; + + /** + * Returns the maximum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec2} out + */ + vec2.max = function(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + return out; + }; + + /** + * Scales a vec2 by a scalar number + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec2} out + */ + vec2.scale = function(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + return out; + }; + + /** + * Adds two vec2's after scaling the second operand by a scalar value + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec2} out + */ + vec2.scaleAndAdd = function(out, a, b, scale) { + out[0] = a[0] + (b[0] * scale); + out[1] = a[1] + (b[1] * scale); + return out; + }; + + /** + * Calculates the euclidian distance between two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} distance between a and b + */ + vec2.distance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return Math.sqrt(x*x + y*y); + }; + + /** + * Alias for {@link vec2.distance} + * @function + */ + vec2.dist = vec2.distance; + + /** + * Calculates the squared euclidian distance between two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} squared distance between a and b + */ + vec2.squaredDistance = function(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return x*x + y*y; + }; + + /** + * Alias for {@link vec2.squaredDistance} + * @function + */ + vec2.sqrDist = vec2.squaredDistance; + + /** + * Calculates the length of a vec2 + * + * @param {vec2} a vector to calculate length of + * @returns {Number} length of a + */ + vec2.length = function (a) { + var x = a[0], + y = a[1]; + return Math.sqrt(x*x + y*y); + }; + + /** + * Alias for {@link vec2.length} + * @function + */ + vec2.len = vec2.length; + + /** + * Calculates the squared length of a vec2 + * + * @param {vec2} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + vec2.squaredLength = function (a) { + var x = a[0], + y = a[1]; + return x*x + y*y; + }; + + /** + * Alias for {@link vec2.squaredLength} + * @function + */ + vec2.sqrLen = vec2.squaredLength; + + /** + * Negates the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to negate + * @returns {vec2} out + */ + vec2.negate = function(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + return out; + }; + + /** + * Returns the inverse of the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to invert + * @returns {vec2} out + */ + vec2.inverse = function(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + return out; + }; + + /** + * Normalize a vec2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a vector to normalize + * @returns {vec2} out + */ + vec2.normalize = function(out, a) { + var x = a[0], + y = a[1]; + var len = x*x + y*y; + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + out[0] = a[0] * len; + out[1] = a[1] * len; + } + return out; + }; + + /** + * Calculates the dot product of two vec2's + * + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {Number} dot product of a and b + */ + vec2.dot = function (a, b) { + return a[0] * b[0] + a[1] * b[1]; + }; + + /** + * Computes the cross product of two vec2's + * Note that the cross product must by definition produce a 3D vector + * + * @param {vec3} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @returns {vec3} out + */ + vec2.cross = function(out, a, b) { + var z = a[0] * b[1] - a[1] * b[0]; + out[0] = out[1] = 0; + out[2] = z; + return out; + }; + + /** + * Performs a linear interpolation between two vec2's + * + * @param {vec2} out the receiving vector + * @param {vec2} a the first operand + * @param {vec2} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec2} out + */ + vec2.lerp = function (out, a, b, t) { + var ax = a[0], + ay = a[1]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + return out; + }; + + /** + * Generates a random vector with the given scale + * + * @param {vec2} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec2} out + */ + vec2.random = function (out, scale) { + scale = scale || 1.0; + var r = glMatrix.RANDOM() * 2.0 * Math.PI; + out[0] = Math.cos(r) * scale; + out[1] = Math.sin(r) * scale; + return out; + }; + + /** + * Transforms the vec2 with a mat2 + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat2} m matrix to transform with + * @returns {vec2} out + */ + vec2.transformMat2 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y; + out[1] = m[1] * x + m[3] * y; + return out; + }; + + /** + * Transforms the vec2 with a mat2d + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat2d} m matrix to transform with + * @returns {vec2} out + */ + vec2.transformMat2d = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + }; + + /** + * Transforms the vec2 with a mat3 + * 3rd vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat3} m matrix to transform with + * @returns {vec2} out + */ + vec2.transformMat3 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[3] * y + m[6]; + out[1] = m[1] * x + m[4] * y + m[7]; + return out; + }; + + /** + * Transforms the vec2 with a mat4 + * 3rd vector component is implicitly '0' + * 4th vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {vec2} a the vector to transform + * @param {mat4} m matrix to transform with + * @returns {vec2} out + */ + vec2.transformMat4 = function(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[4] * y + m[12]; + out[1] = m[1] * x + m[5] * y + m[13]; + return out; + }; + + /** + * Perform some operation over an array of vec2s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + vec2.forEach = (function() { + var vec = vec2.create(); + + return function(a, stride, offset, count, fn, arg) { + var i, l; + if(!stride) { + stride = 2; + } + + if(!offset) { + offset = 0; + } + + if(count) { + l = Math.min((count * stride) + offset, a.length); + } else { + l = a.length; + } + + for(i = offset; i < l; i += stride) { + vec[0] = a[i]; vec[1] = a[i+1]; + fn(vec, vec, arg); + a[i] = vec[0]; a[i+1] = vec[1]; + } + + return a; + }; + })(); + + /** + * Returns a string representation of a vector + * + * @param {vec2} vec vector to represent as a string + * @returns {String} string representation of the vector + */ + vec2.str = function (a) { + return 'vec2(' + a[0] + ', ' + a[1] + ')'; + }; + + module.exports = vec2; + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/Abgabe_4/lightTODOs/common/initShaders.js b/Abgabe_4/lightTODOs/common/initShaders.js new file mode 100644 index 0000000..95a6657 --- /dev/null +++ b/Abgabe_4/lightTODOs/common/initShaders.js @@ -0,0 +1,46 @@ +// +// initShaders.js +// + +function initShaders( gl, vertexShaderId, fragmentShaderId ) +{ + const compileShader = ( gl, gl_shaderType, shaderSource ) => { + // Create the shader + shader = gl.createShader( gl_shaderType ); + + // Set the shader source code + gl.shaderSource( shader, shaderSource ); + + // Compile the shader to make it readable for the GPU + gl.compileShader( shader ); + var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + + if (!success) { + // Something went wrong during compilation; get the error + throw "could not compile shader:" + gl.getShaderInfoLog(shader); + } + else { + return shader; + } + } + + /* + * Setup shader program + */ + vShaderSource = document.querySelector( '#' + vertexShaderId ).text; + fShaderSource = document.querySelector( '#' + fragmentShaderId ).text; + + vertexShader = compileShader( gl, gl.VERTEX_SHADER, vShaderSource ); + fragmentShader = compileShader( gl, gl.FRAGMENT_SHADER, fShaderSource ); + + // Build the program + const program = gl.createProgram(); + + // Attach shaders to it + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; +} \ No newline at end of file diff --git a/Abgabe_4/lightTODOs/common/objects3D.js b/Abgabe_4/lightTODOs/common/objects3D.js new file mode 100644 index 0000000..4085950 --- /dev/null +++ b/Abgabe_4/lightTODOs/common/objects3D.js @@ -0,0 +1,1847 @@ +class Object3D { + + // DONE: Füge Default-Materialkoeffizienten hinzu + constructor(ka = [0.5, 0.5, 0.5], kd = [0.5, 0.5, 0.5], ks = [0.5, 0.5, 0.5]) { + + this.posVBO = gl.createBuffer(); + // DONE: Kein colorVBO mehr! (Farben werden über Materialkoeffizienten bestimmt) + this.indexVBO = gl.createBuffer(); + + this.positions = []; + this.indices = []; + + // DONE: Lege objektspezifische Materialkoeffizienten an + this.ka = ka; + this.kd = kd; + this.ks = ks; + this.specularExponent = 4.0; + + this.position = [0, 0, 0]; + this.orientation = [0, 0, 0]; + this.scale = [1, 1, 1]; + this.modelMatrix; + this.SetModelMatrix(); + } + + InitBuffers() { + + gl.bindBuffer(gl.ARRAY_BUFFER, this.posVBO); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.positions), gl.STATIC_DRAW); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexVBO); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.indices), gl.STATIC_DRAW); + } + + SetModelMatrix (position = this.position, orientation = this.orientation, scale = this.scale) { + + this.position = position; + this.orientation = [orientation[0] * Math.PI / 180, orientation[1] * Math.PI / 180, orientation[2] * Math.PI / 180]; // Convert the orientation to RAD + this.scale = scale; + + this.modelMatrix = mat4.create(); + mat4.translate(this.modelMatrix, this.modelMatrix, position); + mat4.rotate(this.modelMatrix, this.modelMatrix, this.orientation[0], [1, 0, 0]); + mat4.rotate(this.modelMatrix, this.modelMatrix, this.orientation[1], [0, 1, 0]); + mat4.rotate(this.modelMatrix, this.modelMatrix, this.orientation[2], [0, 0, 1]); + mat4.scale(this.modelMatrix, this.modelMatrix, scale); + } + + UpdateUniforms () { + + gl.uniformMatrix4fv(modelMatrixLoc, false, this.modelMatrix); + + // DONE: Übergebe Materialkoeffizienten des Objektes an den Shader + gl.uniform3fv(kaLoc, this.ka); + gl.uniform3fv(kdLoc, this.kd); + gl.uniform3fv(ksLoc, this.ks); + gl.uniform1f(specularExponentLoc, this.specularExponent); + } + + Render() { + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, this.posVBO); + gl.enableVertexAttribArray(posLoc); + gl.enableVertexAttribArray(normalLoc); + // DONE: Passe Stride-Wert an (vorletzter Parameter) + // -> Vertex-Position und -Normale werden abwechselnd gespeichert + gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 2 * 3 * 4, 0); + gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 2 * 3 * 4, 3 * 4); + + this.UpdateUniforms(); + + // Render + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexVBO); + gl.drawElements(gl.TRIANGLES, this.indices.length, gl.UNSIGNED_SHORT, 0); + } +} + + +class Island extends Object3D { + + constructor() { + + // DONE: Setze Material für Insel + super([0.4, 0.2, 0.0], [0.6, 0.3, 0.0], [0.7, 0.7, 0.7]); + + // DONE: Füge zu jedem Vertex Normale hinzu (bei PLY-Export in Blender) + this.positions = [ + -0.344503,-0.106899,-2.313329,-0.011310,-0.533934,-0.845450, + 0.254658,0.065420,-2.430170,-0.011310,-0.533934,-0.845450, + 0.506020,-0.293147,-2.207084,-0.011310,-0.533934,-0.845450, + 1.415955,0.064912,-1.957500,0.432419,-0.749451,-0.501335, + 1.489208,-0.318759,-1.320762,0.432419,-0.749451,-0.501335, + 0.506020,-0.293147,-2.207084,0.432419,-0.749451,-0.501335, + 1.685851,0.084184,-1.268915,0.734904,-0.279119,-0.618068, + 2.014675,-0.126122,-0.782958,0.734904,-0.279119,-0.618068, + 1.489208,-0.318759,-1.320762,0.734904,-0.279119,-0.618068, + 0.957233,-1.089151,-0.905606,0.146612,-0.480540,-0.864631, + 0.454708,-1.256676,-0.897711,0.146612,-0.480540,-0.864631, + 0.810208,-0.709404,-1.141590,0.146612,-0.480540,-0.864631, + 0.454708,-1.256676,-0.897711,0.693344,-0.471028,-0.545351, + 0.739686,-1.249709,-0.541415,0.693344,-0.471028,-0.545351, + 0.231851,-1.904112,-0.621845,0.693344,-0.471028,-0.545351, + 0.810208,-0.709404,-1.141590,0.250114,-0.538384,-0.804727, + 0.052641,-1.633897,-0.758536,0.250114,-0.538384,-0.804727, + -0.020753,-0.743329,-1.377161,0.250114,-0.538384,-0.804727, + 1.364762,-0.324582,0.647285,0.703998,-0.320406,0.633820, + 2.074500,0.090083,0.068582,0.703998,-0.320406,0.633820, + 1.608835,0.037777,0.559365,0.703998,-0.320406,0.633820, + 1.364762,-0.324582,0.647285,0.168668,-0.983853,-0.059875, + 2.014675,-0.126122,-0.782958,0.168668,-0.983853,-0.059875, + 1.955554,-0.191974,0.132568,0.168668,-0.983853,-0.059875, + 2.014675,-0.126122,-0.782958,0.923533,-0.382169,0.032149, + 2.074500,0.090083,0.068582,0.923533,-0.382169,0.032149, + 1.955554,-0.191974,0.132568,0.923533,-0.382169,0.032149, + 1.364762,-0.324582,0.647285,0.782750,-0.569768,0.250335, + 1.393132,0.037777,1.383312,0.782750,-0.569768,0.250335, + 1.210661,-0.322174,1.134609,0.782750,-0.569768,0.250335, + 1.393132,0.037777,1.383312,0.384202,-0.648684,0.656962, + 0.514977,-0.286422,1.576757,0.384202,-0.648684,0.656962, + 1.210661,-0.322174,1.134609,0.384202,-0.648684,0.656962, + 0.507135,-1.581211,0.348922,0.899189,-0.417795,0.130026, + 0.342563,-2.052501,-0.027325,0.899189,-0.417795,0.130026, + 0.620568,-1.491335,-0.146730,0.899189,-0.417795,0.130026, + 0.745909,-0.723539,0.485115,-0.053516,-0.142055,0.988411, + 0.089439,-1.345612,0.360167,-0.053516,-0.142055,0.988411, + 0.507135,-1.581211,0.348922,-0.053516,-0.142055,0.988411, + 0.745909,-0.723539,0.485115,0.814255,-0.442316,0.375960, + 0.620568,-1.491335,-0.146730,0.814255,-0.442316,0.375960, + 1.089500,-0.770651,-0.314462,0.814255,-0.442316,0.375960, + -0.123718,-0.298339,1.611730,-0.310691,-0.613103,0.726344, + -0.930959,0.037777,1.550149,-0.310691,-0.613103,0.726344, + -0.866234,-0.291222,1.300128,-0.310691,-0.613103,0.726344, + 0.514977,-0.286422,1.576757,0.057026,-0.467461,0.882173, + -0.414258,0.037777,1.808618,0.057026,-0.467461,0.882173, + -0.123718,-0.298339,1.611730,0.057026,-0.467461,0.882173, + -0.930959,0.037777,1.550149,-0.545079,-0.572608,0.612379, + -1.444312,-0.282136,0.794076,-0.545079,-0.572608,0.612379, + -0.866234,-0.291222,1.300128,-0.545079,-0.572608,0.612379, + -1.591571,0.097928,0.827036,-0.822073,-0.356985,0.443574, + -1.839477,-0.177971,0.145553,-0.822073,-0.356985,0.443574, + -1.444312,-0.282136,0.794076,-0.822073,-0.356985,0.443574, + -0.936850,-0.751093,-0.176985,-0.746557,-0.495575,0.443912, + -0.611777,-1.317411,-0.262516,-0.746557,-0.495575,0.443912, + -0.326162,-1.310280,0.225784,-0.746557,-0.495575,0.443912, + -0.326162,-1.310280,0.225784,-0.314567,-0.360829,0.877980, + 0.089439,-1.345612,0.360167,-0.314567,-0.360829,0.877980, + 0.289486,-0.743127,0.679448,-0.314567,-0.360829,0.877980, + -0.326162,-1.310280,0.225784,-0.308883,-0.016409,0.950958, + 0.020776,-1.770522,0.330532,-0.308883,-0.016409,0.950958, + 0.089439,-1.345612,0.360167,-0.308883,-0.016409,0.950958, + -1.675519,-0.336500,-0.606829,-0.437848,-0.846877,-0.301808, + -1.607249,0.010755,-1.680275,-0.437848,-0.846877,-0.301808, + -0.625318,-0.725192,-1.039731,-0.437848,-0.846877,-0.301808, + -1.607249,0.010755,-1.680275,-0.071156,0.995311,-0.065514, + -2.011082,0.043485,-0.744422,-0.071156,0.995311,-0.065514, + -1.247727,0.059337,-1.332687,-0.071156,0.995311,-0.065514, + -1.839477,-0.177971,0.145553,-0.745403,-0.666250,-0.022057, + -2.011082,0.043485,-0.744422,-0.745403,-0.666250,-0.022057, + -1.675519,-0.336500,-0.606829,-0.745403,-0.666250,-0.022057, + -1.607249,0.010755,-1.680275,-0.491811,-0.843645,-0.215370, + -0.934732,-0.314137,-1.943344,-0.491811,-0.843645,-0.215370, + -0.625318,-0.725192,-1.039731,-0.491811,-0.843645,-0.215370, + -0.934732,-0.314137,-1.943344,-0.290661,-0.558811,-0.776690, + -0.344503,-0.106899,-2.313329,-0.290661,-0.558811,-0.776690, + -0.184171,-0.491687,-2.096484,-0.290661,-0.558811,-0.776690, + -1.607249,0.010755,-1.680275,-0.468506,-0.295705,-0.832503, + -0.707720,0.065178,-2.205832,-0.468506,-0.295705,-0.832503, + -0.934732,-0.314137,-1.943344,-0.468506,-0.295705,-0.832503, + -0.707720,0.065178,-2.205832,-0.411171,-0.339377,-0.846027, + -0.344503,-0.106899,-2.313329,-0.411171,-0.339377,-0.846027, + -0.934732,-0.314137,-1.943344,-0.411171,-0.339377,-0.846027, + -0.625318,-0.725192,-1.039731,-0.315603,-0.487398,-0.814149, + 0.052641,-1.633897,-0.758536,-0.315603,-0.487398,-0.814149, + -0.350659,-1.373304,-0.758204,-0.315603,-0.487398,-0.814149, + -0.350659,-1.373304,-0.758204,-0.316011,-0.488030,-0.813611, + 0.052641,-1.633897,-0.758536,-0.316011,-0.488030,-0.813611, + -0.299529,-2.155551,-0.308846,-0.316011,-0.488030,-0.813611, + -0.625318,-0.725192,-1.039731,-0.842372,-0.435616,-0.317252, + -0.611777,-1.317411,-0.262516,-0.842372,-0.435616,-0.317252, + -0.936850,-0.751093,-0.176985,-0.842372,-0.435616,-0.317252, + -0.299529,-2.155551,-0.308846,-0.858317,-0.296621,-0.418698, + -0.611777,-1.317411,-0.262516,-0.858317,-0.296621,-0.418698, + -0.350659,-1.373304,-0.758204,-0.858317,-0.296621,-0.418698, + -0.299529,-2.155551,-0.308846,-0.076337,-0.710053,-0.699999, + 0.231851,-1.904112,-0.621845,-0.076337,-0.710053,-0.699999, + -0.086080,-2.478361,-0.004677,-0.076337,-0.710053,-0.699999, + 0.231851,-1.904112,-0.621845,0.799111,-0.586126,-0.133708, + 0.091215,-2.267556,0.130842,0.799111,-0.586126,-0.133708, + -0.086080,-2.478361,-0.004677,0.799111,-0.586126,-0.133708, + 0.091215,-2.267556,0.130842,-0.208503,-0.398745,0.893045, + -0.260030,-2.240649,0.060849,-0.208503,-0.398745,0.893045, + -0.086080,-2.478361,-0.004677,-0.208503,-0.398745,0.893045, + 0.091215,-2.267556,0.130842,-0.196980,-0.021695,0.980167, + -0.470828,-1.954876,0.024811,-0.196980,-0.021695,0.980167, + -0.260030,-2.240649,0.060849,-0.196980,-0.021695,0.980167, + -0.260030,-2.240649,0.060849,-0.812251,-0.581408,-0.047047, + -0.299529,-2.155551,-0.308846,-0.812251,-0.581408,-0.047047, + -0.086080,-2.478361,-0.004677,-0.812251,-0.581408,-0.047047, + -0.278168,0.037777,-0.209083,0.064599,0.997623,0.023971, + -1.591571,0.097928,0.827036,0.064599,0.997623,0.023971, + -0.930959,0.037777,1.550149,0.064599,0.997623,0.023971, + -0.914878,0.210568,-1.267986,-0.451479,0.892219,0.010576, + -0.862298,0.231412,-0.781910,-0.451479,0.892219,0.010576, + -0.302799,0.520691,-1.301783,-0.451479,0.892219,0.010576, + -1.068480,0.101026,-0.360536,0.007341,0.999956,0.005841, + -1.736910,0.103204,0.106553,0.007341,0.999956,0.005841, + -1.591571,0.097928,0.827036,0.007341,0.999956,0.005841, + 0.236277,0.037777,0.701510,0.000000,1.000000,-0.000000, + 1.608835,0.037777,0.559365,0.000000,1.000000,-0.000000, + 0.656348,0.037777,-0.098120,0.000000,1.000000,-0.000000, + -0.930959,0.037777,1.550149,0.000000,1.000000,-0.000000, + -0.278168,0.037777,-0.209083,0.000000,1.000000,-0.000000, + 0.501631,0.037777,1.688231,0.000000,1.000000,0.000000, + 1.393132,0.037777,1.383312,0.000000,1.000000,0.000000, + 1.034499,0.275328,-1.269756,0.196507,0.940792,-0.276217, + 0.471459,0.267036,-1.698558,0.196507,0.940792,-0.276217, + 0.637660,0.376390,-1.207861,0.196507,0.940792,-0.276217, + 0.812177,0.491673,-0.567514,-0.157696,0.796105,0.584251, + 1.244986,0.398908,-0.324291,-0.157696,0.796105,0.584251, + 1.002755,0.639249,-0.717163,-0.157696,0.796105,0.584251, + 1.381545,0.288786,-0.765328,0.484775,0.872472,-0.061537, + 1.685851,0.084184,-1.268915,0.484775,0.872472,-0.061537, + 1.348978,0.284964,-1.076072,0.484775,0.872472,-0.061537, + -0.505260,0.213488,-1.704558,-0.341361,0.885806,-0.314358, + -1.247727,0.059337,-1.332687,-0.341361,0.885806,-0.314358, + -0.914878,0.210568,-1.267986,-0.341361,0.885806,-0.314358, + 0.471459,0.267036,-1.698558,0.113029,0.948800,-0.294962, + 0.254658,0.065420,-2.430170,0.113029,0.948800,-0.294962, + -0.221831,0.306144,-1.838428,0.113029,0.948800,-0.294962, + -0.221831,0.306144,-1.838428,-0.143666,0.903921,-0.402847, + -0.274246,0.065420,-2.359878,-0.143666,0.903921,-0.402847, + -0.707720,0.065178,-2.205832,-0.143666,0.903921,-0.402847, + -0.020753,-0.743329,-1.377161,0.203115,-0.908935,-0.364119, + -0.184171,-0.491687,-2.096484,0.203115,-0.908935,-0.364119, + 0.506020,-0.293147,-2.207084,0.203115,-0.908935,-0.364119, + 0.810208,-0.709404,-1.141590,0.065767,-0.508178,-0.858737, + 1.489208,-0.318759,-1.320762,0.065767,-0.508178,-0.858737, + 0.957233,-1.089151,-0.905606,0.065767,-0.508178,-0.858737, + 1.489208,-0.318759,-1.320762,0.842649,-0.529682,0.096844, + 1.089500,-0.770651,-0.314462,0.842649,-0.529682,0.096844, + 0.957233,-1.089151,-0.905606,0.842649,-0.529682,0.096844, + 1.089500,-0.770651,-0.314462,0.476105,-0.841849,0.254193, + 1.364762,-0.324582,0.647285,0.476105,-0.841849,0.254193, + 0.745909,-0.723539,0.485115,0.476105,-0.841849,0.254193, + 1.089500,-0.770651,-0.314462,0.621220,-0.763538,0.176339, + 2.014675,-0.126122,-0.782958,0.621220,-0.763538,0.176339, + 1.364762,-0.324582,0.647285,0.621220,-0.763538,0.176339, + 1.210661,-0.322174,1.134609,0.209165,-0.891710,0.401376, + 0.289486,-0.743127,0.679448,0.209165,-0.891710,0.401376, + 0.745909,-0.723539,0.485115,0.209165,-0.891710,0.401376, + 0.289486,-0.743127,0.679448,0.112256,-0.692154,0.712966, + -0.866234,-0.291222,1.300128,0.112256,-0.692154,0.712966, + -0.326162,-1.310280,0.225784,0.112256,-0.692154,0.712966, + -0.866234,-0.291222,1.300128,-0.735865,-0.635739,0.233105, + -0.936850,-0.751093,-0.176985,-0.735865,-0.635739,0.233105, + -0.326162,-1.310280,0.225784,-0.735865,-0.635739,0.233105, + -0.934732,-0.314137,-1.943344,-0.217928,-0.914338,-0.341311, + -0.020753,-0.743329,-1.377161,-0.217928,-0.914338,-0.341311, + -0.625318,-0.725192,-1.039731,-0.217928,-0.914338,-0.341311, + 0.506020,-0.293147,-2.207084,0.359758,-0.297920,-0.884205, + 0.254658,0.065420,-2.430170,0.359758,-0.297920,-0.884205, + 1.415955,0.064912,-1.957500,0.359758,-0.297920,-0.884205, + 0.506020,-0.293147,-2.207084,0.001450,-0.490493,-0.871444, + -0.184171,-0.491687,-2.096484,0.001450,-0.490493,-0.871444, + -0.344503,-0.106899,-2.313329,0.001450,-0.490493,-0.871444, + -0.344503,-0.106899,-2.313329,-0.128825,-0.209322,-0.969324, + -0.274246,0.065420,-2.359878,-0.128825,-0.209322,-0.969324, + 0.254658,0.065420,-2.430170,-0.128825,-0.209322,-0.969324, + 0.810208,-0.709404,-1.141590,0.363550,-0.827846,-0.427204, + 0.506020,-0.293147,-2.207084,0.363550,-0.827846,-0.427204, + 1.489208,-0.318759,-1.320762,0.363550,-0.827846,-0.427204, + 1.415955,0.064912,-1.957500,0.864833,-0.379805,-0.328348, + 1.685851,0.084184,-1.268915,0.864833,-0.379805,-0.328348, + 1.489208,-0.318759,-1.320762,0.864833,-0.379805,-0.328348, + 1.685851,0.084184,-1.268915,0.843529,0.099206,-0.527842, + 2.054775,0.091828,-0.677912,0.843529,0.099206,-0.527842, + 2.014675,-0.126122,-0.782958,0.843529,0.099206,-0.527842, + 0.957233,-1.089151,-0.905606,0.304896,-0.925237,-0.225775, + 0.739686,-1.249709,-0.541415,0.304896,-0.925237,-0.225775, + 0.454708,-1.256676,-0.897711,0.304896,-0.925237,-0.225775, + 0.957233,-1.089151,-0.905606,0.754980,-0.632785,0.172010, + 1.089500,-0.770651,-0.314462,0.754980,-0.632785,0.172010, + 0.739686,-1.249709,-0.541415,0.754980,-0.632785,0.172010, + 0.810208,-0.709404,-1.141590,0.158331,-0.485892,-0.859558, + 0.454708,-1.256676,-0.897711,0.158331,-0.485892,-0.859558, + 0.052641,-1.633897,-0.758536,0.158331,-0.485892,-0.859558, + 0.454708,-1.256676,-0.897711,0.071930,-0.411827,-0.908419, + 0.231851,-1.904112,-0.621845,0.071930,-0.411827,-0.908419, + 0.052641,-1.633897,-0.758536,0.071930,-0.411827,-0.908419, + 1.364762,-0.324582,0.647285,0.667049,-0.114290,0.736195, + 1.955554,-0.191974,0.132568,0.667049,-0.114290,0.736195, + 2.074500,0.090083,0.068582,0.667049,-0.114290,0.736195, + 2.014675,-0.126122,-0.782958,0.985338,-0.168554,-0.026430, + 2.054775,0.091828,-0.677912,0.985338,-0.168554,-0.026430, + 2.074500,0.090083,0.068582,0.985338,-0.168554,-0.026430, + 1.364762,-0.324582,0.647285,0.833133,-0.508251,0.218107, + 1.608835,0.037777,0.559365,0.833133,-0.508251,0.218107, + 1.393132,0.037777,1.383312,0.833133,-0.508251,0.218107, + 1.393132,0.037777,1.383312,0.308934,-0.297855,0.903240, + 0.501631,0.037777,1.688231,0.308934,-0.297855,0.903240, + 0.514977,-0.286422,1.576757,0.308934,-0.297855,0.903240, + 0.745909,-0.723539,0.485115,0.943374,-0.288606,0.163563, + 0.507135,-1.581211,0.348922,0.943374,-0.288606,0.163563, + 0.620568,-1.491335,-0.146730,0.943374,-0.288606,0.163563, + 0.507135,-1.581211,0.348922,0.227638,-0.654831,0.720678, + 0.020776,-1.770522,0.330532,0.227638,-0.654831,0.720678, + 0.342563,-2.052501,-0.027325,0.227638,-0.654831,0.720678, + 0.745909,-0.723539,0.485115,0.352005,-0.526859,0.773635, + 0.289486,-0.743127,0.679448,0.352005,-0.526859,0.773635, + 0.089439,-1.345612,0.360167,0.352005,-0.526859,0.773635, + 0.507135,-1.581211,0.348922,-0.011353,-0.067744,0.997638, + 0.089439,-1.345612,0.360167,-0.011353,-0.067744,0.997638, + 0.020776,-1.770522,0.330532,-0.011353,-0.067744,0.997638, + 1.089500,-0.770651,-0.314462,0.824551,-0.558121,-0.092827, + 0.620568,-1.491335,-0.146730,0.824551,-0.558121,-0.092827, + 0.739686,-1.249709,-0.541415,0.824551,-0.558121,-0.092827, + 0.620568,-1.491335,-0.146730,0.895938,-0.444176,-0.001524, + 0.342563,-2.052501,-0.027325,0.895938,-0.444176,-0.001524, + 0.739686,-1.249709,-0.541415,0.895938,-0.444176,-0.001524, + -0.123718,-0.298339,1.611730,-0.330784,-0.673283,0.661265, + -0.414258,0.037777,1.808618,-0.330784,-0.673283,0.661265, + -0.930959,0.037777,1.550149,-0.330784,-0.673283,0.661265, + 0.514977,-0.286422,1.576757,0.123552,-0.318115,0.939967, + 0.501631,0.037777,1.688231,0.123552,-0.318115,0.939967, + -0.414258,0.037777,1.808618,0.123552,-0.318115,0.939967, + -0.930959,0.037777,1.550149,-0.710606,-0.329252,0.621798, + -1.591571,0.097928,0.827036,-0.710606,-0.329252,0.621798, + -1.444312,-0.282136,0.794076,-0.710606,-0.329252,0.621798, + -1.591571,0.097928,0.827036,-0.914230,0.359435,0.187055, + -1.736910,0.103204,0.106553,-0.914230,0.359435,0.187055, + -1.839477,-0.177971,0.145553,-0.914230,0.359435,0.187055, + -0.326162,-1.310280,0.225784,-0.862841,0.036460,0.504158, + -0.611777,-1.317411,-0.262516,-0.862841,0.036460,0.504158, + -0.470828,-1.954876,0.024811,-0.862841,0.036460,0.504158, + -0.148262,0.773865,-0.947432,-0.214448,0.783558,-0.583137, + 0.101020,0.922236,-0.839739,-0.214448,0.783558,-0.583137, + 0.312442,0.779166,-1.109731,-0.214448,0.783558,-0.583137, + -0.326162,-1.310280,0.225784,-0.476424,-0.162478,0.864073, + -0.470828,-1.954876,0.024811,-0.476424,-0.162478,0.864073, + 0.020776,-1.770522,0.330532,-0.476424,-0.162478,0.864073, + -1.607249,0.010755,-1.680275,-0.672686,-0.690413,-0.266128, + -1.675519,-0.336500,-0.606829,-0.672686,-0.690413,-0.266128, + -2.011082,0.043485,-0.744422,-0.672686,-0.690413,-0.266128, + -1.839477,-0.177971,0.145553,-0.894170,0.362602,0.262642, + -1.736910,0.103204,0.106553,-0.894170,0.362602,0.262642, + -2.011082,0.043485,-0.744422,-0.894170,0.362602,0.262642, + -1.607249,0.010755,-1.680275,-0.088166,0.994955,-0.047871, + -1.247727,0.059337,-1.332687,-0.088166,0.994955,-0.047871, + -0.707720,0.065178,-2.205832,-0.088166,0.994955,-0.047871, + -0.707720,0.065178,-2.205832,-0.332492,-0.117227,-0.935792, + -0.274246,0.065420,-2.359878,-0.332492,-0.117227,-0.935792, + -0.344503,-0.106899,-2.313329,-0.332492,-0.117227,-0.935792, + -0.625318,-0.725192,-1.039731,-0.422393,-0.540336,-0.727751, + -0.020753,-0.743329,-1.377161,-0.422393,-0.540336,-0.727751, + 0.052641,-1.633897,-0.758536,-0.422393,-0.540336,-0.727751, + -0.625318,-0.725192,-1.039731,-0.791668,-0.492524,-0.361499, + -0.350659,-1.373304,-0.758204,-0.791668,-0.492524,-0.361499, + -0.611777,-1.317411,-0.262516,-0.791668,-0.492524,-0.361499, + -0.299529,-2.155551,-0.308846,-0.906730,-0.322801,-0.271369, + -0.470828,-1.954876,0.024811,-0.906730,-0.322801,-0.271369, + -0.611777,-1.317411,-0.262516,-0.906730,-0.322801,-0.271369, + -0.299529,-2.155551,-0.308846,-0.214713,-0.550502,-0.806750, + 0.052641,-1.633897,-0.758536,-0.214713,-0.550502,-0.806750, + 0.231851,-1.904112,-0.621845,-0.214713,-0.550502,-0.806750, + 0.231851,-1.904112,-0.621845,0.506337,-0.809792,-0.296411, + 0.342563,-2.052501,-0.027325,0.506337,-0.809792,-0.296411, + 0.091215,-2.267556,0.130842,0.506337,-0.809792,-0.296411, + 0.231851,-1.904112,-0.621845,0.773863,-0.565481,-0.285251, + 0.739686,-1.249709,-0.541415,0.773863,-0.565481,-0.285251, + 0.342563,-2.052501,-0.027325,0.773863,-0.565481,-0.285251, + 0.091215,-2.267556,0.130842,-0.375936,-0.390836,0.840190, + 0.020776,-1.770522,0.330532,-0.375936,-0.390836,0.840190, + -0.470828,-1.954876,0.024811,-0.375936,-0.390836,0.840190, + 0.342563,-2.052501,-0.027325,0.641356,-0.206036,0.739061, + 0.020776,-1.770522,0.330532,0.641356,-0.206036,0.739061, + 0.091215,-2.267556,0.130842,0.641356,-0.206036,0.739061, + -0.299529,-2.155551,-0.308846,-0.800525,-0.597048,-0.051900, + -0.260030,-2.240649,0.060849,-0.800525,-0.597048,-0.051900, + -0.470828,-1.954876,0.024811,-0.800525,-0.597048,-0.051900, + -0.278168,0.037777,-0.209083,0.073099,0.996717,0.034798, + -1.068480,0.101026,-0.360536,0.073099,0.996717,0.034798, + -1.591571,0.097928,0.827036,0.073099,0.996717,0.034798, + -1.247727,0.059337,-1.332687,-0.047039,0.998310,-0.034138, + -2.011082,0.043485,-0.744422,-0.047039,0.998310,-0.034138, + -1.068480,0.101026,-0.360536,-0.047039,0.998310,-0.034138, + -1.068480,0.101026,-0.360536,-0.037279,0.997620,-0.058000, + -2.011082,0.043485,-0.744422,-0.037279,0.997620,-0.058000, + -1.736910,0.103204,0.106553,-0.037279,0.997620,-0.058000, + -0.414258,0.037777,1.808618,0.000000,1.000000,0.000000, + 1.685851,0.084184,-1.268915,0.251796,0.856047,-0.451423, + 1.034499,0.275328,-1.269756,0.251796,0.856047,-0.451423, + 1.348978,0.284964,-1.076072,0.251796,0.856047,-0.451423, + 0.656348,0.037777,-0.098120,-0.044318,0.996952,0.064203, + 1.608835,0.037777,0.559365,-0.044318,0.996952,0.064203, + 2.074500,0.090083,0.068582,-0.044318,0.996952,0.064203, + 1.244986,0.398908,-0.324291,0.295075,0.944490,-0.144463, + 2.054775,0.091828,-0.677912,0.295075,0.944490,-0.144463, + 1.381545,0.288786,-0.765328,0.295075,0.944490,-0.144463, + -0.221831,0.306144,-1.838428,-0.498034,0.480949,-0.721560, + -0.505260,0.213488,-1.704558,-0.498034,0.480949,-0.721560, + -0.262315,0.721321,-1.533752,-0.498034,0.480949,-0.721560, + 0.471459,0.267036,-1.698558,0.121281,0.947158,-0.296955, + 1.415955,0.064912,-1.957500,0.121281,0.947158,-0.296955, + 0.254658,0.065420,-2.430170,0.121281,0.947158,-0.296955, + -0.221831,0.306144,-1.838428,-0.055013,0.908641,-0.413938, + 0.254658,0.065420,-2.430170,-0.055013,0.908641,-0.413938, + -0.274246,0.065420,-2.359878,-0.055013,0.908641,-0.413938, + -0.020753,-0.743329,-1.377161,0.149389,-0.905792,-0.396515, + 0.506020,-0.293147,-2.207084,0.149389,-0.905792,-0.396515, + 0.810208,-0.709404,-1.141590,0.149389,-0.905792,-0.396515, + 1.489208,-0.318759,-1.320762,0.497948,-0.847704,-0.182885, + 2.014675,-0.126122,-0.782958,0.497948,-0.847704,-0.182885, + 1.089500,-0.770651,-0.314462,0.497948,-0.847704,-0.182885, + 1.364762,-0.324582,0.647285,0.503912,-0.848132,0.163537, + 1.210661,-0.322174,1.134609,0.503912,-0.848132,0.163537, + 0.745909,-0.723539,0.485115,0.503912,-0.848132,0.163537, + 1.210661,-0.322174,1.134609,0.209218,-0.891736,0.401292, + 0.514977,-0.286422,1.576757,0.209218,-0.891736,0.401292, + 0.289486,-0.743127,0.679448,0.209218,-0.891736,0.401292, + 0.289486,-0.743127,0.679448,-0.162145,-0.916603,0.365442, + -0.123718,-0.298339,1.611730,-0.162145,-0.916603,0.365442, + -0.866234,-0.291222,1.300128,-0.162145,-0.916603,0.365442, + 0.289486,-0.743127,0.679448,0.041058,-0.894588,0.445002, + 0.514977,-0.286422,1.576757,0.041058,-0.894588,0.445002, + -0.123718,-0.298339,1.611730,0.041058,-0.894588,0.445002, + -0.866234,-0.291222,1.300128,-0.275026,-0.914167,0.297757, + -1.444312,-0.282136,0.794076,-0.275026,-0.914167,0.297757, + -0.936850,-0.751093,-0.176985,-0.275026,-0.914167,0.297757, + -1.444312,-0.282136,0.794076,-0.487927,-0.858194,0.159466, + -1.839477,-0.177971,0.145553,-0.487927,-0.858194,0.159466, + -0.936850,-0.751093,-0.176985,-0.487927,-0.858194,0.159466, + -0.936850,-0.751093,-0.176985,-0.403728,-0.898421,-0.172756, + -1.675519,-0.336500,-0.606829,-0.403728,-0.898421,-0.172756, + -0.625318,-0.725192,-1.039731,-0.403728,-0.898421,-0.172756, + -0.936850,-0.751093,-0.176985,-0.517675,-0.852957,0.066909, + -1.839477,-0.177971,0.145553,-0.517675,-0.852957,0.066909, + -1.675519,-0.336500,-0.606829,-0.517675,-0.852957,0.066909, + -0.934732,-0.314137,-1.943344,-0.272460,-0.925814,-0.261981, + -0.184171,-0.491687,-2.096484,-0.272460,-0.925814,-0.261981, + -0.020753,-0.743329,-1.377161,-0.272460,-0.925814,-0.261981, + -0.862298,0.231412,-0.781910,0.062061,0.842272,0.535467, + -0.404757,0.197895,-0.782219,0.062061,0.842272,0.535467, + -0.302799,0.520691,-1.301783,0.062061,0.842272,0.535467, + 0.568488,0.537125,-0.913448,-0.551248,0.683734,0.478156, + 0.656348,0.037777,-0.098120,-0.551248,0.683734,0.478156, + 0.812177,0.491673,-0.567514,-0.551248,0.683734,0.478156, + -0.262315,0.721321,-1.533752,-0.213818,0.757013,0.617424, + -0.302799,0.520691,-1.301783,-0.213818,0.757013,0.617424, + 0.115069,0.760356,-1.450921,-0.213818,0.757013,0.617424, + -0.061115,0.654189,-0.643377,0.027941,0.579677,0.814367, + 0.205810,0.801703,-0.757537,0.027941,0.579677,0.814367, + 0.101020,0.922236,-0.839739,0.027941,0.579677,0.814367, + 0.205810,0.801703,-0.757537,0.686999,0.708215,0.162680, + 0.312442,0.779166,-1.109731,0.686999,0.708215,0.162680, + 0.101020,0.922236,-0.839739,0.686999,0.708215,0.162680, + 0.656348,0.037777,-0.098120,-0.265754,0.732275,0.627015, + 0.312442,0.779166,-1.109731,-0.265754,0.732275,0.627015, + 0.344937,0.262088,-0.492076,-0.265754,0.732275,0.627015, + 0.312442,0.779166,-1.109731,0.609839,0.689476,-0.390794, + 0.115069,0.760356,-1.450921,0.609839,0.689476,-0.390794, + 0.077232,0.934717,-1.202342,0.609839,0.689476,-0.390794, + -0.278168,0.037777,-0.209083,0.191788,0.518516,0.833282, + 0.344937,0.262088,-0.492076,0.191788,0.518516,0.833282, + -0.102879,0.422805,-0.489015,0.191788,0.518516,0.833282, + -0.269697,0.566033,-0.874217,-0.848104,0.523746,0.080063, + -0.148262,0.773865,-0.947432,-0.848104,0.523746,0.080063, + -0.186512,0.743264,-1.152426,-0.848104,0.523746,0.080063, + 0.637660,0.376390,-1.207861,0.744297,0.644037,-0.176740, + 0.312442,0.779166,-1.109731,0.744297,0.644037,-0.176740, + 0.568488,0.537125,-0.913448,0.744297,0.644037,-0.176740, + -0.148262,0.773865,-0.947432,-0.588752,0.808241,-0.010797, + 0.077232,0.934717,-1.202342,-0.588752,0.808241,-0.010797, + -0.186512,0.743264,-1.152426,-0.588752,0.808241,-0.010797, + -0.278168,0.037777,-0.209083,-0.063048,0.845033,0.530984, + 0.656348,0.037777,-0.098120,-0.063048,0.845033,0.530984, + 0.344937,0.262088,-0.492076,-0.063048,0.845033,0.530984, + -0.404757,0.197895,-0.782219,-0.774175,0.405487,0.486039, + -0.102879,0.422805,-0.489015,-0.774175,0.405487,0.486039, + -0.269697,0.566033,-0.874217,-0.774175,0.405487,0.486039, + 1.002755,0.639249,-0.717163,0.009213,0.878584,-0.477499, + 0.637660,0.376390,-1.207861,0.009213,0.878584,-0.477499, + 0.568488,0.537125,-0.913448,0.009213,0.878584,-0.477499, + 1.002755,0.639249,-0.717163,-0.368310,0.852282,0.371434, + 0.568488,0.537125,-0.913448,-0.368310,0.852282,0.371434, + 0.812177,0.491673,-0.567514,-0.368310,0.852282,0.371434, + 1.002755,0.639249,-0.717163,0.680780,0.731952,0.028032, + 1.244986,0.398908,-0.324291,0.680780,0.731952,0.028032, + 1.381545,0.288786,-0.765328,0.680780,0.731952,0.028032, + 1.002755,0.639249,-0.717163,0.292029,0.806373,-0.514278, + 1.348978,0.284964,-1.076072,0.292029,0.806373,-0.514278, + 1.034499,0.275328,-1.269756,0.292029,0.806373,-0.514278, + 1.002755,0.639249,-0.717163,0.671521,0.736715,-0.079439, + 1.381545,0.288786,-0.765328,0.671521,0.736715,-0.079439, + 1.348978,0.284964,-1.076072,0.671521,0.736715,-0.079439, + 0.656348,0.037777,-0.098120,-0.204323,0.736731,0.644577, + 1.244986,0.398908,-0.324291,-0.204323,0.736731,0.644577, + 0.812177,0.491673,-0.567514,-0.204323,0.736731,0.644577, + 1.002755,0.639249,-0.717163,0.127518,0.831689,-0.540401, + 1.034499,0.275328,-1.269756,0.127518,0.831689,-0.540401, + 0.637660,0.376390,-1.207861,0.127518,0.831689,-0.540401, + 1.034499,0.275328,-1.269756,0.148193,0.965691,-0.213260, + 1.415955,0.064912,-1.957500,0.148193,0.965691,-0.213260, + 0.471459,0.267036,-1.698558,0.148193,0.965691,-0.213260, + 1.381545,0.288786,-0.765328,0.298863,0.933395,-0.198632, + 2.054775,0.091828,-0.677912,0.298863,0.933395,-0.198632, + 1.685851,0.084184,-1.268915,0.298863,0.933395,-0.198632, + 1.685851,0.084184,-1.268915,0.279128,0.950573,-0.136011, + 1.415955,0.064912,-1.957500,0.279128,0.950573,-0.136011, + 1.034499,0.275328,-1.269756,0.279128,0.950573,-0.136011, + 1.244986,0.398908,-0.324291,0.351847,0.936030,-0.007109, + 2.074500,0.090083,0.068582,0.351847,0.936030,-0.007109, + 2.054775,0.091828,-0.677912,0.351847,0.936030,-0.007109, + 0.568488,0.537125,-0.913448,0.412774,0.795871,0.442952, + 0.312442,0.779166,-1.109731,0.412774,0.795871,0.442952, + 0.656348,0.037777,-0.098120,0.412774,0.795871,0.442952, + 0.637660,0.376390,-1.207861,0.676300,0.636437,-0.370899, + 0.471459,0.267036,-1.698558,0.676300,0.636437,-0.370899, + 0.312442,0.779166,-1.109731,0.676300,0.636437,-0.370899, + 0.656348,0.037777,-0.098120,-0.112175,0.652309,0.749606, + 2.074500,0.090083,0.068582,-0.112175,0.652309,0.749606, + 1.244986,0.398908,-0.324291,-0.112175,0.652309,0.749606, + 0.312442,0.779166,-1.109731,0.900741,0.355212,0.249982, + 0.205810,0.801703,-0.757537,0.900741,0.355212,0.249982, + 0.344937,0.262088,-0.492076,0.900741,0.355212,0.249982, + -0.102879,0.422805,-0.489015,0.054740,0.547276,0.835160, + 0.205810,0.801703,-0.757537,0.054740,0.547276,0.835160, + -0.061115,0.654189,-0.643377,0.054740,0.547276,0.835160, + -0.102879,0.422805,-0.489015,0.174787,0.470544,0.864892, + 0.344937,0.262088,-0.492076,0.174787,0.470544,0.864892, + 0.205810,0.801703,-0.757537,0.174787,0.470544,0.864892, + -0.148262,0.773865,-0.947432,-0.819420,0.413037,0.397430, + -0.102879,0.422805,-0.489015,-0.819420,0.413037,0.397430, + -0.061115,0.654189,-0.643377,-0.819420,0.413037,0.397430, + -0.302799,0.520691,-1.301783,-0.935367,0.351933,0.035096, + -0.404757,0.197895,-0.782219,-0.935367,0.351933,0.035096, + -0.269697,0.566033,-0.874217,-0.935367,0.351933,0.035096, + -0.302799,0.520691,-1.301783,-0.564513,0.642593,-0.518072, + -0.186512,0.743264,-1.152426,-0.564513,0.642593,-0.518072, + 0.077232,0.934717,-1.202342,-0.564513,0.642593,-0.518072, + -0.302799,0.520691,-1.301783,-0.891873,0.451792,0.021139, + -0.269697,0.566033,-0.874217,-0.891873,0.451792,0.021139, + -0.186512,0.743264,-1.152426,-0.891873,0.451792,0.021139, + -0.302799,0.520691,-1.301783,-0.556071,0.638273,-0.532346, + 0.077232,0.934717,-1.202342,-0.556071,0.638273,-0.532346, + 0.115069,0.760356,-1.450921,-0.556071,0.638273,-0.532346, + -0.221831,0.306144,-1.838428,0.194953,0.548876,-0.812852, + 0.115069,0.760356,-1.450921,0.194953,0.548876,-0.812852, + 0.471459,0.267036,-1.698558,0.194953,0.548876,-0.812852, + -0.278168,0.037777,-0.209083,0.018057,0.952626,0.303607, + -0.862298,0.231412,-0.781910,0.018057,0.952626,0.303607, + -1.068480,0.101026,-0.360536,0.018057,0.952626,0.303607, + -0.302799,0.520691,-1.301783,-0.910049,0.378636,0.168656, + -0.262315,0.721321,-1.533752,-0.910049,0.378636,0.168656, + -0.505260,0.213488,-1.704558,-0.910049,0.378636,0.168656, + -0.302799,0.520691,-1.301783,-0.431763,0.808594,-0.399696, + -0.505260,0.213488,-1.704558,-0.431763,0.808594,-0.399696, + -0.914878,0.210568,-1.267986,-0.431763,0.808594,-0.399696, + -1.247727,0.059337,-1.332687,-0.414588,0.909991,0.005824, + -0.862298,0.231412,-0.781910,-0.414588,0.909991,0.005824, + -0.914878,0.210568,-1.267986,-0.414588,0.909991,0.005824, + -0.505260,0.213488,-1.704558,-0.279804,0.945470,-0.166723, + -0.707720,0.065178,-2.205832,-0.279804,0.945470,-0.166723, + -1.247727,0.059337,-1.332687,-0.279804,0.945470,-0.166723, + -0.221831,0.306144,-1.838428,-0.361917,0.923511,-0.127061, + -0.707720,0.065178,-2.205832,-0.361917,0.923511,-0.127061, + -0.505260,0.213488,-1.704558,-0.361917,0.923511,-0.127061, + 0.312442,0.779166,-1.109731,0.633798,0.660195,-0.403040, + 0.471459,0.267036,-1.698558,0.633798,0.660195,-0.403040, + 0.115069,0.760356,-1.450921,0.633798,0.660195,-0.403040, + -0.269697,0.566033,-0.874217,-0.662414,0.561673,0.495713, + -0.102879,0.422805,-0.489015,-0.662414,0.561673,0.495713, + -0.148262,0.773865,-0.947432,-0.662414,0.561673,0.495713, + -0.148262,0.773865,-0.947432,0.221736,0.724107,0.653072, + 0.312442,0.779166,-1.109731,0.221736,0.724107,0.653072, + 0.077232,0.934717,-1.202342,0.221736,0.724107,0.653072, + -0.404757,0.197895,-0.782219,-0.747849,0.577950,0.326642, + -0.278168,0.037777,-0.209083,-0.747849,0.577950,0.326642, + -0.102879,0.422805,-0.489015,-0.747849,0.577950,0.326642, + -0.221831,0.306144,-1.838428,0.113113,0.594980,-0.795741, + -0.262315,0.721321,-1.533752,0.113113,0.594980,-0.795741, + 0.115069,0.760356,-1.450921,0.113113,0.594980,-0.795741, + -0.278168,0.037777,-0.209083,0.070836,0.964646,0.253850, + -0.404757,0.197895,-0.782219,0.070836,0.964646,0.253850, + -0.862298,0.231412,-0.781910,0.070836,0.964646,0.253850, + -1.247727,0.059337,-1.332687,-0.462896,0.885145,0.047392, + -1.068480,0.101026,-0.360536,-0.462896,0.885145,0.047392, + -0.862298,0.231412,-0.781910,-0.462896,0.885145,0.047392, + -0.148262,0.773865,-0.947432,-0.591876,0.677685,0.436377, + -0.061115,0.654189,-0.643377,-0.591876,0.677685,0.436377, + 0.101020,0.922236,-0.839739,-0.591876,0.677685,0.436377 + ]; + + this.indices = [ + 0,1,2, + 3,4,5, + 6,7,8, + 9,10,11, + 12,13,14, + 15,16,17, + 18,19,20, + 21,22,23, + 24,25,26, + 27,28,29, + 30,31,32, + 33,34,35, + 36,37,38, + 39,40,41, + 42,43,44, + 45,46,47, + 48,49,50, + 51,52,53, + 54,55,56, + 57,58,59, + 60,61,62, + 63,64,65, + 66,67,68, + 69,70,71, + 72,73,74, + 75,76,77, + 78,79,80, + 81,82,83, + 84,85,86, + 87,88,89, + 90,91,92, + 93,94,95, + 96,97,98, + 99,100,101, + 102,103,104, + 105,106,107, + 108,109,110, + 111,112,113, + 114,115,116, + 117,118,119, + 120,121,122, + 123,120,124, + 120,125,126, + 127,128,129, + 130,131,132, + 133,134,135, + 136,137,138, + 139,140,141, + 142,143,144, + 145,146,147, + 148,149,150, + 151,152,153, + 154,155,156, + 157,158,159, + 160,161,162, + 163,164,165, + 166,167,168, + 169,170,171, + 172,173,174, + 175,176,177, + 178,179,180, + 181,182,183, + 184,185,186, + 187,188,189, + 190,191,192, + 193,194,195, + 196,197,198, + 199,200,201, + 202,203,204, + 205,206,207, + 208,209,210, + 211,212,213, + 214,215,216, + 217,218,219, + 220,221,222, + 223,224,225, + 226,227,228, + 229,230,231, + 232,233,234, + 235,236,237, + 238,239,240, + 241,242,243, + 244,245,246, + 247,248,249, + 250,251,252, + 253,254,255, + 256,257,258, + 259,260,261, + 262,263,264, + 265,266,267, + 268,269,270, + 271,272,273, + 274,275,276, + 277,278,279, + 280,281,282, + 283,284,285, + 286,287,288, + 289,290,291, + 292,293,294, + 295,296,297, + 298,299,300, + 120,126,121, + 123,301,120, + 120,301,125, + 302,303,304, + 305,306,307, + 308,309,310, + 311,312,313, + 314,315,316, + 317,318,319, + 320,321,322, + 323,324,325, + 326,327,328, + 329,330,331, + 332,333,334, + 335,336,337, + 338,339,340, + 341,342,343, + 344,345,346, + 347,348,349, + 350,351,352, + 353,354,355, + 120,122,124, + 356,357,358, + 359,360,361, + 362,363,364, + 365,366,367, + 368,369,370, + 371,372,373, + 374,375,376, + 377,378,379, + 380,381,382, + 383,384,385, + 386,387,388, + 389,390,391, + 392,393,394, + 395,396,397, + 398,399,400, + 401,402,403, + 404,405,406, + 407,408,409, + 410,411,412, + 413,414,415, + 416,417,418, + 419,420,421, + 422,423,424, + 425,426,427, + 428,429,430, + 431,432,433, + 434,435,436, + 437,438,439, + 440,441,442, + 443,444,445, + 446,447,448, + 449,450,451, + 452,453,454, + 455,456,457, + 458,459,460, + 461,462,463, + 464,465,466, + 467,468,469, + 470,471,472, + 473,474,475, + 476,477,478, + 479,480,481, + 482,483,484, + 485,486,487, + 488,489,490, + 491,492,493, + 494,495,496, + 497,498,499, + 500,501,502 + ]; + + this.colors = []; + for(var i = 0; i < this.positions.length; i += 3) { + this.colors.push(0.5, 0.5, 0.5, 1); + } + + this.InitBuffers(); + } +} + + +class River extends Object3D { + + constructor() { + + // DONE: Setze Material für Fluss + super([0.0, 0.0, 0.5], [0, 0, 0.8], [0.9, 0.67, 0.2]); + + // DONE: Füge zu jedem Vertex Normale hinzu (bei PLY-Export in Blender) + this.positions = [ + 0.0, 0.0, 14.0, 0, 1, 0, // index 0 + 1.0, 0.0, 12.5, 0, 1, 0, // index 1 + 1.5, 0.0, 12.5, 0, 1, 0, // index 2 + 1.3, 0.0, 11.0, 0, 1, 0, // index 3 + 2.3, 0.0, 11.0, 0, 1, 0, // index 4 + 1.0, 0.0, 9.5, 0, 1, 0, // index 5 + 2.5, 0.0, 9.5, 0, 1, 0, // index 6 + 0.0, 0.0, 8.0, 0, 1, 0, // index 7 + 2.0, 0.0, 8.0, 0, 1, 0, // index 8 + -2.4, 0.0, 6.0, 0, 1, 0, // index 9 + 0.1, 0.0, 6.0, 0, 1, 0, // index 10 + -3.0, 0.0, 4.0, 0, 1, 0, // index 11 + 0.0, 0.0, 4.0, 0, 1, 0, // index 12 + -2.4, 0.0, 2.0, 0, 1, 0, // index 13 + 1.1, 0.0, 2.0, 0, 1, 0, // index 14 + 0.0, 0.0, 0.0, 0, 1, 0, // index 15 + 4.0, 0.0, 0.0, 0, 1, 0, // index 16 + 0.0, -7.0, 0.0, 0, 0, 1, // index 17 -> additional for waterfall + 4.0, -6.0, 0.0, 0, 0, 1 // index 18 -> additional for waterfall + ]; + + this.indices = [ + 0, 1, 2, + 1, 2, 3, + 2, 3, 4, + 3, 4, 5, + 4, 5, 6, + 5, 6, 7, + 6, 7, 8, + 7, 8, 9, + 8, 9, 10, + 9, 10, 11, + 10, 11, 12, + 11, 12, 13, + 12, 13, 14, + 13, 14, 15, + 14, 15, 16, + 15, 16, 17, // additional for waterfall + 16, 17, 18 // additional for waterfall + ]; + + this.InitBuffers(); + } +} + + +class Tree extends Object3D { + + constructor() { + + // DONE: Setze Material für Baum + super([0.2, 0.5, 0.0], [0.4, 0.8, 0.2], [0.6, 0.9, 0.2]); + + // DONE: Füge zu jedem Vertex Normale hinzu (bei PLY-Export in Blender) + this.positions = [ + -0.056969,0.301313,0.059775,-0.999612,-0.027868,0.000000, + -0.056969,0.301313,-0.040876,-0.999612,-0.027868,0.000000, + -0.055153,0.236174,-0.050744,-0.999612,-0.027868,0.000000, + -0.055153,0.236174,-0.050744,0.000000,0.000000,0.000000, + -0.055153,0.236174,-0.050744,0.000000,0.000000,0.000000, + 0.045498,0.236174,-0.050744,0.000000,0.000000,0.000000, + 0.045498,0.236174,-0.050744,0.385482,-0.922715,0.000000, + 0.183358,0.293767,-0.010892,0.385482,-0.922715,0.000000, + 0.183358,0.293767,0.016715,0.385482,-0.922715,0.000000, + -0.056969,0.301313,0.059775,0.000000,-0.149788,0.988718, + -0.055153,0.236174,0.049907,0.000000,-0.149788,0.988718, + 0.045498,0.236174,0.049907,0.000000,-0.149788,0.988718, + -0.055153,0.236174,0.049907,0.000000,-0.000000,1.000000, + -0.055153,0.051740,0.049907,0.000000,-0.000000,1.000000, + 0.045498,0.051740,0.049907,0.000000,-0.000000,1.000000, + 0.043682,0.301313,0.059775,0.000000,-0.616587,0.787287, + -0.037898,0.415271,0.149025,0.000000,-0.616587,0.787287, + -0.093419,0.415271,0.149025,0.000000,-0.616587,0.787287, + -0.037898,0.415271,0.093504,-0.000000,1.000000,0.000000, + -0.093419,0.415271,0.093504,-0.000000,1.000000,0.000000, + -0.093419,0.415271,0.149025,-0.000000,1.000000,0.000000, + 0.043682,0.301313,-0.040876,0.813124,0.582091,0.000000, + -0.037898,0.415271,0.093504,0.813124,0.582091,0.000000, + -0.037898,0.415271,0.149025,0.813124,0.582091,0.000000, + 0.043682,0.301313,-0.040876,0.000000,0.762678,-0.646778, + -0.056969,0.301313,-0.040876,0.000000,0.762678,-0.646778, + -0.093419,0.415271,0.093504,0.000000,0.762678,-0.646778, + -0.056969,0.301313,-0.040876,-0.952465,-0.304649,-0.000000, + -0.056969,0.301313,0.059775,-0.952465,-0.304649,-0.000000, + -0.093419,0.415271,0.149025,-0.952465,-0.304649,-0.000000, + -0.055153,0.236174,-0.050744,-0.000000,-0.716953,-0.697121, + 0.008874,0.422507,-0.242378,-0.000000,-0.716953,-0.697121, + 0.069244,0.422507,-0.242378,-0.000000,-0.716953,-0.697121, + 0.045498,0.236174,-0.050744,0.000000,0.000000,0.000000, + 0.043682,0.301313,-0.040876,0.000000,0.000000,0.000000, + 0.043682,0.301313,-0.040876,0.000000,0.000000,0.000000, + -0.056969,0.301313,-0.040876,0.000000,0.000000,0.000000, + -0.056969,0.301313,-0.040876,0.000000,0.000000,0.000000, + 0.007785,0.461577,-0.236459,0.000000,0.149788,-0.988718, + 0.068155,0.461577,-0.236459,0.000000,0.149788,-0.988718, + 0.069244,0.422507,-0.242378,0.000000,0.149788,-0.988718, + 0.043682,0.301313,-0.040876,0.991417,0.007868,0.130501, + 0.045498,0.236174,-0.050744,0.991417,0.007868,0.130501, + 0.069244,0.422507,-0.242378,0.991417,0.007868,0.130501, + -0.056969,0.301313,-0.040876,0.000000,0.773489,0.633810, + 0.043682,0.301313,-0.040876,0.000000,0.773489,0.633810, + 0.068155,0.461577,-0.236459,0.000000,0.773489,0.633810, + -0.056969,0.301313,-0.040876,-0.953672,0.018901,-0.300254, + 0.007785,0.461577,-0.236459,-0.953672,0.018901,-0.300254, + 0.008874,0.422507,-0.242378,-0.953672,0.018901,-0.300254, + 0.182859,0.311634,0.019422,0.999612,0.027867,-0.000000, + 0.183358,0.293767,0.016715,0.999612,0.027867,-0.000000, + 0.183358,0.293767,-0.010892,0.999612,0.027867,-0.000000, + 0.043682,0.301313,0.059775,0.285170,-0.135791,0.948809, + 0.045498,0.236174,0.049907,0.285170,-0.135791,0.948809, + 0.183358,0.293767,0.016715,0.285170,-0.135791,0.948809, + 0.043682,0.301313,0.059775,-0.073956,0.997261,0.000000, + 0.182859,0.311634,0.019422,-0.073956,0.997261,0.000000, + 0.182859,0.311634,-0.008185,-0.073956,0.997261,0.000000, + 0.045498,0.236174,-0.050744,0.215291,0.152140,-0.964626, + 0.043682,0.301313,-0.040876,0.215291,0.152140,-0.964626, + 0.182859,0.311634,-0.008185,0.215291,0.152140,-0.964626, + 0.045498,0.051740,0.049907,-0.000000,0.502693,0.864465, + -0.055153,0.051740,0.049907,-0.000000,0.502693,0.864465, + -0.079447,0.009962,0.074201,-0.000000,0.502693,0.864465, + 0.045498,0.236174,0.049907,1.000000,0.000000,0.000000, + 0.045498,0.051740,0.049907,1.000000,0.000000,0.000000, + 0.045498,0.051740,-0.050744,1.000000,0.000000,0.000000, + 0.045498,0.236174,-0.050744,0.000000,0.000000,-1.000000, + 0.045498,0.051740,-0.050744,0.000000,0.000000,-1.000000, + -0.055153,0.051740,-0.050744,0.000000,0.000000,-1.000000, + -0.055153,0.236174,-0.050744,-1.000000,0.000000,0.000000, + -0.055153,0.051740,-0.050744,-1.000000,0.000000,0.000000, + -0.055153,0.051740,0.049907,-1.000000,0.000000,0.000000, + -0.079447,0.009962,-0.075038,-0.000000,-1.000000,-0.000000, + 0.069792,0.009962,-0.075038,-0.000000,-1.000000,-0.000000, + 0.069792,0.009962,0.074201,-0.000000,-1.000000,-0.000000, + 0.045498,0.051740,0.049907,0.864465,0.502693,-0.000000, + 0.069792,0.009962,0.074201,0.864465,0.502693,-0.000000, + 0.069792,0.009962,-0.075038,0.864465,0.502693,-0.000000, + -0.055153,0.051740,-0.050744,0.000000,0.502693,-0.864465, + 0.045498,0.051740,-0.050744,0.000000,0.502693,-0.864465, + 0.069792,0.009962,-0.075038,0.000000,0.502693,-0.864465, + -0.055153,0.051740,0.049907,-0.864465,0.502693,0.000000, + -0.055153,0.051740,-0.050744,-0.864465,0.502693,0.000000, + -0.079447,0.009962,-0.075038,-0.864465,0.502693,0.000000, + -0.023604,0.642852,-0.220543,-0.459289,0.372406,0.806454, + -0.139997,0.499304,-0.220543,-0.459289,0.372406,0.806454, + 0.131748,0.574773,-0.100629,-0.459289,0.372406,0.806454, + 0.281596,0.451252,-0.218185,0.587257,-0.056040,0.807458, + 0.131748,0.574773,-0.100629,0.587257,-0.056040,0.807458, + 0.128755,0.410586,-0.109847,0.587257,-0.056040,0.807458, + -0.139997,0.499304,-0.220543,-0.461953,-0.659562,0.592940, + 0.128755,0.410586,-0.109847,-0.461953,-0.659562,0.592940, + 0.070558,0.502573,-0.052865,-0.461953,-0.659562,0.592940, + -0.139997,0.499304,-0.220543,-0.463939,-0.636043,0.616611, + -0.127460,0.423836,-0.288955,-0.463939,-0.636043,0.616611, + 0.128755,0.410586,-0.109847,-0.463939,-0.636043,0.616611, + 0.128755,0.410586,-0.109847,0.653439,-0.054303,0.755029, + 0.131748,0.574773,-0.100629,0.653439,-0.054303,0.755029, + 0.070558,0.502573,-0.052865,0.653439,-0.054303,0.755029, + -0.139997,0.499304,-0.220543,-0.986479,-0.163888,0.000000, + -0.139997,0.499304,-0.357368,-0.986479,-0.163888,0.000000, + -0.127460,0.423836,-0.288955,-0.986479,-0.163888,0.000000, + -0.127460,0.423836,-0.288955,-0.313653,-0.665811,-0.676992, + -0.139997,0.499304,-0.357368,-0.313653,-0.665811,-0.676992, + 0.164721,0.355756,-0.357368,-0.313653,-0.665811,-0.676992, + 0.070558,0.497457,-0.498071,-0.358604,0.771341,-0.525772, + -0.023604,0.642852,-0.220543,-0.358604,0.771341,-0.525772, + 0.202360,0.582881,-0.462644,-0.358604,0.771341,-0.525772, + 0.128755,0.410586,-0.109847,-0.181038,-0.965427,0.187552, + -0.127460,0.423836,-0.288955,-0.181038,-0.965427,0.187552, + 0.164721,0.355756,-0.357368,-0.181038,-0.965427,0.187552, + 0.131748,0.574773,-0.100629,0.738343,0.343153,0.580599, + 0.281596,0.451252,-0.218185,0.738343,0.343153,0.580599, + 0.258592,0.543865,-0.243667,0.738343,0.343153,0.580599, + -0.139997,0.499304,-0.357368,-0.343767,0.778820,-0.524656, + -0.023604,0.642852,-0.220543,-0.343767,0.778820,-0.524656, + 0.070558,0.497457,-0.498071,-0.343767,0.778820,-0.524656, + 0.070558,0.497457,-0.498071,0.484743,-0.432671,-0.760145, + 0.202360,0.582881,-0.462644,0.484743,-0.432671,-0.760145, + 0.164721,0.355756,-0.357368,0.484743,-0.432671,-0.760145, + 0.164721,0.355756,-0.357368,-0.361247,-0.766841,-0.530524, + -0.139997,0.499304,-0.357368,-0.361247,-0.766841,-0.530524, + 0.070558,0.497457,-0.498071,-0.361247,-0.766841,-0.530524, + 0.202360,0.582881,-0.462644,0.324771,0.942015,0.084446, + 0.131748,0.574773,-0.100629,0.324771,0.942015,0.084446, + 0.258592,0.543865,-0.243667,0.324771,0.942015,0.084446, + 0.131748,0.574773,-0.100629,-0.436771,0.723669,0.534354, + -0.139997,0.499304,-0.220543,-0.436771,0.723669,0.534354, + 0.070558,0.502573,-0.052865,-0.436771,0.723669,0.534354, + 0.202360,0.582881,-0.462644,0.821800,-0.346013,-0.452681, + 0.281596,0.451252,-0.218185,0.821800,-0.346013,-0.452681, + 0.164721,0.355756,-0.357368,0.821800,-0.346013,-0.452681, + -0.023604,0.642852,-0.220543,-0.776749,0.629810,0.000000, + -0.139997,0.499304,-0.357368,-0.776749,0.629810,0.000000, + -0.139997,0.499304,-0.220543,-0.776749,0.629810,0.000000, + -0.023604,0.642852,-0.220543,0.342260,0.935502,0.087712, + 0.131748,0.574773,-0.100629,0.342260,0.935502,0.087712, + 0.202360,0.582881,-0.462644,0.342260,0.935502,0.087712, + 0.258592,0.543865,-0.243667,0.960083,0.179444,-0.214569, + 0.281596,0.451252,-0.218185,0.960083,0.179444,-0.214569, + 0.202360,0.582881,-0.462644,0.960083,0.179444,-0.214569, + 0.281596,0.451252,-0.218185,0.412630,-0.874842,0.253749, + 0.128755,0.410586,-0.109847,0.412630,-0.874842,0.253749, + 0.164721,0.355756,-0.357368,0.412630,-0.874842,0.253749, + 0.239636,0.235546,-0.001961,0.293781,-0.849928,0.437395, + 0.322547,0.294289,0.056497,0.293781,-0.849928,0.437395, + 0.207968,0.275752,0.097434,0.293781,-0.849928,0.437395, + 0.322547,0.294289,0.056497,0.640793,-0.752349,-0.152826, + 0.239636,0.235546,-0.001961,0.640793,-0.752349,-0.152826, + 0.290802,0.292476,-0.067686,0.640793,-0.752349,-0.152826, + 0.239636,0.235546,-0.001961,-0.453223,-0.867180,0.206369, + 0.207968,0.275752,0.097434,-0.453223,-0.867180,0.206369, + 0.137152,0.290442,0.003639,-0.453223,-0.867180,0.206369, + 0.239636,0.235546,-0.001961,-0.470754,-0.857811,-0.206282, + 0.137152,0.290442,0.003639,-0.470754,-0.857811,-0.206282, + 0.207968,0.279664,-0.113150,-0.470754,-0.857811,-0.206282, + 0.239636,0.235546,-0.001961,0.364369,-0.825374,-0.431270, + 0.207968,0.279664,-0.113150,0.364369,-0.825374,-0.431270, + 0.290802,0.292476,-0.067686,0.364369,-0.825374,-0.431270, + 0.322547,0.294289,0.056497,0.968265,0.031160,-0.247977, + 0.290802,0.292476,-0.067686,0.968265,0.031160,-0.247977, + 0.305492,0.374381,-0.000033,0.968265,0.031160,-0.247977, + 0.207968,0.275752,0.097434,0.352065,-0.128808,0.927070, + 0.322547,0.294289,0.056497,0.352065,-0.128808,0.927070, + 0.271305,0.366839,0.086037,0.352065,-0.128808,0.927070, + 0.137152,0.290442,0.003639,-0.797548,-0.190890,0.572257, + 0.207968,0.275752,0.097434,-0.797548,-0.190890,0.572257, + 0.156725,0.378237,0.060204,-0.797548,-0.190890,0.572257, + 0.207968,0.279664,-0.113150,-0.849100,-0.173812,-0.498818, + 0.137152,0.290442,0.003639,-0.849100,-0.173812,-0.498818, + 0.156725,0.378237,-0.060271,-0.849100,-0.173812,-0.498818, + 0.290802,0.292476,-0.067686,0.494621,-0.182931,-0.849639, + 0.207968,0.279664,-0.113150,0.494621,-0.182931,-0.849639, + 0.271305,0.378237,-0.097501,0.494621,-0.182931,-0.849639, + 0.322547,0.294289,0.056497,0.823953,0.433247,0.365238, + 0.305492,0.374381,-0.000033,0.823953,0.433247,0.365238, + 0.271305,0.366839,0.086037,0.823953,0.433247,0.365238, + 0.207968,0.275752,0.097434,-0.189168,0.250340,0.949497, + 0.271305,0.366839,0.086037,-0.189168,0.250340,0.949497, + 0.156725,0.378237,0.060204,-0.189168,0.250340,0.949497, + 0.137152,0.290442,0.003639,-0.976038,0.217602,0.000000, + 0.156725,0.378237,0.060204,-0.976038,0.217602,0.000000, + 0.156725,0.378237,-0.060271,-0.976038,0.217602,0.000000, + 0.207968,0.279664,-0.113150,-0.291714,0.329966,-0.897789, + 0.156725,0.378237,-0.060271,-0.291714,0.329966,-0.897789, + 0.271305,0.378237,-0.097501,-0.291714,0.329966,-0.897789, + 0.290802,0.292476,-0.067686,0.940096,0.100469,-0.325770, + 0.271305,0.378237,-0.097501,0.940096,0.100469,-0.325770, + 0.305492,0.374381,-0.000033,0.940096,0.100469,-0.325770, + 0.271305,0.366839,0.086037,0.498729,0.823547,0.270257, + 0.305492,0.374381,-0.000033,0.498729,0.823547,0.270257, + 0.239636,0.412997,0.003822,0.498729,0.823547,0.270257, + 0.156725,0.378237,0.060204,-0.025750,0.867418,0.496913, + 0.271305,0.366839,0.086037,-0.025750,0.867418,0.496913, + 0.239636,0.412997,0.003822,-0.025750,0.867418,0.496913, + 0.156725,0.378237,-0.060271,-0.386646,0.922228,0.000000, + 0.156725,0.378237,0.060204,-0.386646,0.922228,0.000000, + 0.239636,0.412997,0.003822,-0.386646,0.922228,0.000000, + 0.271305,0.378237,-0.097501,-0.115138,0.927997,-0.354351, + 0.156725,0.378237,-0.060271,-0.115138,0.927997,-0.354351, + 0.239636,0.412997,0.003822,-0.115138,0.927997,-0.354351, + 0.305492,0.374381,-0.000033,0.494777,0.857731,-0.139617, + 0.271305,0.378237,-0.097501,0.494777,0.857731,-0.139617, + 0.239636,0.412997,0.003822,0.494777,0.857731,-0.139617, + -0.036268,0.361529,0.163458,0.245614,-0.919073,0.308188, + 0.091404,0.426523,0.255533,0.245614,-0.919073,0.308188, + -0.091304,0.397046,0.313238,0.245614,-0.919073,0.308188, + 0.173261,0.530724,0.313832,0.678737,-0.683487,0.268630, + 0.091404,0.426523,0.255533,0.678737,-0.683487,0.268630, + 0.211194,0.504732,0.151857,0.678737,-0.683487,0.268630, + -0.036268,0.361529,0.163458,-0.371219,-0.924837,0.082904, + -0.091304,0.397046,0.313238,-0.371219,-0.924837,0.082904, + -0.199772,0.427673,0.169213,-0.371219,-0.924837,0.082904, + -0.036268,0.361529,0.163458,-0.372956,-0.903573,-0.210856, + -0.199772,0.427673,0.169213,-0.372956,-0.903573,-0.210856, + -0.091304,0.415891,0.027848,-0.372956,-0.903573,-0.210856, + -0.036268,0.361529,0.163458,-0.189963,-0.935499,-0.297919, + -0.091304,0.415891,0.027848,-0.189963,-0.935499,-0.297919, + 0.084198,0.366894,0.069797,-0.189963,-0.935499,-0.297919, + 0.173261,0.530724,0.313832,0.846323,-0.458157,0.271718, + 0.211194,0.504732,0.151857,0.846323,-0.458157,0.271718, + 0.241174,0.620887,0.254329,0.846323,-0.458157,0.271718, + -0.125322,0.487354,0.416054,-0.053405,-0.597611,0.800005, + 0.033749,0.468629,0.412686,-0.053405,-0.597611,0.800005, + -0.042797,0.620887,0.521313,-0.053405,-0.597611,0.800005, + -0.309859,0.487355,0.162063,-0.916472,-0.199783,0.346649, + -0.248280,0.463910,0.311354,-0.916472,-0.199783,0.346649, + -0.326769,0.617539,0.192386,-0.916472,-0.199783,0.346649, + -0.125322,0.487354,-0.091928,-0.616355,-0.185357,-0.765343, + -0.248280,0.463910,0.012771,-0.616355,-0.185357,-0.765343, + -0.218301,0.620887,-0.049390,-0.616355,-0.185357,-0.765343, + 0.173261,0.487354,0.005089,0.431612,-0.385516,-0.815530, + 0.032055,0.467037,-0.060038,0.431612,-0.385516,-0.815530, + 0.132707,0.620887,-0.079497,0.431612,-0.385516,-0.815530, + 0.173261,0.530724,0.313832,0.789879,-0.216232,0.573877, + 0.241174,0.620887,0.254329,0.789879,-0.216232,0.573877, + 0.132707,0.620887,0.403623,0.789879,-0.216232,0.573877, + -0.125322,0.487354,0.416054,-0.714939,-0.103258,0.691520, + -0.042797,0.620887,0.521313,-0.714939,-0.103258,0.691520, + -0.218301,0.620887,0.339866,-0.714939,-0.103258,0.691520, + -0.309859,0.487355,0.162063,-0.991767,-0.128005,-0.003496, + -0.326769,0.617539,0.192386,-0.991767,-0.128005,-0.003496, + -0.326769,0.620887,0.069796,-0.991767,-0.128005,-0.003496, + -0.125322,0.487354,-0.091928,-0.520406,-0.091911,-0.848958, + -0.218301,0.620887,-0.049390,-0.520406,-0.091911,-0.848958, + -0.042797,0.615104,-0.156346,-0.520406,-0.091911,-0.848958, + 0.173261,0.487354,0.005089,0.802609,-0.125627,-0.583126, + 0.132707,0.620887,-0.079497,0.802609,-0.125627,-0.583126, + 0.241174,0.620887,0.069796,0.802609,-0.125627,-0.583126, + 0.053601,0.742690,0.364031,0.573608,0.462479,0.676082, + 0.168557,0.738438,0.269407,0.573608,0.462479,0.676082, + 0.005710,0.823999,0.349044,0.573608,0.462479,0.676082, + -0.258855,0.754420,0.319037,-0.471299,0.661699,0.583122, + -0.121286,0.777864,0.403622,-0.471299,0.661699,0.583122, + -0.169792,0.874880,0.254329,-0.471299,0.661699,0.583122, + -0.258855,0.754420,0.005089,-0.700224,0.661699,-0.268032, + -0.296788,0.777864,0.162063,-0.700224,0.661699,-0.268032, + -0.169792,0.874880,0.069797,-0.700224,0.661699,-0.268032, + 0.010880,0.723391,-0.015800,0.508800,0.284327,-0.812576, + -0.121286,0.777864,-0.079496,0.508800,0.284327,-0.812576, + 0.005710,0.846612,0.024079,0.508800,0.284327,-0.812576, + 0.224265,0.754419,0.162063,0.626249,0.619385,-0.473470, + 0.145085,0.753424,0.056032,0.626249,0.619385,-0.473470, + 0.114178,0.853428,0.145975,0.626249,0.619385,-0.473470, + -0.091304,0.397046,0.313238,-0.076005,-0.761490,0.643705, + 0.033749,0.468629,0.412686,-0.076005,-0.761490,0.643705, + -0.125322,0.487354,0.416054,-0.076005,-0.761490,0.643705, + -0.091304,0.397046,0.313238,0.252454,-0.907486,0.335763, + 0.091404,0.426523,0.255533,0.252454,-0.907486,0.335763, + 0.033749,0.468629,0.412686,0.252454,-0.907486,0.335763, + 0.091404,0.426523,0.255533,0.595517,-0.694103,0.404452, + 0.173261,0.530724,0.313832,0.595517,-0.694103,0.404452, + 0.033749,0.468629,0.412686,0.595517,-0.694103,0.404452, + 0.211194,0.504732,0.151857,0.765264,-0.631862,-0.122966, + 0.084198,0.366894,0.069797,0.765264,-0.631862,-0.122966, + 0.173261,0.487354,0.005089,0.765264,-0.631862,-0.122966, + 0.211194,0.504732,0.151857,0.654543,-0.726862,0.207955, + 0.091404,0.426523,0.255533,0.654543,-0.726862,0.207955, + 0.084198,0.366894,0.069797,0.654543,-0.726862,0.207955, + 0.091404,0.426523,0.255533,0.263121,-0.921510,0.285632, + -0.036268,0.361529,0.163458,0.263121,-0.921510,0.285632, + 0.084198,0.366894,0.069797,0.263121,-0.921510,0.285632, + -0.199772,0.427673,0.169213,-0.478748,-0.875905,0.059918, + -0.248280,0.463910,0.311354,-0.478748,-0.875905,0.059918, + -0.309859,0.487355,0.162063,-0.478748,-0.875905,0.059918, + -0.199772,0.427673,0.169213,-0.390936,-0.914986,0.099848, + -0.091304,0.397046,0.313238,-0.390936,-0.914986,0.099848, + -0.248280,0.463910,0.311354,-0.390936,-0.914986,0.099848, + -0.091304,0.397046,0.313238,-0.330688,-0.760615,0.558669, + -0.125322,0.487354,0.416054,-0.330688,-0.760615,0.558669, + -0.248280,0.463910,0.311354,-0.330688,-0.760615,0.558669, + -0.091304,0.415891,0.027848,-0.220782,-0.863886,-0.452721, + -0.248280,0.463910,0.012771,-0.220782,-0.863886,-0.452721, + -0.125322,0.487354,-0.091928,-0.220782,-0.863886,-0.452721, + -0.091304,0.415891,0.027848,-0.278079,-0.951153,-0.134092, + -0.199772,0.427673,0.169213,-0.278079,-0.951153,-0.134092, + -0.248280,0.463910,0.012771,-0.278079,-0.951153,-0.134092, + -0.199772,0.427673,0.169213,-0.472960,-0.879238,-0.057007, + -0.309859,0.487355,0.162063,-0.472960,-0.879238,-0.057007, + -0.248280,0.463910,0.012771,-0.472960,-0.879238,-0.057007, + 0.084198,0.366894,0.069797,0.394884,-0.643958,-0.655274, + 0.032055,0.467037,-0.060038,0.394884,-0.643958,-0.655274, + 0.173261,0.487354,0.005089,0.394884,-0.643958,-0.655274, + 0.084198,0.366894,0.069797,-0.084448,-0.805117,-0.587074, + -0.091304,0.415891,0.027848,-0.084448,-0.805117,-0.587074, + 0.032055,0.467037,-0.060038,-0.084448,-0.805117,-0.587074, + -0.091304,0.415891,0.027848,-0.007480,-0.859674,-0.510789, + -0.125322,0.487354,-0.091928,-0.007480,-0.859674,-0.510789, + 0.032055,0.467037,-0.060038,-0.007480,-0.859674,-0.510789, + 0.241174,0.620887,0.254329,0.992077,0.125628,-0.000000, + 0.241174,0.620887,0.069796,0.992077,0.125628,-0.000000, + 0.224265,0.754419,0.162063,0.992077,0.125628,-0.000000, + 0.241174,0.620887,0.254329,0.968266,-0.249921,0.000000, + 0.211194,0.504732,0.151857,0.968266,-0.249921,0.000000, + 0.241174,0.620887,0.069796,0.968266,-0.249921,0.000000, + 0.211194,0.504732,0.151857,0.909235,-0.369770,-0.191209, + 0.173261,0.487354,0.005089,0.909235,-0.369770,-0.191209, + 0.241174,0.620887,0.069796,0.909235,-0.369770,-0.191209, + -0.042797,0.620887,0.521313,0.470873,0.534057,0.702183, + 0.132707,0.620887,0.403623,0.470873,0.534057,0.702183, + 0.053601,0.742690,0.364031,0.470873,0.534057,0.702183, + -0.042797,0.620887,0.521313,0.531591,-0.298317,0.792728, + 0.033749,0.468629,0.412686,0.531591,-0.298317,0.792728, + 0.132707,0.620887,0.403623,0.531591,-0.298317,0.792728, + 0.033749,0.468629,0.412686,0.641314,-0.377039,0.668250, + 0.173261,0.530724,0.313832,0.641314,-0.377039,0.668250, + 0.132707,0.620887,0.403623,0.641314,-0.377039,0.668250, + -0.326769,0.617539,0.192386,-0.794880,-0.149686,0.588013, + -0.218301,0.620887,0.339866,-0.794880,-0.149686,0.588013, + -0.258855,0.754420,0.319037,-0.794880,-0.149686,0.588013, + -0.326769,0.617539,0.192386,-0.805216,0.046407,0.591163, + -0.248280,0.463910,0.311354,-0.805216,0.046407,0.591163, + -0.218301,0.620887,0.339866,-0.805216,0.046407,0.591163, + -0.248280,0.463910,0.311354,-0.646577,-0.015045,0.762700, + -0.125322,0.487354,0.416054,-0.646577,-0.015045,0.762700, + -0.218301,0.620887,0.339866,-0.646577,-0.015045,0.762700, + -0.218301,0.620887,-0.049390,-0.738657,0.049925,-0.672230, + -0.326769,0.620887,0.069796,-0.738657,0.049925,-0.672230, + -0.258855,0.754420,0.005089,-0.738657,0.049925,-0.672230, + -0.218301,0.620887,-0.049390,-0.733843,-0.124312,-0.667848, + -0.248280,0.463910,0.012771,-0.733843,-0.124312,-0.667848, + -0.326769,0.620887,0.069796,-0.733843,-0.124312,-0.667848, + -0.248280,0.463910,0.012771,-0.889697,-0.330385,-0.315095, + -0.309859,0.487355,0.162063,-0.889697,-0.330385,-0.315095, + -0.326769,0.620887,0.069796,-0.889697,-0.330385,-0.315095, + 0.132707,0.620887,-0.079497,0.260983,0.713943,-0.649749, + -0.042797,0.615104,-0.156346,0.260983,0.713943,-0.649749, + 0.010880,0.723391,-0.015800,0.260983,0.713943,-0.649749, + 0.132707,0.620887,-0.079497,0.384274,-0.358978,-0.850570, + 0.032055,0.467037,-0.060038,0.384274,-0.358978,-0.850570, + -0.042797,0.615104,-0.156346,0.384274,-0.358978,-0.850570, + 0.032055,0.467037,-0.060038,0.108863,-0.502748,-0.857551, + -0.125322,0.487354,-0.091928,0.108863,-0.502748,-0.857551, + -0.042797,0.615104,-0.156346,0.108863,-0.502748,-0.857551, + 0.132707,0.620887,0.403623,0.540329,0.556171,0.631441, + 0.168557,0.738438,0.269407,0.540329,0.556171,0.631441, + 0.053601,0.742690,0.364031,0.540329,0.556171,0.631441, + 0.132707,0.620887,0.403623,0.744731,0.390657,0.541076, + 0.241174,0.620887,0.254329,0.744731,0.390657,0.541076, + 0.168557,0.738438,0.269407,0.744731,0.390657,0.541076, + 0.241174,0.620887,0.254329,0.778049,0.420814,0.466429, + 0.224265,0.754419,0.162063,0.778049,0.420814,0.466429, + 0.168557,0.738438,0.269407,0.778049,0.420814,0.466429, + -0.218301,0.620887,0.339866,-0.520517,-0.024952,0.853487, + -0.121286,0.777864,0.403622,-0.520517,-0.024952,0.853487, + -0.258855,0.754420,0.319037,-0.520517,-0.024952,0.853487, + -0.218301,0.620887,0.339866,-0.709548,0.159774,0.686305, + -0.042797,0.620887,0.521313,-0.709548,0.159774,0.686305, + -0.121286,0.777864,0.403622,-0.709548,0.159774,0.686305, + -0.042797,0.620887,0.521313,0.289628,0.662637,0.690672, + 0.053601,0.742690,0.364031,0.289628,0.662637,0.690672, + -0.121286,0.777864,0.403622,0.289628,0.662637,0.690672, + -0.326769,0.620887,0.069796,-0.904989,0.330385,-0.268032, + -0.296788,0.777864,0.162063,-0.904989,0.330385,-0.268032, + -0.258855,0.754420,0.005089,-0.904989,0.330385,-0.268032, + -0.326769,0.620887,0.069796,-0.982776,0.184734,0.005046, + -0.326769,0.617539,0.192386,-0.982776,0.184734,0.005046, + -0.296788,0.777864,0.162063,-0.982776,0.184734,0.005046, + -0.326769,0.617539,0.192386,-0.938935,0.224846,0.260472, + -0.258855,0.754420,0.319037,-0.938935,0.224846,0.260472, + -0.296788,0.777864,0.162063,-0.938935,0.224846,0.260472, + -0.042797,0.615104,-0.156346,0.535505,0.557690,-0.634205, + -0.121286,0.777864,-0.079496,0.535505,0.557690,-0.634205, + 0.010880,0.723391,-0.015800,0.535505,0.557690,-0.634205, + -0.042797,0.615104,-0.156346,-0.510565,0.153275,-0.846068, + -0.218301,0.620887,-0.049390,-0.510565,0.153275,-0.846068, + -0.121286,0.777864,-0.079496,-0.510565,0.153275,-0.846068, + -0.218301,0.620887,-0.049390,-0.537117,0.173640,-0.825442, + -0.258855,0.754420,0.005089,-0.537117,0.173640,-0.825442, + -0.121286,0.777864,-0.079496,-0.537117,0.173640,-0.825442, + 0.241174,0.620887,0.069796,0.709751,0.459078,-0.534323, + 0.145085,0.753424,0.056032,0.709751,0.459078,-0.534323, + 0.224265,0.754419,0.162063,0.709751,0.459078,-0.534323, + 0.241174,0.620887,0.069796,0.716157,0.465177,-0.520316, + 0.132707,0.620887,-0.079497,0.716157,0.465177,-0.520316, + 0.145085,0.753424,0.056032,0.716157,0.465177,-0.520316, + 0.132707,0.620887,-0.079497,0.216745,0.687991,-0.692596, + 0.010880,0.723391,-0.015800,0.216745,0.687991,-0.692596, + 0.145085,0.753424,0.056032,0.216745,0.687991,-0.692596, + 0.005710,0.823999,0.349044,0.338289,0.888695,0.309486, + 0.114178,0.853428,0.145975,0.338289,0.888695,0.309486, + -0.042797,0.900194,0.183269,0.338289,0.888695,0.309486, + 0.005710,0.823999,0.349044,0.573113,0.710094,0.409033, + 0.168557,0.738438,0.269407,0.573113,0.710094,0.409033, + 0.114178,0.853428,0.145975,0.573113,0.710094,0.409033, + 0.168557,0.738438,0.269407,0.577848,0.708371,0.405342, + 0.224265,0.754419,0.162063,0.577848,0.708371,0.405342, + 0.114178,0.853428,0.145975,0.577848,0.708371,0.405342, + -0.169792,0.874880,0.254329,0.045372,0.912654,0.406208, + 0.005710,0.823999,0.349044,0.045372,0.912654,0.406208, + -0.042797,0.900194,0.183269,0.045372,0.912654,0.406208, + -0.169792,0.874880,0.254329,-0.061013,0.827772,0.557737, + -0.121286,0.777864,0.403622,-0.061013,0.827772,0.557737, + 0.005710,0.823999,0.349044,-0.061013,0.827772,0.557737, + -0.121286,0.777864,0.403622,0.270663,0.326360,0.905666, + 0.053601,0.742690,0.364031,0.270663,0.326360,0.905666, + 0.005710,0.823999,0.349044,0.270663,0.326360,0.905666, + -0.169792,0.874880,0.069797,-0.195487,0.980706,0.000000, + -0.169792,0.874880,0.254329,-0.195487,0.980706,0.000000, + -0.042797,0.900194,0.183269,-0.195487,0.980706,0.000000, + -0.169792,0.874880,0.069797,-0.607060,0.794656,0.000000, + -0.296788,0.777864,0.162063,-0.607060,0.794656,0.000000, + -0.169792,0.874880,0.254329,-0.607060,0.794656,0.000000, + -0.296788,0.777864,0.162063,-0.700224,0.661699,0.268032, + -0.258855,0.754420,0.319037,-0.700224,0.661699,0.268032, + -0.169792,0.874880,0.254329,-0.700224,0.661699,0.268032, + 0.005710,0.846612,0.024079,0.075868,0.951784,-0.297241, + -0.169792,0.874880,0.069797,0.075868,0.951784,-0.297241, + -0.042797,0.900194,0.183269,0.075868,0.951784,-0.297241, + 0.005710,0.846612,0.024079,-0.007516,0.837367,-0.546590, + -0.121286,0.777864,-0.079496,-0.007516,0.837367,-0.546590, + -0.169792,0.874880,0.069797,-0.007516,0.837367,-0.546590, + -0.121286,0.777864,-0.079496,-0.471299,0.661699,-0.583122, + -0.258855,0.754420,0.005089,-0.471299,0.661699,-0.583122, + -0.169792,0.874880,0.069797,-0.471299,0.661699,-0.583122, + 0.114178,0.853428,0.145975,0.221484,0.942630,-0.249789, + 0.005710,0.846612,0.024079,0.221484,0.942630,-0.249789, + -0.042797,0.900194,0.183269,0.221484,0.942630,-0.249789, + 0.114178,0.853428,0.145975,0.552425,0.645299,-0.527651, + 0.145085,0.753424,0.056032,0.552425,0.645299,-0.527651, + 0.005710,0.846612,0.024079,0.552425,0.645299,-0.527651, + 0.145085,0.753424,0.056032,0.397910,0.297556,-0.867829, + 0.010880,0.723391,-0.015800,0.397910,0.297556,-0.867829, + 0.005710,0.846612,0.024079,0.397910,0.297556,-0.867829, + 0.008874,0.422507,-0.242378,0.000000,0.149788,-0.988718, + -0.055153,0.236174,0.049907,-0.999612,-0.027868,0.000000, + 0.045498,0.236174,0.049907,0.385482,-0.922715,0.000000, + 0.043682,0.301313,0.059775,0.000000,-0.149788,0.988718, + 0.045498,0.236174,0.049907,0.000000,-0.000000,1.000000, + -0.056969,0.301313,0.059775,0.000000,-0.616587,0.787287, + -0.037898,0.415271,0.149025,-0.000000,1.000000,0.000000, + 0.043682,0.301313,0.059775,0.813124,0.582091,-0.000000, + -0.037898,0.415271,0.093504,0.000000,0.762678,-0.646778, + -0.093419,0.415271,0.093504,-0.952465,-0.304649,0.000000, + 0.045498,0.236174,-0.050744,0.000000,-0.716953,-0.697121, + 0.068155,0.461577,-0.236459,0.991417,0.007869,0.130501, + 0.043682,0.301313,-0.040876,0.991417,0.007869,0.130501, + 0.069244,0.422507,-0.242378,0.991417,0.007869,0.130501, + 0.007785,0.461577,-0.236459,0.000000,0.773489,0.633810, + -0.055153,0.236174,-0.050744,-0.953672,0.018901,-0.300255, + -0.056969,0.301313,-0.040876,-0.953672,0.018901,-0.300255, + 0.008874,0.422507,-0.242378,-0.953672,0.018901,-0.300255, + 0.182859,0.311634,-0.008185,0.999612,0.027867,0.000000, + 0.182859,0.311634,0.019422,0.285170,-0.135791,0.948809, + 0.043682,0.301313,-0.040876,-0.073956,0.997261,0.000000, + 0.183358,0.293767,-0.010892,0.215291,0.152139,-0.964626, + 0.045498,0.236174,-0.050744,0.215291,0.152139,-0.964626, + 0.182859,0.311634,-0.008185,0.215291,0.152139,-0.964626, + 0.069792,0.009962,0.074201,0.000000,0.502693,0.864465, + 0.045498,0.236174,-0.050744,1.000000,-0.000000,0.000000, + -0.055153,0.236174,-0.050744,0.000000,0.000000,-1.000000, + -0.055153,0.236174,0.049907,-1.000000,0.000000,0.000000, + -0.079447,0.009962,0.074201,-0.000000,-1.000000,0.000000, + 0.045498,0.051740,-0.050744,0.864465,0.502693,0.000000, + -0.079447,0.009962,-0.075038,0.000000,0.502693,-0.864465, + -0.079447,0.009962,0.074201,-0.864465,0.502693,0.000000 + ]; + + this.indices = [ + 0,1,2, + 3,4,5, + 6,7,8, + 9,10,11, + 12,13,14, + 15,16,17, + 18,19,20, + 21,22,23, + 24,25,26, + 27,28,29, + 30,31,32, + 33,5,34, + 35,34,36, + 37,36,4, + 38,39,40, + 41,42,43, + 44,45,46, + 47,48,49, + 50,51,52, + 53,54,55, + 56,57,58, + 59,60,61, + 62,63,64, + 65,66,67, + 68,69,70, + 71,72,73, + 74,75,76, + 77,78,79, + 80,81,82, + 83,84,85, + 86,87,88, + 89,90,91, + 92,93,94, + 95,96,97, + 98,99,100, + 101,102,103, + 104,105,106, + 107,108,109, + 110,111,112, + 113,114,115, + 116,117,118, + 119,120,121, + 122,123,124, + 125,126,127, + 128,129,130, + 131,132,133, + 134,135,136, + 137,138,139, + 140,141,142, + 143,144,145, + 146,147,148, + 149,150,151, + 152,153,154, + 155,156,157, + 158,159,160, + 161,162,163, + 164,165,166, + 167,168,169, + 170,171,172, + 173,174,175, + 176,177,178, + 179,180,181, + 182,183,184, + 185,186,187, + 188,189,190, + 191,192,193, + 194,195,196, + 197,198,199, + 200,201,202, + 203,204,205, + 206,207,208, + 209,210,211, + 212,213,214, + 215,216,217, + 218,219,220, + 221,222,223, + 224,225,226, + 227,228,229, + 230,231,232, + 233,234,235, + 236,237,238, + 239,240,241, + 242,243,244, + 245,246,247, + 248,249,250, + 251,252,253, + 254,255,256, + 257,258,259, + 260,261,262, + 263,264,265, + 266,267,268, + 269,270,271, + 272,273,274, + 275,276,277, + 278,279,280, + 281,282,283, + 284,285,286, + 287,288,289, + 290,291,292, + 293,294,295, + 296,297,298, + 299,300,301, + 302,303,304, + 305,306,307, + 308,309,310, + 311,312,313, + 314,315,316, + 317,318,319, + 320,321,322, + 323,324,325, + 326,327,328, + 329,330,331, + 332,333,334, + 335,336,337, + 338,339,340, + 341,342,343, + 344,345,346, + 347,348,349, + 350,351,352, + 353,354,355, + 356,357,358, + 359,360,361, + 362,363,364, + 365,366,367, + 368,369,370, + 371,372,373, + 374,375,376, + 377,378,379, + 380,381,382, + 383,384,385, + 386,387,388, + 389,390,391, + 392,393,394, + 395,396,397, + 398,399,400, + 401,402,403, + 404,405,406, + 407,408,409, + 410,411,412, + 413,414,415, + 416,417,418, + 419,420,421, + 422,423,424, + 425,426,427, + 428,429,430, + 431,432,433, + 434,435,436, + 437,438,439, + 440,441,442, + 443,444,445, + 446,38,40, + 447,0,2, + 33,3,5, + 448,6,8, + 449,9,11, + 450,12,14, + 451,15,17, + 452,18,20, + 453,21,23, + 454,24,26, + 455,27,29, + 456,30,32, + 35,33,34, + 37,35,36, + 3,37,4, + 457,458,459, + 460,44,46, + 461,462,463, + 464,50,52, + 465,53,55, + 466,56,58, + 467,468,469, + 470,62,64, + 471,65,67, + 472,68,70, + 473,71,73, + 474,74,76, + 475,77,79, + 476,80,82, + 477,83,85 + ]; + + this.InitBuffers(); + } +} + + +class Cloud extends Object3D { + + constructor() { + + // DONE: Setze Material für Wolke + super([0.9, 0.9, 0.9], [0.9, 0.9, 0.9], [1.0, 1.0, 1.0]); + + // DONE: Füge zu jedem Vertex Normale hinzu (bei PLY-Export in Blender) + this.positions = [ + -0.308265,-0.282990,-0.001417,-0.135946,-0.969316,0.204803, + 0.101554,-0.243033,0.459730,-0.135946,-0.969316,0.204803, + -0.309308,-0.125191,0.744740,-0.135946,-0.969316,0.204803, + 0.505238,-0.184567,0.783138,0.291647,-0.936493,-0.194738, + 0.101554,-0.243033,0.459730,0.291647,-0.936493,-0.194738, + 0.286346,-0.089592,-0.001417,0.291647,-0.936493,-0.194738, + -0.308265,-0.282990,-0.001417,0.093369,-0.974061,0.206127, + -0.309308,-0.125191,0.744740,0.093369,-0.974061,0.206127, + -0.681349,-0.318752,-0.001417,0.093369,-0.974061,0.206127, + -0.308265,-0.282990,-0.001417,0.095211,-0.993277,-0.065841, + -0.681349,-0.318752,-0.001417,0.095211,-0.993277,-0.065841, + -0.309308,-0.233630,-0.747573,0.095211,-0.993277,-0.065841, + -0.308265,-0.282990,-0.001417,0.413254,-0.908592,-0.060683, + -0.309308,-0.233630,-0.747573,0.413254,-0.908592,-0.060683, + 0.101554,-0.065793,-0.462563,0.413254,-0.908592,-0.060683, + 0.505238,-0.184567,0.783138,0.922555,-0.256327,-0.288425, + 0.286346,-0.089592,-0.001417,0.922555,-0.256327,-0.288425, + 0.469048,0.098790,0.415557,0.922555,-0.256327,-0.288425, + -0.193767,-0.184567,1.268031,-0.052729,-0.782841,0.619984, + 0.183178,-0.259167,1.205894,-0.052729,-0.782841,0.619984, + -0.000570,0.000000,1.517511,-0.052729,-0.782841,0.619984, + -0.963457,-0.122647,-0.001417,-0.849021,-0.431906,0.304335, + -0.676801,-0.160374,0.744743,-0.849021,-0.431906,0.304335, + -0.860548,0.000000,0.459731,-0.849021,-0.431906,0.304335, + -0.193767,-0.184567,-1.270864,-0.631420,-0.566375,-0.529649, + -0.676801,-0.135416,-0.747576,-0.631420,-0.566375,-0.529649, + -0.411437,0.000000,-1.208735,-0.631420,-0.566375,-0.529649, + 0.310058,-0.184567,-0.785971,0.461607,-0.847905,-0.260722, + 0.183178,-0.123648,-1.208727,0.461607,-0.847905,-0.260722, + 0.410298,0.000000,-1.208735,0.461607,-0.847905,-0.260722, + 0.505238,-0.184567,0.783138,0.968062,0.235434,0.086178, + 0.469048,0.098790,0.415557,0.968062,0.235434,0.086178, + 0.410298,0.000000,1.345405,0.968062,0.235434,0.086178, + -0.193767,-0.184567,1.268031,-0.587674,-0.362560,0.723319, + -0.000570,0.000000,1.517511,-0.587674,-0.362560,0.723319, + -0.384104,0.000000,1.205901,-0.587674,-0.362560,0.723319, + -0.963457,-0.122647,-0.001417,-0.766059,0.642771,0.000000, + -0.860548,0.000000,0.459731,-0.766059,0.642771,0.000000, + -0.860548,0.000000,-0.462565,-0.766059,0.642771,0.000000, + -0.193767,-0.184567,-1.270864,-0.598629,-0.493639,-0.630844, + -0.411437,0.000000,-1.208735,-0.598629,-0.493639,-0.630844, + -0.000570,0.000000,-1.598620,-0.598629,-0.493639,-0.630844, + 0.310058,-0.184567,-0.785971,0.937312,-0.340647,0.073525, + 0.410298,0.000000,-1.208735,0.937312,-0.340647,0.073525, + 0.384591,0.090319,-0.462565,0.937312,-0.340647,0.073525, + 0.192628,0.380510,1.268031,0.055988,0.961332,-0.269640, + 0.480481,0.216971,0.744743,0.055988,0.961332,-0.269640, + -0.002332,0.213378,0.631682,0.055988,0.961332,-0.269640, + -0.624286,0.240846,0.783138,-0.388910,0.891429,0.232601, + -0.184317,0.365906,1.039482,-0.388910,0.891429,0.232601, + -0.605569,0.380903,0.277674,-0.388910,0.891429,0.232601, + -0.701558,0.184567,-0.640105,-0.085287,0.993355,-0.077280, + -0.902876,0.216971,-0.001417,-0.085287,0.993355,-0.077280, + -0.352763,0.239456,-0.319506,-0.085287,0.993355,-0.077280, + 0.192628,0.247332,-1.168216,0.402780,0.915012,0.022813, + -0.184317,0.414270,-1.208727,0.402780,0.915012,0.022813, + -0.014225,0.327900,-0.747573,0.402780,0.915012,0.022813, + 0.272043,0.363024,-0.001417,-0.306094,0.949796,-0.064766, + 0.344697,0.335558,-0.747576,-0.306094,0.949796,-0.064766, + 0.012647,0.279427,-0.001417,-0.306094,0.949796,-0.064766, + -0.309308,-0.125191,0.744740,-0.204141,-0.976731,-0.065752, + 0.183178,-0.259167,1.205894,-0.204141,-0.976731,-0.065752, + -0.193767,-0.184567,1.268031,-0.204141,-0.976731,-0.065752, + -0.309308,-0.125191,0.744740,-0.270091,-0.962795,0.008728, + 0.101554,-0.243033,0.459730,-0.270091,-0.962795,0.008728, + 0.183178,-0.259167,1.205894,-0.270091,-0.962795,0.008728, + 0.101554,-0.243033,0.459730,0.174845,-0.983767,-0.040398, + 0.505238,-0.184567,0.783138,0.174845,-0.983767,-0.040398, + 0.183178,-0.259167,1.205894,0.174845,-0.983767,-0.040398, + 0.286346,-0.089592,-0.001417,-0.370034,-0.923554,0.100617, + 0.101554,-0.065793,-0.462563,-0.370034,-0.923554,0.100617, + 0.310058,-0.184567,-0.785971,-0.370034,-0.923554,0.100617, + 0.286346,-0.089592,-0.001417,0.325694,-0.928486,-0.178430, + 0.101554,-0.243033,0.459730,0.325694,-0.928486,-0.178430, + 0.101554,-0.065793,-0.462563,0.325694,-0.928486,-0.178430, + 0.101554,-0.243033,0.459730,0.294445,-0.938496,-0.180354, + -0.308265,-0.282990,-0.001417,0.294445,-0.938496,-0.180354, + 0.101554,-0.065793,-0.462563,0.294445,-0.938496,-0.180354, + -0.681349,-0.318752,-0.001417,-0.561972,-0.808428,0.175021, + -0.676801,-0.160374,0.744743,-0.561972,-0.808428,0.175021, + -0.963457,-0.122647,-0.001417,-0.561972,-0.808428,0.175021, + -0.681349,-0.318752,-0.001417,0.093254,-0.974059,0.206184, + -0.309308,-0.125191,0.744740,0.093254,-0.974059,0.206184, + -0.676801,-0.160374,0.744743,0.093254,-0.974059,0.206184, + -0.309308,-0.125191,0.744740,0.094455,-0.986631,-0.132804, + -0.193767,-0.184567,1.268031,0.094455,-0.986631,-0.132804, + -0.676801,-0.160374,0.744743,0.094455,-0.986631,-0.132804, + -0.309308,-0.233630,-0.747573,-0.255425,-0.955741,-0.146006, + -0.676801,-0.135416,-0.747576,-0.255425,-0.955741,-0.146006, + -0.193767,-0.184567,-1.270864,-0.255425,-0.955741,-0.146006, + -0.309308,-0.233630,-0.747573,-0.251121,-0.939641,-0.232406, + -0.681349,-0.318752,-0.001417,-0.251121,-0.939641,-0.232406, + -0.676801,-0.135416,-0.747576,-0.251121,-0.939641,-0.232406, + -0.681349,-0.318752,-0.001417,-0.559128,-0.804338,-0.201039, + -0.963457,-0.122647,-0.001417,-0.559128,-0.804338,-0.201039, + -0.676801,-0.135416,-0.747576,-0.559128,-0.804338,-0.201039, + 0.101554,-0.065793,-0.462563,-0.475912,-0.879345,0.016121, + 0.183178,-0.123648,-1.208727,-0.475912,-0.879345,0.016121, + 0.310058,-0.184567,-0.785971,-0.475912,-0.879345,0.016121, + 0.101554,-0.065793,-0.462563,0.311309,-0.944235,0.107268, + -0.309308,-0.233630,-0.747573,0.311309,-0.944235,0.107268, + 0.183178,-0.123648,-1.208727,0.311309,-0.944235,0.107268, + -0.309308,-0.233630,-0.747573,0.168152,-0.984217,-0.055152, + -0.193767,-0.184567,-1.270864,0.168152,-0.984217,-0.055152, + 0.183178,-0.123648,-1.208727,0.168152,-0.984217,-0.055152, + 0.469048,0.098790,0.415557,0.859877,0.502936,-0.087555, + 0.384591,0.090319,-0.462565,0.859877,0.502936,-0.087555, + 0.272043,0.363024,-0.001417,0.859877,0.502936,-0.087555, + 0.469048,0.098790,0.415557,0.789057,-0.610318,-0.070003, + 0.286346,-0.089592,-0.001417,0.789057,-0.610318,-0.070003, + 0.384591,0.090319,-0.462565,0.789057,-0.610318,-0.070003, + 0.286346,-0.089592,-0.001417,0.939347,-0.335944,0.069059, + 0.310058,-0.184567,-0.785971,0.939347,-0.335944,0.069059, + 0.384591,0.090319,-0.462565,0.939347,-0.335944,0.069059, + -0.000570,0.000000,1.517511,0.357658,0.378218,0.853834, + 0.410298,0.000000,1.345405,0.357658,0.378218,0.853834, + 0.192628,0.380510,1.268031,0.357658,0.378218,0.853834, + -0.000570,0.000000,1.517511,0.296553,-0.640979,0.707956, + 0.183178,-0.259167,1.205894,0.296553,-0.640979,0.707956, + 0.410298,0.000000,1.345405,0.296553,-0.640979,0.707956, + 0.183178,-0.259167,1.205894,0.609971,-0.716615,0.338228, + 0.505238,-0.184567,0.783138,0.609971,-0.716615,0.338228, + 0.410298,0.000000,1.345405,0.609971,-0.716615,0.338228, + -0.860548,0.000000,0.459731,-0.838303,0.103587,0.535273, + -0.384104,0.000000,1.205901,-0.838303,0.103587,0.535273, + -0.624286,0.240846,0.783138,-0.838303,0.103587,0.535273, + -0.860548,0.000000,0.459731,-0.842801,-0.009261,0.538145, + -0.676801,-0.160374,0.744743,-0.842801,-0.009261,0.538145, + -0.384104,0.000000,1.205901,-0.842801,-0.009261,0.538145, + -0.676801,-0.160374,0.744743,-0.655621,-0.479865,0.583001, + -0.193767,-0.184567,1.268031,-0.655621,-0.479865,0.583001, + -0.384104,0.000000,1.205901,-0.655621,-0.479865,0.583001, + -0.411437,0.000000,-1.208735,-0.832742,0.235206,-0.501218, + -0.860548,0.000000,-0.462565,-0.832742,0.235206,-0.501218, + -0.701558,0.184567,-0.640105,-0.832742,0.235206,-0.501218, + -0.411437,0.000000,-1.208735,-0.854236,-0.076976,-0.514155, + -0.676801,-0.135416,-0.747576,-0.854236,-0.076976,-0.514155, + -0.860548,0.000000,-0.462565,-0.854236,-0.076976,-0.514155, + -0.676801,-0.135416,-0.747576,-0.826542,-0.470153,-0.309491, + -0.963457,-0.122647,-0.001417,-0.826542,-0.470153,-0.309491, + -0.860548,0.000000,-0.462565,-0.826542,-0.470153,-0.309491, + 0.410298,0.000000,-1.208735,0.557388,0.586769,-0.587385, + -0.000570,0.000000,-1.598620,0.557388,0.586769,-0.587385, + 0.192628,0.247332,-1.168216,0.557388,0.586769,-0.587385, + 0.410298,0.000000,-1.208735,0.426997,-0.784344,-0.449976, + 0.183178,-0.123648,-1.208727,0.426997,-0.784344,-0.449976, + -0.000570,0.000000,-1.598620,0.426997,-0.784344,-0.449976, + 0.183178,-0.123648,-1.208727,0.208625,-0.899617,-0.383620, + -0.193767,-0.184567,-1.270864,0.208625,-0.899617,-0.383620, + -0.000570,0.000000,-1.598620,0.208625,-0.899617,-0.383620, + 0.410298,0.000000,1.345405,0.807034,0.518953,0.281752, + 0.480481,0.216971,0.744743,0.807034,0.518953,0.281752, + 0.192628,0.380510,1.268031,0.807034,0.518953,0.281752, + 0.410298,0.000000,1.345405,0.977784,-0.205778,0.039916, + 0.469048,0.098790,0.415557,0.977784,-0.205778,0.039916, + 0.480481,0.216971,0.744743,0.977784,-0.205778,0.039916, + 0.469048,0.098790,0.415557,0.901046,0.397319,-0.173935, + 0.272043,0.363024,-0.001417,0.901046,0.397319,-0.173935, + 0.480481,0.216971,0.744743,0.901046,0.397319,-0.173935, + -0.384104,0.000000,1.205901,-0.528009,0.573263,0.626559, + -0.184317,0.365906,1.039482,-0.528009,0.573263,0.626559, + -0.624286,0.240846,0.783138,-0.528009,0.573263,0.626559, + -0.384104,0.000000,1.205901,-0.517247,0.571971,0.636636, + -0.000570,0.000000,1.517511,-0.517247,0.571971,0.636636, + -0.184317,0.365906,1.039482,-0.517247,0.571971,0.636636, + -0.000570,0.000000,1.517511,-0.417595,0.636913,0.648041, + 0.192628,0.380510,1.268031,-0.417595,0.636913,0.648041, + -0.184317,0.365906,1.039482,-0.417595,0.636913,0.648041, + -0.860548,0.000000,-0.462565,-0.845037,0.449764,-0.289178, + -0.902876,0.216971,-0.001417,-0.845037,0.449764,-0.289178, + -0.701558,0.184567,-0.640105,-0.845037,0.449764,-0.289178, + -0.860548,0.000000,-0.462565,-0.981498,-0.191474,-0.000000, + -0.860548,0.000000,0.459731,-0.981498,-0.191474,-0.000000, + -0.902876,0.216971,-0.001417,-0.981498,-0.191474,-0.000000, + -0.860548,0.000000,0.459731,-0.847800,0.445630,0.287486, + -0.624286,0.240846,0.783138,-0.847800,0.445630,0.287486, + -0.902876,0.216971,-0.001417,-0.847800,0.445630,0.287486, + -0.000570,0.000000,-1.598620,0.380518,0.717678,-0.583219, + -0.184317,0.414270,-1.208727,0.380518,0.717678,-0.583219, + 0.192628,0.247332,-1.168216,0.380518,0.717678,-0.583219, + -0.000570,0.000000,-1.598620,-0.644007,0.353083,-0.678665, + -0.411437,0.000000,-1.208735,-0.644007,0.353083,-0.678665, + -0.184317,0.414270,-1.208727,-0.644007,0.353083,-0.678665, + -0.411437,0.000000,-1.208735,-0.750766,0.411610,-0.516650, + -0.701558,0.184567,-0.640105,-0.750766,0.411610,-0.516650, + -0.184317,0.414270,-1.208727,-0.750766,0.411610,-0.516650, + 0.384591,0.090319,-0.462565,0.963299,0.254811,0.084418, + 0.344697,0.335558,-0.747576,0.963299,0.254811,0.084418, + 0.272043,0.363024,-0.001417,0.963299,0.254811,0.084418, + 0.384591,0.090319,-0.462565,0.984494,0.174957,0.012740, + 0.410298,0.000000,-1.208735,0.984494,0.174957,0.012740, + 0.344697,0.335558,-0.747576,0.984494,0.174957,0.012740, + 0.410298,0.000000,-1.208735,0.664307,0.646184,-0.375691, + 0.192628,0.247332,-1.168216,0.664307,0.646184,-0.375691, + 0.344697,0.335558,-0.747576,0.664307,0.646184,-0.375691, + -0.002332,0.213378,0.631682,0.652029,0.752355,0.093919, + 0.012647,0.279427,-0.001417,0.652029,0.752355,0.093919, + -0.280090,0.522819,0.081168,0.652029,0.752355,0.093919, + -0.002332,0.213378,0.631682,-0.031512,0.994185,0.102975, + 0.480481,0.216971,0.744743,-0.031512,0.994185,0.102975, + 0.012647,0.279427,-0.001417,-0.031512,0.994185,0.102975, + 0.480481,0.216971,0.744743,-0.295985,0.918428,0.262456, + 0.272043,0.363024,-0.001417,-0.295985,0.918428,0.262456, + 0.012647,0.279427,-0.001417,-0.295985,0.918428,0.262456, + -0.605569,0.380903,0.277674,-0.063420,0.855963,0.513132, + -0.002332,0.213378,0.631682,-0.063420,0.855963,0.513132, + -0.280090,0.522819,0.081168,-0.063420,0.855963,0.513132, + -0.605569,0.380903,0.277674,0.360510,0.914958,-0.181338, + -0.184317,0.365906,1.039482,0.360510,0.914958,-0.181338, + -0.002332,0.213378,0.631682,0.360510,0.914958,-0.181338, + -0.184317,0.365906,1.039482,0.140043,0.946283,-0.291440, + 0.192628,0.380510,1.268031,0.140043,0.946283,-0.291440, + -0.002332,0.213378,0.631682,0.140043,0.946283,-0.291440, + -0.352763,0.239456,-0.319506,-0.560542,0.720651,-0.407989, + -0.605569,0.380903,0.277674,-0.560542,0.720651,-0.407989, + -0.280090,0.522819,0.081168,-0.560542,0.720651,-0.407989, + -0.352763,0.239456,-0.319506,-0.217812,0.925012,-0.311304, + -0.902876,0.216971,-0.001417,-0.217812,0.925012,-0.311304, + -0.605569,0.380903,0.277674,-0.217812,0.925012,-0.311304, + -0.902876,0.216971,-0.001417,-0.605675,0.772308,0.191568, + -0.624286,0.240846,0.783138,-0.605675,0.772308,0.191568, + -0.605569,0.380903,0.277674,-0.605675,0.772308,0.191568, + -0.014225,0.327900,-0.747573,-0.637840,0.678600,-0.364229, + -0.352763,0.239456,-0.319506,-0.637840,0.678600,-0.364229, + -0.280090,0.522819,0.081168,-0.637840,0.678600,-0.364229, + -0.014225,0.327900,-0.747573,-0.016355,0.981669,0.189891, + -0.184317,0.414270,-1.208727,-0.016355,0.981669,0.189891, + -0.352763,0.239456,-0.319506,-0.016355,0.981669,0.189891, + -0.184317,0.414270,-1.208727,-0.274149,0.952129,0.135250, + -0.701558,0.184567,-0.640105,-0.274149,0.952129,0.135250, + -0.352763,0.239456,-0.319506,-0.274149,0.952129,0.135250, + 0.012647,0.279427,-0.001417,0.643510,0.764978,0.026520, + -0.014225,0.327900,-0.747573,0.643510,0.764978,0.026520, + -0.280090,0.522819,0.081168,0.643510,0.764978,0.026520, + 0.012647,0.279427,-0.001417,-0.021286,0.997621,0.065575, + 0.344697,0.335558,-0.747576,-0.021286,0.997621,0.065575, + -0.014225,0.327900,-0.747573,-0.021286,0.997621,0.065575, + 0.344697,0.335558,-0.747576,-0.020912,0.979982,-0.197984, + 0.192628,0.247332,-1.168216,-0.020912,0.979982,-0.197984, + -0.014225,0.327900,-0.747573,-0.020912,0.979982,-0.197984 + ]; + + this.indices = [ + 0,1,2, + 3,4,5, + 6,7,8, + 9,10,11, + 12,13,14, + 15,16,17, + 18,19,20, + 21,22,23, + 24,25,26, + 27,28,29, + 30,31,32, + 33,34,35, + 36,37,38, + 39,40,41, + 42,43,44, + 45,46,47, + 48,49,50, + 51,52,53, + 54,55,56, + 57,58,59, + 60,61,62, + 63,64,65, + 66,67,68, + 69,70,71, + 72,73,74, + 75,76,77, + 78,79,80, + 81,82,83, + 84,85,86, + 87,88,89, + 90,91,92, + 93,94,95, + 96,97,98, + 99,100,101, + 102,103,104, + 105,106,107, + 108,109,110, + 111,112,113, + 114,115,116, + 117,118,119, + 120,121,122, + 123,124,125, + 126,127,128, + 129,130,131, + 132,133,134, + 135,136,137, + 138,139,140, + 141,142,143, + 144,145,146, + 147,148,149, + 150,151,152, + 153,154,155, + 156,157,158, + 159,160,161, + 162,163,164, + 165,166,167, + 168,169,170, + 171,172,173, + 174,175,176, + 177,178,179, + 180,181,182, + 183,184,185, + 186,187,188, + 189,190,191, + 192,193,194, + 195,196,197, + 198,199,200, + 201,202,203, + 204,205,206, + 207,208,209, + 210,211,212, + 213,214,215, + 216,217,218, + 219,220,221, + 222,223,224, + 225,226,227, + 228,229,230, + 231,232,233, + 234,235,236, + 237,238,239 + ]; + + this.InitBuffers(); + } +} \ No newline at end of file diff --git a/Abgabe_4/lightTODOs/index.html b/Abgabe_4/lightTODOs/index.html new file mode 100644 index 0000000..41c0afa --- /dev/null +++ b/Abgabe_4/lightTODOs/index.html @@ -0,0 +1,77 @@ + + + + + WebGL Example + + + + + + + + +

Lorem Ipsum

+ + + If you see this, your browser doesn't support WebGL. + + + + + diff --git a/Abgabe_4/lightTODOs/main.js b/Abgabe_4/lightTODOs/main.js new file mode 100644 index 0000000..da369b7 --- /dev/null +++ b/Abgabe_4/lightTODOs/main.js @@ -0,0 +1,205 @@ +let gl; +let program; + +let objects = []; + +let posLoc; + +// DONE: Deklariere benötigte Locations von Shadervariablen als globale Variablen +let normalLoc, + lightPositionLoc, + IaLoc, + IdLoc, + IsLoc, + kaLoc, + kdLoc, + ksLoc, + specularExponentLoc; + +let modelMatrixLoc; + +let viewMatrixLoc, + viewMatrix; + +let eye, + target, + up; + +let keyPressed = { + KeyW: false, + KeyA: false, + KeyS: false, + KeyD: false +}; + +const speed = 0.005; + + +function main() { + + // Get canvas and setup WebGL context + const canvas = document.getElementById("gl-canvas"); + gl = canvas.getContext('webgl2'); + + // Configure viewport + gl.viewport(0,0,canvas.width,canvas.height); + gl.clearColor(0.75,0.8,1.0,1.0); + + gl.enable(gl.DEPTH_TEST); + + // Init shader program via additional function and bind it + program = initShaders(gl, "vertex-shader", "fragment-shader"); + gl.useProgram(program); + + // Get locations of shader variables + posLoc = gl.getAttribLocation(program, "vPosition"); + modelMatrixLoc = gl.getUniformLocation(program, "modelMatrix"); + viewMatrixLoc = gl.getUniformLocation(program, "viewMatrix"); + + // DONE: Fülle globale Variablen mit Speicherlocations für Materialkoeffizienten und Lichtintensitäten + normalLoc = gl.getAttribLocation(program, "vNormal"); + lightPositionLoc = gl.getUniformLocation(program, "lightPosition"); + IaLoc = gl.getUniformLocation(program, "Ia"); + IdLoc = gl.getUniformLocation(program, "Id"); + IsLoc = gl.getUniformLocation(program, "Is"); + kaLoc = gl.getUniformLocation(program, "ka"); + kdLoc = gl.getUniformLocation(program, "kd"); + ksLoc = gl.getUniformLocation(program, "ks"); + specularExponentLoc = gl.getUniformLocation(program, "specExp"); + + eye = vec3.fromValues(0.0, 0.3, 4.0); + target = vec3.fromValues(0.0, 0.3, 0.0); + up = vec3.fromValues(0.0, 1.0, 0.0); + + viewMatrix = mat4.create(); + mat4.lookAt(viewMatrix, eye, target, up); + + gl.uniformMatrix4fv(viewMatrixLoc, false, viewMatrix); + + // DONE: Setze Position und Intensitäten der Lichtquelle als Uniform-Variablen + gl.uniform3fv(lightPositionLoc, [1.0, 2.0, 1.0]); + gl.uniform3fv(IaLoc, [0.3, 0.3, 0.3]); + gl.uniform3fv(IdLoc, [0.8, 0.8, 0.8]); + gl.uniform3fv(IsLoc, [0.7, 0.7, 0.7]); + + document.addEventListener("keydown", keydown); + document.addEventListener("keyup", keyup); + document.addEventListener("mousemove", changeView); + + canvas.onmousedown = function() { + canvas.requestPointerLock(); + } + + // Create object instances + let island = new Island(); + objects.push(island); + + let tree1 = new Tree(); + tree1.SetModelMatrix([1.3, 0, 0.6], [0, 45, 0], [0.3, 0.3, 0.3]); + objects.push(tree1); + + let tree2 = new Tree(); + tree2.SetModelMatrix([0.9, 0, 0.3], [0, 33, 0], [0.45, 0.45, 0.45]); + objects.push(tree2); + + let tree3 = new Tree(); + tree3.SetModelMatrix([0.45, 0, 0.75], [0, 0, 0], [0.4, 0.4, 0.4]); + objects.push(tree3); + + let tree4 = new Tree(); + tree4.SetModelMatrix([-1.1, 0, 0.5], [0, 222, 0], [0.42, 0.42, 0.42]); + objects.push(tree4); + + let tree5 = new Tree(); + tree5.SetModelMatrix([-0.65, 0, 0.7], [0, 79, 0], [0.32, 0.32, 0.32]); + objects.push(tree5); + + let cloud1 = new Cloud(); + cloud1.SetModelMatrix([-0.4, 1, -0.9], [0, 0, 0], [0.32, 0.32, 0.32]); + objects.push(cloud1); + + let cloud2 = new Cloud(); + cloud2.SetModelMatrix([0, 1.4, -1.6], [0, -90, 0], [0.2, 0.2, 0.2]); + objects.push(cloud2); + + let cloud3 = new Cloud(); + cloud3.SetModelMatrix([0.7, 0.9, -0.8], [0, 100, 0], [0.25, 0.25, 0.25]); + objects.push(cloud3); + + let river = new River(); + river.SetModelMatrix([0, 0.04, 1.8], [0, 185, 0], [0.11, 0.11, 0.11]); + objects.push(river); + + gameLoop(); +}; + +function update() +{ + let look = vec3.create(); + vec3.sub(look, target, eye); + vec3.scale(look, look, speed); + + if(keyPressed.KeyW) { + eye[0] += look[0]; + eye[2] += look[2]; + target[0] += look[0]; + target[2] += look[2]; + } + if(keyPressed.KeyS) { + eye[0] -= look[0]; + eye[2] -= look[2]; + target[0] -= look[0]; + target[2] -= look[2]; + } + if(keyPressed.KeyA) { + eye[0] += look[2]; + eye[2] -= look[0]; + target[0] += look[2]; + target[2] -= look[0]; + } + if(keyPressed.KeyD) { + eye[0] -= look[2]; + eye[2] += look[0]; + target[0] -= look[2]; + target[2] += look[0]; + } + mat4.lookAt(viewMatrix, eye, target, up); + gl.uniformMatrix4fv(viewMatrixLoc, false, viewMatrix); +} + +function render() { + + // Only clear once + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + // Call render function of each scene object + for(let object of objects) { + object.Render(); + }; +} + +function gameLoop() +{ + update(); + render(); + requestAnimationFrame(gameLoop); +} + +function keydown(e) +{ + keyPressed[e.code] = true; +} + +function keyup(e) +{ + keyPressed[e.code] = false; +} + +function changeView(e) +{ + vec3.rotateY(target, target, eye, -e.movementX * speed); + mat4.lookAt(viewMatrix, eye, target, up); + gl.uniformMatrix4fv(viewMatrixLoc, false, viewMatrix); +} + +main(); diff --git a/index.html b/index.html index d036eeb..b39da18 100644 --- a/index.html +++ b/index.html @@ -6,8 +6,10 @@ Übung_23112023/
+Übung_30112023/
Abgabe_3/
+Abgabe_4/
diff --git a/Übung_30112023/Insel/common/glMatrix.js b/Übung_30112023/Insel/common/glMatrix.js new file mode 100644 index 0000000..0799c59 --- /dev/null +++ b/Übung_30112023/Insel/common/glMatrix.js @@ -0,0 +1,7861 @@ + +/*! +@fileoverview gl-matrix - High performance matrix and vector operations +@author Brandon Jones +@author Colin MacKenzie IV +@version 3.4.0 + +Copyright (c) 2015-2021, Brandon Jones, Colin MacKenzie IV. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.glMatrix = {})); + })(this, (function (exports) { 'use strict'; + + /** + * Common utilities + * @module glMatrix + */ + // Configuration Constants + var EPSILON = 0.000001; + var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; + var RANDOM = Math.random; + var ANGLE_ORDER = "zyx"; + /** + * Sets the type of array used when creating new vectors and matrices + * + * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array + */ + + function setMatrixArrayType(type) { + ARRAY_TYPE = type; + } + var degree = Math.PI / 180; + /** + * Convert Degree To Radian + * + * @param {Number} a Angle in Degrees + */ + + function toRadian(a) { + return a * degree; + } + /** + * Tests whether or not the arguments have approximately the same value, within an absolute + * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less + * than or equal to 1.0, and a relative tolerance is used for larger values) + * + * @param {Number} a The first number to test. + * @param {Number} b The second number to test. + * @returns {Boolean} True if the numbers are approximately equal, false otherwise. + */ + + function equals$9(a, b) { + return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); + } + if (!Math.hypot) Math.hypot = function () { + var y = 0, + i = arguments.length; + + while (i--) { + y += arguments[i] * arguments[i]; + } + + return Math.sqrt(y); + }; + + var common = /*#__PURE__*/Object.freeze({ + __proto__: null, + EPSILON: EPSILON, + get ARRAY_TYPE () { return ARRAY_TYPE; }, + RANDOM: RANDOM, + ANGLE_ORDER: ANGLE_ORDER, + setMatrixArrayType: setMatrixArrayType, + toRadian: toRadian, + equals: equals$9 + }); + + /** + * 2x2 Matrix + * @module mat2 + */ + + /** + * Creates a new identity mat2 + * + * @returns {mat2} a new 2x2 matrix + */ + + function create$8() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + } + + out[0] = 1; + out[3] = 1; + return out; + } + /** + * Creates a new mat2 initialized with values from an existing matrix + * + * @param {ReadonlyMat2} a matrix to clone + * @returns {mat2} a new 2x2 matrix + */ + + function clone$8(a) { + var out = new ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + /** + * Copy the values from one mat2 to another + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + + function copy$8(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + /** + * Set a mat2 to the identity matrix + * + * @param {mat2} out the receiving matrix + * @returns {mat2} out + */ + + function identity$5(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } + /** + * Create a new mat2 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m10 Component in column 1, row 0 position (index 2) + * @param {Number} m11 Component in column 1, row 1 position (index 3) + * @returns {mat2} out A new 2x2 matrix + */ + + function fromValues$8(m00, m01, m10, m11) { + var out = new ARRAY_TYPE(4); + out[0] = m00; + out[1] = m01; + out[2] = m10; + out[3] = m11; + return out; + } + /** + * Set the components of a mat2 to the given values + * + * @param {mat2} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m10 Component in column 1, row 0 position (index 2) + * @param {Number} m11 Component in column 1, row 1 position (index 3) + * @returns {mat2} out + */ + + function set$8(out, m00, m01, m10, m11) { + out[0] = m00; + out[1] = m01; + out[2] = m10; + out[3] = m11; + return out; + } + /** + * Transpose the values of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + + function transpose$2(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache + // some values + if (out === a) { + var a1 = a[1]; + out[1] = a[2]; + out[2] = a1; + } else { + out[0] = a[0]; + out[1] = a[2]; + out[2] = a[1]; + out[3] = a[3]; + } + + return out; + } + /** + * Inverts a mat2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + + function invert$5(out, a) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; // Calculate the determinant + + var det = a0 * a3 - a2 * a1; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = a3 * det; + out[1] = -a1 * det; + out[2] = -a2 * det; + out[3] = a0 * det; + return out; + } + /** + * Calculates the adjugate of a mat2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + + function adjoint$2(out, a) { + // Caching this value is necessary if out == a + var a0 = a[0]; + out[0] = a[3]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a0; + return out; + } + /** + * Calculates the determinant of a mat2 + * + * @param {ReadonlyMat2} a the source matrix + * @returns {Number} determinant of a + */ + + function determinant$3(a) { + return a[0] * a[3] - a[2] * a[1]; + } + /** + * Multiplies two mat2's + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ + + function multiply$8(out, a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + return out; + } + /** + * Rotates a mat2 by the given angle + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ + + function rotate$4(out, a, rad) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var s = Math.sin(rad); + var c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + return out; + } + /** + * Scales the mat2 by the dimensions in the given vec2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to rotate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat2} out + **/ + + function scale$8(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + return out; + } + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.rotate(dest, dest, rad); + * + * @param {mat2} out mat2 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ + + function fromRotation$4(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + return out; + } + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.scale(dest, dest, vec); + * + * @param {mat2} out mat2 receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat2} out + */ + + function fromScaling$3(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + return out; + } + /** + * Returns a string representation of a mat2 + * + * @param {ReadonlyMat2} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + + function str$8(a) { + return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; + } + /** + * Returns Frobenius norm of a mat2 + * + * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + + function frob$3(a) { + return Math.hypot(a[0], a[1], a[2], a[3]); + } + /** + * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix + * @param {ReadonlyMat2} L the lower triangular matrix + * @param {ReadonlyMat2} D the diagonal matrix + * @param {ReadonlyMat2} U the upper triangular matrix + * @param {ReadonlyMat2} a the input matrix to factorize + */ + + function LDU(L, D, U, a) { + L[2] = a[2] / a[0]; + U[0] = a[0]; + U[1] = a[1]; + U[3] = a[3] - L[2] * U[1]; + return [L, D, U]; + } + /** + * Adds two mat2's + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ + + function add$8(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; + } + /** + * Subtracts matrix b from matrix a + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ + + function subtract$6(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; + } + /** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat2} a The first matrix. + * @param {ReadonlyMat2} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function exactEquals$8(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; + } + /** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat2} a The first matrix. + * @param {ReadonlyMat2} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function equals$8(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + } + /** + * Multiply each element of the matrix by a scalar. + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat2} out + */ + + function multiplyScalar$3(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; + } + /** + * Adds two mat2's after multiplying each element of the second operand by a scalar value. + * + * @param {mat2} out the receiving vector + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat2} out + */ + + function multiplyScalarAndAdd$3(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + return out; + } + /** + * Alias for {@link mat2.multiply} + * @function + */ + + var mul$8 = multiply$8; + /** + * Alias for {@link mat2.subtract} + * @function + */ + + var sub$6 = subtract$6; + + var mat2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$8, + clone: clone$8, + copy: copy$8, + identity: identity$5, + fromValues: fromValues$8, + set: set$8, + transpose: transpose$2, + invert: invert$5, + adjoint: adjoint$2, + determinant: determinant$3, + multiply: multiply$8, + rotate: rotate$4, + scale: scale$8, + fromRotation: fromRotation$4, + fromScaling: fromScaling$3, + str: str$8, + frob: frob$3, + LDU: LDU, + add: add$8, + subtract: subtract$6, + exactEquals: exactEquals$8, + equals: equals$8, + multiplyScalar: multiplyScalar$3, + multiplyScalarAndAdd: multiplyScalarAndAdd$3, + mul: mul$8, + sub: sub$6 + }); + + /** + * 2x3 Matrix + * @module mat2d + * @description + * A mat2d contains six elements defined as: + *
+     * [a, b,
+     *  c, d,
+     *  tx, ty]
+     * 
+ * This is a short form for the 3x3 matrix: + *
+     * [a, b, 0,
+     *  c, d, 0,
+     *  tx, ty, 1]
+     * 
+ * The last column is ignored so the array is shorter and operations are faster. + */ + + /** + * Creates a new identity mat2d + * + * @returns {mat2d} a new 2x3 matrix + */ + + function create$7() { + var out = new ARRAY_TYPE(6); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[4] = 0; + out[5] = 0; + } + + out[0] = 1; + out[3] = 1; + return out; + } + /** + * Creates a new mat2d initialized with values from an existing matrix + * + * @param {ReadonlyMat2d} a matrix to clone + * @returns {mat2d} a new 2x3 matrix + */ + + function clone$7(a) { + var out = new ARRAY_TYPE(6); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; + } + /** + * Copy the values from one mat2d to another + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the source matrix + * @returns {mat2d} out + */ + + function copy$7(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; + } + /** + * Set a mat2d to the identity matrix + * + * @param {mat2d} out the receiving matrix + * @returns {mat2d} out + */ + + function identity$4(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + /** + * Create a new mat2d with the given values + * + * @param {Number} a Component A (index 0) + * @param {Number} b Component B (index 1) + * @param {Number} c Component C (index 2) + * @param {Number} d Component D (index 3) + * @param {Number} tx Component TX (index 4) + * @param {Number} ty Component TY (index 5) + * @returns {mat2d} A new mat2d + */ + + function fromValues$7(a, b, c, d, tx, ty) { + var out = new ARRAY_TYPE(6); + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; + out[4] = tx; + out[5] = ty; + return out; + } + /** + * Set the components of a mat2d to the given values + * + * @param {mat2d} out the receiving matrix + * @param {Number} a Component A (index 0) + * @param {Number} b Component B (index 1) + * @param {Number} c Component C (index 2) + * @param {Number} d Component D (index 3) + * @param {Number} tx Component TX (index 4) + * @param {Number} ty Component TY (index 5) + * @returns {mat2d} out + */ + + function set$7(out, a, b, c, d, tx, ty) { + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; + out[4] = tx; + out[5] = ty; + return out; + } + /** + * Inverts a mat2d + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the source matrix + * @returns {mat2d} out + */ + + function invert$4(out, a) { + var aa = a[0], + ab = a[1], + ac = a[2], + ad = a[3]; + var atx = a[4], + aty = a[5]; + var det = aa * ad - ab * ac; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + /** + * Calculates the determinant of a mat2d + * + * @param {ReadonlyMat2d} a the source matrix + * @returns {Number} determinant of a + */ + + function determinant$2(a) { + return a[0] * a[3] - a[1] * a[2]; + } + /** + * Multiplies two mat2d's + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ + + function multiply$7(out, a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + out[4] = a0 * b4 + a2 * b5 + a4; + out[5] = a1 * b4 + a3 * b5 + a5; + return out; + } + /** + * Rotates a mat2d by the given angle + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ + + function rotate$3(out, a, rad) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var s = Math.sin(rad); + var c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + out[4] = a4; + out[5] = a5; + return out; + } + /** + * Scales the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to translate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat2d} out + **/ + + function scale$7(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + out[4] = a4; + out[5] = a5; + return out; + } + /** + * Translates the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to translate + * @param {ReadonlyVec2} v the vec2 to translate the matrix by + * @returns {mat2d} out + **/ + + function translate$3(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = a0 * v0 + a2 * v1 + a4; + out[5] = a1 * v0 + a3 * v1 + a5; + return out; + } + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.rotate(dest, dest, rad); + * + * @param {mat2d} out mat2d receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ + + function fromRotation$3(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + out[4] = 0; + out[5] = 0; + return out; + } + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.scale(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat2d} out + */ + + function fromScaling$2(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + out[4] = 0; + out[5] = 0; + return out; + } + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.translate(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {ReadonlyVec2} v Translation vector + * @returns {mat2d} out + */ + + function fromTranslation$3(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = v[0]; + out[5] = v[1]; + return out; + } + /** + * Returns a string representation of a mat2d + * + * @param {ReadonlyMat2d} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + + function str$7(a) { + return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"; + } + /** + * Returns Frobenius norm of a mat2d + * + * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + + function frob$2(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1); + } + /** + * Adds two mat2d's + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ + + function add$7(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + return out; + } + /** + * Subtracts matrix b from matrix a + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ + + function subtract$5(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + return out; + } + /** + * Multiply each element of the matrix by a scalar. + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat2d} out + */ + + function multiplyScalar$2(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + return out; + } + /** + * Adds two mat2d's after multiplying each element of the second operand by a scalar value. + * + * @param {mat2d} out the receiving vector + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat2d} out + */ + + function multiplyScalarAndAdd$2(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + return out; + } + /** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat2d} a The first matrix. + * @param {ReadonlyMat2d} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function exactEquals$7(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]; + } + /** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat2d} a The first matrix. + * @param {ReadonlyMat2d} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function equals$7(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); + } + /** + * Alias for {@link mat2d.multiply} + * @function + */ + + var mul$7 = multiply$7; + /** + * Alias for {@link mat2d.subtract} + * @function + */ + + var sub$5 = subtract$5; + + var mat2d = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$7, + clone: clone$7, + copy: copy$7, + identity: identity$4, + fromValues: fromValues$7, + set: set$7, + invert: invert$4, + determinant: determinant$2, + multiply: multiply$7, + rotate: rotate$3, + scale: scale$7, + translate: translate$3, + fromRotation: fromRotation$3, + fromScaling: fromScaling$2, + fromTranslation: fromTranslation$3, + str: str$7, + frob: frob$2, + add: add$7, + subtract: subtract$5, + multiplyScalar: multiplyScalar$2, + multiplyScalarAndAdd: multiplyScalarAndAdd$2, + exactEquals: exactEquals$7, + equals: equals$7, + mul: mul$7, + sub: sub$5 + }); + + /** + * 3x3 Matrix + * @module mat3 + */ + + /** + * Creates a new identity mat3 + * + * @returns {mat3} a new 3x3 matrix + */ + + function create$6() { + var out = new ARRAY_TYPE(9); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + } + + out[0] = 1; + out[4] = 1; + out[8] = 1; + return out; + } + /** + * Copies the upper-left 3x3 values into the given mat3. + * + * @param {mat3} out the receiving 3x3 matrix + * @param {ReadonlyMat4} a the source 4x4 matrix + * @returns {mat3} out + */ + + function fromMat4$1(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; + } + /** + * Creates a new mat3 initialized with values from an existing matrix + * + * @param {ReadonlyMat3} a matrix to clone + * @returns {mat3} a new 3x3 matrix + */ + + function clone$6(a) { + var out = new ARRAY_TYPE(9); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + } + /** + * Copy the values from one mat3 to another + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ + + function copy$6(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + } + /** + * Create a new mat3 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m10 Component in column 1, row 0 position (index 3) + * @param {Number} m11 Component in column 1, row 1 position (index 4) + * @param {Number} m12 Component in column 1, row 2 position (index 5) + * @param {Number} m20 Component in column 2, row 0 position (index 6) + * @param {Number} m21 Component in column 2, row 1 position (index 7) + * @param {Number} m22 Component in column 2, row 2 position (index 8) + * @returns {mat3} A new mat3 + */ + + function fromValues$6(m00, m01, m02, m10, m11, m12, m20, m21, m22) { + var out = new ARRAY_TYPE(9); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m10; + out[4] = m11; + out[5] = m12; + out[6] = m20; + out[7] = m21; + out[8] = m22; + return out; + } + /** + * Set the components of a mat3 to the given values + * + * @param {mat3} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m10 Component in column 1, row 0 position (index 3) + * @param {Number} m11 Component in column 1, row 1 position (index 4) + * @param {Number} m12 Component in column 1, row 2 position (index 5) + * @param {Number} m20 Component in column 2, row 0 position (index 6) + * @param {Number} m21 Component in column 2, row 1 position (index 7) + * @param {Number} m22 Component in column 2, row 2 position (index 8) + * @returns {mat3} out + */ + + function set$6(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m10; + out[4] = m11; + out[5] = m12; + out[6] = m20; + out[7] = m21; + out[8] = m22; + return out; + } + /** + * Set a mat3 to the identity matrix + * + * @param {mat3} out the receiving matrix + * @returns {mat3} out + */ + + function identity$3(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + } + /** + * Transpose the values of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ + + function transpose$1(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + } else { + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a[1]; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a[2]; + out[7] = a[5]; + out[8] = a[8]; + } + + return out; + } + /** + * Inverts a mat3 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ + + function invert$3(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + var b01 = a22 * a11 - a12 * a21; + var b11 = -a22 * a10 + a12 * a20; + var b21 = a21 * a10 - a11 * a20; // Calculate the determinant + + var det = a00 * b01 + a01 * b11 + a02 * b21; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = b01 * det; + out[1] = (-a22 * a01 + a02 * a21) * det; + out[2] = (a12 * a01 - a02 * a11) * det; + out[3] = b11 * det; + out[4] = (a22 * a00 - a02 * a20) * det; + out[5] = (-a12 * a00 + a02 * a10) * det; + out[6] = b21 * det; + out[7] = (-a21 * a00 + a01 * a20) * det; + out[8] = (a11 * a00 - a01 * a10) * det; + return out; + } + /** + * Calculates the adjugate of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ + + function adjoint$1(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + out[0] = a11 * a22 - a12 * a21; + out[1] = a02 * a21 - a01 * a22; + out[2] = a01 * a12 - a02 * a11; + out[3] = a12 * a20 - a10 * a22; + out[4] = a00 * a22 - a02 * a20; + out[5] = a02 * a10 - a00 * a12; + out[6] = a10 * a21 - a11 * a20; + out[7] = a01 * a20 - a00 * a21; + out[8] = a00 * a11 - a01 * a10; + return out; + } + /** + * Calculates the determinant of a mat3 + * + * @param {ReadonlyMat3} a the source matrix + * @returns {Number} determinant of a + */ + + function determinant$1(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); + } + /** + * Multiplies two mat3's + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out + */ + + function multiply$6(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + var b00 = b[0], + b01 = b[1], + b02 = b[2]; + var b10 = b[3], + b11 = b[4], + b12 = b[5]; + var b20 = b[6], + b21 = b[7], + b22 = b[8]; + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b00 * a02 + b01 * a12 + b02 * a22; + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b10 * a02 + b11 * a12 + b12 * a22; + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b20 * a02 + b21 * a12 + b22 * a22; + return out; + } + /** + * Translate a mat3 by the given vector + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to translate + * @param {ReadonlyVec2} v vector to translate by + * @returns {mat3} out + */ + + function translate$2(out, a, v) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a10 = a[3], + a11 = a[4], + a12 = a[5], + a20 = a[6], + a21 = a[7], + a22 = a[8], + x = v[0], + y = v[1]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a10; + out[4] = a11; + out[5] = a12; + out[6] = x * a00 + y * a10 + a20; + out[7] = x * a01 + y * a11 + a21; + out[8] = x * a02 + y * a12 + a22; + return out; + } + /** + * Rotates a mat3 by the given angle + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ + + function rotate$2(out, a, rad) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a10 = a[3], + a11 = a[4], + a12 = a[5], + a20 = a[6], + a21 = a[7], + a22 = a[8], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c * a00 + s * a10; + out[1] = c * a01 + s * a11; + out[2] = c * a02 + s * a12; + out[3] = c * a10 - s * a00; + out[4] = c * a11 - s * a01; + out[5] = c * a12 - s * a02; + out[6] = a20; + out[7] = a21; + out[8] = a22; + return out; + } + /** + * Scales the mat3 by the dimensions in the given vec2 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to rotate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat3} out + **/ + + function scale$6(out, a, v) { + var x = v[0], + y = v[1]; + out[0] = x * a[0]; + out[1] = x * a[1]; + out[2] = x * a[2]; + out[3] = y * a[3]; + out[4] = y * a[4]; + out[5] = y * a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; + } + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.translate(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyVec2} v Translation vector + * @returns {mat3} out + */ + + function fromTranslation$2(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = v[0]; + out[7] = v[1]; + out[8] = 1; + return out; + } + /** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.rotate(dest, dest, rad); + * + * @param {mat3} out mat3 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out + */ + + function fromRotation$2(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = -s; + out[4] = c; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + } + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.scale(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat3} out + */ + + function fromScaling$1(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = v[1]; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; + } + /** + * Copies the values from a mat2d into a mat3 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to copy + * @returns {mat3} out + **/ + + function fromMat2d(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = 0; + out[3] = a[2]; + out[4] = a[3]; + out[5] = 0; + out[6] = a[4]; + out[7] = a[5]; + out[8] = 1; + return out; + } + /** + * Calculates a 3x3 matrix from the given quaternion + * + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat3} out + */ + + function fromQuat$1(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[3] = yx - wz; + out[6] = zx + wy; + out[1] = yx + wz; + out[4] = 1 - xx - zz; + out[7] = zy - wx; + out[2] = zx - wy; + out[5] = zy + wx; + out[8] = 1 - xx - yy; + return out; + } + /** + * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix + * + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from + * + * @returns {mat3} out + */ + + function normalFromMat4(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[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; // Calculate the determinant + + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + return out; + } + /** + * Generates a 2D projection matrix with the given bounds + * + * @param {mat3} out mat3 frustum matrix will be written into + * @param {number} width Width of your gl context + * @param {number} height Height of gl context + * @returns {mat3} out + */ + + function projection(out, width, height) { + out[0] = 2 / width; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = -2 / height; + out[5] = 0; + out[6] = -1; + out[7] = 1; + out[8] = 1; + return out; + } + /** + * Returns a string representation of a mat3 + * + * @param {ReadonlyMat3} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + + function str$6(a) { + return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"; + } + /** + * Returns Frobenius norm of a mat3 + * + * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + + function frob$1(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); + } + /** + * Adds two mat3's + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out + */ + + function add$6(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + return out; + } + /** + * Subtracts matrix b from matrix a + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out + */ + + function subtract$4(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + return out; + } + /** + * Multiply each element of the matrix by a scalar. + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat3} out + */ + + function multiplyScalar$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + return out; + } + /** + * Adds two mat3's after multiplying each element of the second operand by a scalar value. + * + * @param {mat3} out the receiving vector + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat3} out + */ + + function multiplyScalarAndAdd$1(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + return out; + } + /** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat3} a The first matrix. + * @param {ReadonlyMat3} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function exactEquals$6(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; + } + /** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat3} a The first matrix. + * @param {ReadonlyMat3} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function equals$6(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7], + a8 = a[8]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); + } + /** + * Alias for {@link mat3.multiply} + * @function + */ + + var mul$6 = multiply$6; + /** + * Alias for {@link mat3.subtract} + * @function + */ + + var sub$4 = subtract$4; + + var mat3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$6, + fromMat4: fromMat4$1, + clone: clone$6, + copy: copy$6, + fromValues: fromValues$6, + set: set$6, + identity: identity$3, + transpose: transpose$1, + invert: invert$3, + adjoint: adjoint$1, + determinant: determinant$1, + multiply: multiply$6, + translate: translate$2, + rotate: rotate$2, + scale: scale$6, + fromTranslation: fromTranslation$2, + fromRotation: fromRotation$2, + fromScaling: fromScaling$1, + fromMat2d: fromMat2d, + fromQuat: fromQuat$1, + normalFromMat4: normalFromMat4, + projection: projection, + str: str$6, + frob: frob$1, + add: add$6, + subtract: subtract$4, + multiplyScalar: multiplyScalar$1, + multiplyScalarAndAdd: multiplyScalarAndAdd$1, + exactEquals: exactEquals$6, + equals: equals$6, + mul: mul$6, + sub: sub$4 + }); + + /** + * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. + * @module mat4 + */ + + /** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ + + function create$5() { + var out = new ARRAY_TYPE(16); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + } + + out[0] = 1; + out[5] = 1; + out[10] = 1; + out[15] = 1; + return out; + } + /** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {ReadonlyMat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ + + function clone$5(a) { + var out = new ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Copy the values from one mat4 to another + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function copy$5(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Create a new mat4 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} A new mat4 + */ + + function fromValues$5(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + var out = new ARRAY_TYPE(16); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; + } + /** + * Set the components of a mat4 to the given values + * + * @param {mat4} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} out + */ + + function set$5(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; + } + /** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ + + function identity$2(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function transpose(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; + } + /** + * Inverts a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function invert$2(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[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; // Calculate the determinant + + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; + } + /** + * Calculates the adjugate of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function adjoint(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[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; + out[0] = a11 * b11 - a12 * b10 + a13 * b09; + out[1] = a02 * b10 - a01 * b11 - a03 * b09; + out[2] = a31 * b05 - a32 * b04 + a33 * b03; + out[3] = a22 * b04 - a21 * b05 - a23 * b03; + out[4] = a12 * b08 - a10 * b11 - a13 * b07; + out[5] = a00 * b11 - a02 * b08 + a03 * b07; + out[6] = a32 * b02 - a30 * b05 - a33 * b01; + out[7] = a20 * b05 - a22 * b02 + a23 * b01; + out[8] = a10 * b10 - a11 * b08 + a13 * b06; + out[9] = a01 * b08 - a00 * b10 - a03 * b06; + out[10] = a30 * b04 - a31 * b02 + a33 * b00; + out[11] = a21 * b02 - a20 * b04 - a23 * b00; + out[12] = a11 * b07 - a10 * b09 - a12 * b06; + out[13] = a00 * b09 - a01 * b07 + a02 * b06; + out[14] = a31 * b01 - a30 * b03 - a32 * b00; + out[15] = a20 * b03 - a21 * b01 + a22 * b00; + return out; + } + /** + * Calculates the determinant of a mat4 + * + * @param {ReadonlyMat4} a the source matrix + * @returns {Number} determinant of a + */ + + function determinant(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b0 = a00 * a11 - a01 * a10; + var b1 = a00 * a12 - a02 * a10; + var b2 = a01 * a12 - a02 * a11; + var b3 = a20 * a31 - a21 * a30; + var b4 = a20 * a32 - a22 * a30; + var b5 = a21 * a32 - a22 * a31; + var b6 = a00 * b5 - a01 * b4 + a02 * b3; + var b7 = a10 * b5 - a11 * b4 + a12 * b3; + var b8 = a20 * b2 - a21 * b1 + a22 * b0; + var b9 = a30 * b2 - a31 * b1 + a32 * b0; // Calculate the determinant + + return a13 * b6 - a03 * b7 + a33 * b8 - a23 * b9; + } + /** + * Multiplies two mat4s + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function multiply$5(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; // Cache only the current line of the second matrix + + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; + } + /** + * Translate a mat4 by the given vector + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {mat4} out + */ + + function translate$1(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a03; + out[4] = a10; + out[5] = a11; + out[6] = a12; + out[7] = a13; + out[8] = a20; + out[9] = a21; + out[10] = a22; + out[11] = a23; + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; + } + /** + * Scales the mat4 by the dimensions in the given vec3 not using vectorization + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {ReadonlyVec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ + + function scale$5(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Rotates a mat4 by the given angle around the given axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + + function rotate$1(out, a, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + var b00, b01, b02; + var b10, b11, b12; + var b20, b21, b22; + + if (len < EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; // Construct the elements of the rotation matrix + + b00 = x * x * t + c; + b01 = y * x * t + z * s; + b02 = z * x * t - y * s; + b10 = x * y * t - z * s; + b11 = y * y * t + c; + b12 = z * y * t + x * s; + b20 = x * z * t + y * s; + b21 = y * z * t - x * s; + b22 = z * z * t + c; // Perform rotation-specific matrix multiplication + + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + return out; + } + /** + * Rotates a matrix by the given angle around the X axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateX$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; + } + /** + * Rotates a matrix by the given angle around the Y axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateY$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; + } + /** + * Rotates a matrix by the given angle around the Z axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateZ$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; + } + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + + function fromTranslation$1(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Scaling vector + * @returns {mat4} out + */ + + function fromScaling(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + + function fromRotation$1(out, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + + if (len < EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; // Perform rotation-specific matrix multiplication + + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromXRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromYRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromZRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + + function fromRotationTranslation$1(out, q, v) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + 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; + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a new mat4 from a dual quat. + * + * @param {mat4} out Matrix + * @param {ReadonlyQuat2} a Dual Quaternion + * @returns {mat4} mat4 receiving operation result + */ + + function fromQuat2(out, a) { + var translation = new ARRAY_TYPE(3); + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense + + if (magnitude > 0) { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; + } else { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + } + + fromRotationTranslation$1(out, a, translation); + return out; + } + /** + * Returns the translation vector component of a transformation + * matrix. If a matrix is built with fromRotationTranslation, + * the returned vector will be the same as the translation vector + * originally supplied. + * @param {vec3} out Vector to receive translation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + + function getTranslation$1(out, mat) { + out[0] = mat[12]; + out[1] = mat[13]; + out[2] = mat[14]; + return out; + } + /** + * Returns the scaling factor component of a transformation + * matrix. If a matrix is built with fromRotationTranslationScale + * with a normalized Quaternion paramter, the returned vector will be + * the same as the scaling vector + * originally supplied. + * @param {vec3} out Vector to receive scaling factor component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + + function getScaling(out, mat) { + var m11 = mat[0]; + var m12 = mat[1]; + var m13 = mat[2]; + var m21 = mat[4]; + var m22 = mat[5]; + var m23 = mat[6]; + var m31 = mat[8]; + var m32 = mat[9]; + var m33 = mat[10]; + out[0] = Math.hypot(m11, m12, m13); + out[1] = Math.hypot(m21, m22, m23); + out[2] = Math.hypot(m31, m32, m33); + return out; + } + /** + * Returns a quaternion representing the rotational component + * of a transformation matrix. If a matrix is built with + * fromRotationTranslation, the returned quaternion will be the + * same as the quaternion originally supplied. + * @param {quat} out Quaternion to receive the rotation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {quat} out + */ + + function getRotation(out, mat) { + var scaling = new ARRAY_TYPE(3); + getScaling(scaling, mat); + var is1 = 1 / scaling[0]; + var is2 = 1 / scaling[1]; + var is3 = 1 / scaling[2]; + var sm11 = mat[0] * is1; + var sm12 = mat[1] * is2; + var sm13 = mat[2] * is3; + var sm21 = mat[4] * is1; + var sm22 = mat[5] * is2; + var sm23 = mat[6] * is3; + var sm31 = mat[8] * is1; + var sm32 = mat[9] * is2; + var sm33 = mat[10] * is3; + var trace = sm11 + sm22 + sm33; + var S = 0; + + if (trace > 0) { + S = Math.sqrt(trace + 1.0) * 2; + out[3] = 0.25 * S; + out[0] = (sm23 - sm32) / S; + out[1] = (sm31 - sm13) / S; + out[2] = (sm12 - sm21) / S; + } else if (sm11 > sm22 && sm11 > sm33) { + S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; + out[3] = (sm23 - sm32) / S; + out[0] = 0.25 * S; + out[1] = (sm12 + sm21) / S; + out[2] = (sm31 + sm13) / S; + } else if (sm22 > sm33) { + S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; + out[3] = (sm31 - sm13) / S; + out[0] = (sm12 + sm21) / S; + out[1] = 0.25 * S; + out[2] = (sm23 + sm32) / S; + } else { + S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; + out[3] = (sm12 - sm21) / S; + out[0] = (sm31 + sm13) / S; + out[1] = (sm23 + sm32) / S; + out[2] = 0.25 * S; + } + + return out; + } + /** + * Decomposes a transformation matrix into its rotation, translation + * and scale components. Returns only the rotation component + * @param {quat} out_r Quaternion to receive the rotation component + * @param {vec3} out_t Vector to receive the translation vector + * @param {vec3} out_s Vector to receive the scaling factor + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @returns {quat} out_r + */ + + function decompose(out_r, out_t, out_s, mat) { + out_t[0] = mat[12]; + out_t[1] = mat[13]; + out_t[2] = mat[14]; + var m11 = mat[0]; + var m12 = mat[1]; + var m13 = mat[2]; + var m21 = mat[4]; + var m22 = mat[5]; + var m23 = mat[6]; + var m31 = mat[8]; + var m32 = mat[9]; + var m33 = mat[10]; + out_s[0] = Math.hypot(m11, m12, m13); + out_s[1] = Math.hypot(m21, m22, m23); + out_s[2] = Math.hypot(m31, m32, m33); + var is1 = 1 / out_s[0]; + var is2 = 1 / out_s[1]; + var is3 = 1 / out_s[2]; + var sm11 = m11 * is1; + var sm12 = m12 * is2; + var sm13 = m13 * is3; + var sm21 = m21 * is1; + var sm22 = m22 * is2; + var sm23 = m23 * is3; + var sm31 = m31 * is1; + var sm32 = m32 * is2; + var sm33 = m33 * is3; + var trace = sm11 + sm22 + sm33; + var S = 0; + + if (trace > 0) { + S = Math.sqrt(trace + 1.0) * 2; + out_r[3] = 0.25 * S; + out_r[0] = (sm23 - sm32) / S; + out_r[1] = (sm31 - sm13) / S; + out_r[2] = (sm12 - sm21) / S; + } else if (sm11 > sm22 && sm11 > sm33) { + S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; + out_r[3] = (sm23 - sm32) / S; + out_r[0] = 0.25 * S; + out_r[1] = (sm12 + sm21) / S; + out_r[2] = (sm31 + sm13) / S; + } else if (sm22 > sm33) { + S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; + out_r[3] = (sm31 - sm13) / S; + out_r[0] = (sm12 + sm21) / S; + out_r[1] = 0.25 * S; + out_r[2] = (sm23 + sm32) / S; + } else { + S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; + out_r[3] = (sm12 - sm21) / S; + out_r[0] = (sm31 + sm13) / S; + out_r[1] = (sm23 + sm32) / S; + out_r[2] = 0.25 * S; + } + + return out_r; + } + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @returns {mat4} out + */ + + function fromRotationTranslationScale(out, q, v, s) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + 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; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @param {ReadonlyVec3} o The origin vector around which to scale and rotate + * @returns {mat4} out + */ + + function fromRotationTranslationScaleOrigin(out, q, v, s, o) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + 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; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + var ox = o[0]; + var oy = o[1]; + var oz = o[2]; + var out0 = (1 - (yy + zz)) * sx; + var out1 = (xy + wz) * sx; + var out2 = (xz - wy) * sx; + var out4 = (xy - wz) * sy; + var out5 = (1 - (xx + zz)) * sy; + var out6 = (yz + wx) * sy; + var out8 = (xz + wy) * sz; + var out9 = (yz - wx) * sz; + var out10 = (1 - (xx + yy)) * sz; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = 0; + out[4] = out4; + out[5] = out5; + out[6] = out6; + out[7] = 0; + out[8] = out8; + out[9] = out9; + out[10] = out10; + out[11] = 0; + out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); + out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); + out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); + out[15] = 1; + return out; + } + /** + * Calculates a 4x4 matrix from the given quaternion + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat4} out + */ + + function fromQuat(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out + */ + + function frustum(out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left); + var tb = 1 / (top - bottom); + var nf = 1 / (near - far); + out[0] = near * 2 * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = near * 2 * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = far * near * 2 * nf; + out[15] = 0; + return out; + } + /** + * Generates a perspective projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out + */ + + function perspectiveNO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2); + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + var nf = 1 / (near - far); + out[10] = (far + near) * nf; + out[14] = 2 * far * near * nf; + } else { + out[10] = -1; + out[14] = -2 * near; + } + + return out; + } + /** + * Alias for {@link mat4.perspectiveNO} + * @function + */ + + var perspective = perspectiveNO; + /** + * Generates a perspective projection matrix suitable for WebGPU with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out + */ + + function perspectiveZO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2); + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + var nf = 1 / (near - far); + out[10] = far * nf; + out[14] = far * near * nf; + } else { + out[10] = -1; + out[14] = -near; + } + + return out; + } + /** + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function perspectiveFromFieldOfView(out, fov, near, far) { + var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); + var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); + var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); + var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); + var xScale = 2.0 / (leftTan + rightTan); + var yScale = 2.0 / (upTan + downTan); + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = (upTan - downTan) * yScale * 0.5; + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = far * near / (near - far); + out[15] = 0.0; + return out; + } + /** + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function orthoNO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; + } + /** + * Alias for {@link mat4.orthoNO} + * @function + */ + + var ortho = orthoNO; + /** + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function orthoZO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = near * nf; + out[15] = 1; + return out; + } + /** + * Generates a look-at matrix with the given eye position, focal point, and up axis. + * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + + function lookAt(out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; + var eyex = eye[0]; + var eyey = eye[1]; + var eyez = eye[2]; + var upx = up[0]; + var upy = up[1]; + var upz = up[2]; + var centerx = center[0]; + var centery = center[1]; + var centerz = center[2]; + + if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { + return identity$2(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + len = 1 / Math.hypot(z0, z1, z2); + z0 *= len; + z1 *= len; + z2 *= len; + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.hypot(x0, x1, x2); + + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + len = Math.hypot(y0, y1, y2); + + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + return out; + } + /** + * Generates a matrix that makes something look at something else. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + + function targetTo(out, eye, target, up) { + var eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2]; + var z0 = eyex - target[0], + z1 = eyey - target[1], + z2 = eyez - target[2]; + var len = z0 * z0 + z1 * z1 + z2 * z2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + z0 *= len; + z1 *= len; + z2 *= len; + } + + var x0 = upy * z2 - upz * z1, + x1 = upz * z0 - upx * z2, + x2 = upx * z1 - upy * z0; + len = x0 * x0 + x1 * x1 + x2 * x2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + x0 *= len; + x1 *= len; + x2 *= len; + } + + out[0] = x0; + out[1] = x1; + out[2] = x2; + out[3] = 0; + out[4] = z1 * x2 - z2 * x1; + out[5] = z2 * x0 - z0 * x2; + out[6] = z0 * x1 - z1 * x0; + out[7] = 0; + out[8] = z0; + out[9] = z1; + out[10] = z2; + out[11] = 0; + out[12] = eyex; + out[13] = eyey; + out[14] = eyez; + out[15] = 1; + return out; + } + /** + * Returns a string representation of a mat4 + * + * @param {ReadonlyMat4} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + + function str$5(a) { + return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; + } + /** + * Returns Frobenius norm of a mat4 + * + * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + + function frob(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); + } + /** + * Adds two mat4's + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function add$5(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + out[9] = a[9] + b[9]; + out[10] = a[10] + b[10]; + out[11] = a[11] + b[11]; + out[12] = a[12] + b[12]; + out[13] = a[13] + b[13]; + out[14] = a[14] + b[14]; + out[15] = a[15] + b[15]; + return out; + } + /** + * Subtracts matrix b from matrix a + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function subtract$3(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + out[9] = a[9] - b[9]; + out[10] = a[10] - b[10]; + out[11] = a[11] - b[11]; + out[12] = a[12] - b[12]; + out[13] = a[13] - b[13]; + out[14] = a[14] - b[14]; + out[15] = a[15] - b[15]; + return out; + } + /** + * Multiply each element of the matrix by a scalar. + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat4} out + */ + + function multiplyScalar(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + out[9] = a[9] * b; + out[10] = a[10] * b; + out[11] = a[11] * b; + out[12] = a[12] * b; + out[13] = a[13] * b; + out[14] = a[14] * b; + out[15] = a[15] * b; + return out; + } + /** + * Adds two mat4's after multiplying each element of the second operand by a scalar value. + * + * @param {mat4} out the receiving vector + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat4} out + */ + + function multiplyScalarAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + out[9] = a[9] + b[9] * scale; + out[10] = a[10] + b[10] * scale; + out[11] = a[11] + b[11] * scale; + out[12] = a[12] + b[12] * scale; + out[13] = a[13] + b[13] * scale; + out[14] = a[14] + b[14] * scale; + out[15] = a[15] + b[15] * scale; + return out; + } + /** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function exactEquals$5(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; + } + /** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function equals$5(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var a8 = a[8], + a9 = a[9], + a10 = a[10], + a11 = a[11]; + var a12 = a[12], + a13 = a[13], + a14 = a[14], + a15 = a[15]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + var b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + var b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11]; + var b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); + } + /** + * Alias for {@link mat4.multiply} + * @function + */ + + var mul$5 = multiply$5; + /** + * Alias for {@link mat4.subtract} + * @function + */ + + var sub$3 = subtract$3; + + var mat4 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$5, + clone: clone$5, + copy: copy$5, + fromValues: fromValues$5, + set: set$5, + identity: identity$2, + transpose: transpose, + invert: invert$2, + adjoint: adjoint, + determinant: determinant, + multiply: multiply$5, + translate: translate$1, + scale: scale$5, + rotate: rotate$1, + rotateX: rotateX$3, + rotateY: rotateY$3, + rotateZ: rotateZ$3, + fromTranslation: fromTranslation$1, + fromScaling: fromScaling, + fromRotation: fromRotation$1, + fromXRotation: fromXRotation, + fromYRotation: fromYRotation, + fromZRotation: fromZRotation, + fromRotationTranslation: fromRotationTranslation$1, + fromQuat2: fromQuat2, + getTranslation: getTranslation$1, + getScaling: getScaling, + getRotation: getRotation, + decompose: decompose, + fromRotationTranslationScale: fromRotationTranslationScale, + fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin, + fromQuat: fromQuat, + frustum: frustum, + perspectiveNO: perspectiveNO, + perspective: perspective, + perspectiveZO: perspectiveZO, + perspectiveFromFieldOfView: perspectiveFromFieldOfView, + orthoNO: orthoNO, + ortho: ortho, + orthoZO: orthoZO, + lookAt: lookAt, + targetTo: targetTo, + str: str$5, + frob: frob, + add: add$5, + subtract: subtract$3, + multiplyScalar: multiplyScalar, + multiplyScalarAndAdd: multiplyScalarAndAdd, + exactEquals: exactEquals$5, + equals: equals$5, + mul: mul$5, + sub: sub$3 + }); + + /** + * 3 Dimensional Vector + * @module vec3 + */ + + /** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ + + function create$4() { + var out = new ARRAY_TYPE(3); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + + return out; + } + /** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {ReadonlyVec3} a vector to clone + * @returns {vec3} a new 3D vector + */ + + function clone$4(a) { + var out = new ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + } + /** + * Calculates the length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate length of + * @returns {Number} length of a + */ + + function length$4(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return Math.hypot(x, y, z); + } + /** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ + + function fromValues$4(x, y, z) { + var out = new ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; + } + /** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the source vector + * @returns {vec3} out + */ + + function copy$4(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + } + /** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ + + function set$4(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; + } + /** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function add$4(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; + } + /** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function subtract$2(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; + } + /** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function multiply$4(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; + } + /** + * Divides two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function divide$2(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; + } + /** + * Math.ceil the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to ceil + * @returns {vec3} out + */ + + function ceil$2(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + return out; + } + /** + * Math.floor the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to floor + * @returns {vec3} out + */ + + function floor$2(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + return out; + } + /** + * Returns the minimum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function min$2(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + return out; + } + /** + * Returns the maximum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function max$2(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + return out; + } + /** + * Math.round the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to round + * @returns {vec3} out + */ + + function round$2(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + return out; + } + /** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ + + function scale$4(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; + } + /** + * Adds two vec3's after scaling the second operand by a scalar value + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec3} out + */ + + function scaleAndAdd$2(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + return out; + } + /** + * Calculates the euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} distance between a and b + */ + + function distance$2(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return Math.hypot(x, y, z); + } + /** + * Calculates the squared euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} squared distance between a and b + */ + + function squaredDistance$2(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return x * x + y * y + z * z; + } + /** + * Calculates the squared length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + + function squaredLength$4(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return x * x + y * y + z * z; + } + /** + * Negates the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to negate + * @returns {vec3} out + */ + + function negate$2(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + return out; + } + /** + * Returns the inverse of the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to invert + * @returns {vec3} out + */ + + function inverse$2(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + return out; + } + /** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to normalize + * @returns {vec3} out + */ + + function normalize$4(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var len = x * x + y * y + z * z; + + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } + + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + return out; + } + /** + * Calculates the dot product of two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} dot product of a and b + */ + + function dot$4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + /** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function cross$2(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2]; + var bx = b[0], + by = b[1], + bz = b[2]; + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; + } + /** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + + function lerp$4(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; + } + /** + * Performs a spherical linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + + function slerp$1(out, a, b, t) { + var angle = Math.acos(Math.min(Math.max(dot$4(a, b), -1), 1)); + var sinTotal = Math.sin(angle); + var ratioA = Math.sin((1 - t) * angle) / sinTotal; + var ratioB = Math.sin(t * angle) / sinTotal; + out[0] = ratioA * a[0] + ratioB * b[0]; + out[1] = ratioA * a[1] + ratioB * b[1]; + out[2] = ratioA * a[2] + ratioB * b[2]; + return out; + } + /** + * Performs a hermite interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + + function hermite(out, a, b, c, d, t) { + var factorTimes2 = t * t; + var factor1 = factorTimes2 * (2 * t - 3) + 1; + var factor2 = factorTimes2 * (t - 2) + t; + var factor3 = factorTimes2 * (t - 1); + var factor4 = factorTimes2 * (3 - 2 * t); + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; + } + /** + * Performs a bezier interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + + function bezier(out, a, b, c, d, t) { + var inverseFactor = 1 - t; + var inverseFactorTimesTwo = inverseFactor * inverseFactor; + var factorTimes2 = t * t; + var factor1 = inverseFactorTimesTwo * inverseFactor; + var factor2 = 3 * t * inverseFactorTimesTwo; + var factor3 = 3 * factorTimes2 * inverseFactor; + var factor4 = factorTimes2 * t; + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; + } + /** + * Generates a random vector with the given scale + * + * @param {vec3} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned + * @returns {vec3} out + */ + + function random$3(out, scale) { + scale = scale === undefined ? 1.0 : scale; + var r = RANDOM() * 2.0 * Math.PI; + var z = RANDOM() * 2.0 - 1.0; + var zScale = Math.sqrt(1.0 - z * z) * scale; + out[0] = Math.cos(r) * zScale; + out[1] = Math.sin(r) * zScale; + out[2] = z * scale; + return out; + } + /** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec3} out + */ + + function transformMat4$2(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + var w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; + } + /** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat3} m the 3x3 matrix to transform with + * @returns {vec3} out + */ + + function transformMat3$1(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; + } + /** + * Transforms the vec3 with a quat + * Can also be used for dual quaternions. (Multiply it with the real part) + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec3} out + */ + + function transformQuat$1(out, a, q) { + // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; + var x = a[0], + y = a[1], + z = a[2]; // var qvec = [qx, qy, qz]; + // var uv = vec3.cross([], qvec, a); + + var uvx = qy * z - qz * y, + uvy = qz * x - qx * z, + uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); + + var uuvx = qy * uvz - qz * uvy, + uuvy = qz * uvx - qx * uvz, + uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); + + var w2 = qw * 2; + uvx *= w2; + uvy *= w2; + uvz *= w2; // vec3.scale(uuv, uuv, 2); + + uuvx *= 2; + uuvy *= 2; + uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); + + out[0] = x + uvx + uuvx; + out[1] = y + uvy + uuvy; + out[2] = z + uvz + uuvz; + return out; + } + /** + * Rotate a 3D vector around the x-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + + function rotateX$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[0]; + r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); + r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; + } + /** + * Rotate a 3D vector around the y-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + + function rotateY$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); + r[1] = p[1]; + r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; + } + /** + * Rotate a 3D vector around the z-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + + function rotateZ$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); + r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); + r[2] = p[2]; //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; + } + /** + * Get the angle between two 3D vectors + * @param {ReadonlyVec3} a The first operand + * @param {ReadonlyVec3} b The second operand + * @returns {Number} The angle in radians + */ + + function angle$1(a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + bx = b[0], + by = b[1], + bz = b[2], + mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)), + cosine = mag && dot$4(a, b) / mag; + return Math.acos(Math.min(Math.max(cosine, -1), 1)); + } + /** + * Set the components of a vec3 to zero + * + * @param {vec3} out the receiving vector + * @returns {vec3} out + */ + + function zero$2(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + return out; + } + /** + * Returns a string representation of a vector + * + * @param {ReadonlyVec3} a vector to represent as a string + * @returns {String} string representation of the vector + */ + + function str$4(a) { + return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; + } + /** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function exactEquals$4(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; + } + /** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function equals$4(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2]; + var b0 = b[0], + b1 = b[1], + b2 = b[2]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); + } + /** + * Alias for {@link vec3.subtract} + * @function + */ + + var sub$2 = subtract$2; + /** + * Alias for {@link vec3.multiply} + * @function + */ + + var mul$4 = multiply$4; + /** + * Alias for {@link vec3.divide} + * @function + */ + + var div$2 = divide$2; + /** + * Alias for {@link vec3.distance} + * @function + */ + + var dist$2 = distance$2; + /** + * Alias for {@link vec3.squaredDistance} + * @function + */ + + var sqrDist$2 = squaredDistance$2; + /** + * Alias for {@link vec3.length} + * @function + */ + + var len$4 = length$4; + /** + * Alias for {@link vec3.squaredLength} + * @function + */ + + var sqrLen$4 = squaredLength$4; + /** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach$2 = function () { + var vec = create$4(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 3; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + } + + return a; + }; + }(); + + var vec3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$4, + clone: clone$4, + length: length$4, + fromValues: fromValues$4, + copy: copy$4, + set: set$4, + add: add$4, + subtract: subtract$2, + multiply: multiply$4, + divide: divide$2, + ceil: ceil$2, + floor: floor$2, + min: min$2, + max: max$2, + round: round$2, + scale: scale$4, + scaleAndAdd: scaleAndAdd$2, + distance: distance$2, + squaredDistance: squaredDistance$2, + squaredLength: squaredLength$4, + negate: negate$2, + inverse: inverse$2, + normalize: normalize$4, + dot: dot$4, + cross: cross$2, + lerp: lerp$4, + slerp: slerp$1, + hermite: hermite, + bezier: bezier, + random: random$3, + transformMat4: transformMat4$2, + transformMat3: transformMat3$1, + transformQuat: transformQuat$1, + rotateX: rotateX$2, + rotateY: rotateY$2, + rotateZ: rotateZ$2, + angle: angle$1, + zero: zero$2, + str: str$4, + exactEquals: exactEquals$4, + equals: equals$4, + sub: sub$2, + mul: mul$4, + div: div$2, + dist: dist$2, + sqrDist: sqrDist$2, + len: len$4, + sqrLen: sqrLen$4, + forEach: forEach$2 + }); + + /** + * 4 Dimensional Vector + * @module vec4 + */ + + /** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ + + function create$3() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } + + return out; + } + /** + * Creates a new vec4 initialized with values from an existing vector + * + * @param {ReadonlyVec4} a vector to clone + * @returns {vec4} a new 4D vector + */ + + function clone$3(a) { + var out = new ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + /** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ + + function fromValues$3(x, y, z, w) { + var out = new ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; + } + /** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the source vector + * @returns {vec4} out + */ + + function copy$3(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + /** + * Set the components of a vec4 to the given values + * + * @param {vec4} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} out + */ + + function set$3(out, x, y, z, w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; + } + /** + * Adds two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function add$3(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; + } + /** + * Subtracts vector b from vector a + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function subtract$1(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; + } + /** + * Multiplies two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function multiply$3(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; + } + /** + * Divides two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function divide$1(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + out[3] = a[3] / b[3]; + return out; + } + /** + * Math.ceil the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to ceil + * @returns {vec4} out + */ + + function ceil$1(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + out[3] = Math.ceil(a[3]); + return out; + } + /** + * Math.floor the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to floor + * @returns {vec4} out + */ + + function floor$1(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + out[3] = Math.floor(a[3]); + return out; + } + /** + * Returns the minimum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function min$1(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + out[3] = Math.min(a[3], b[3]); + return out; + } + /** + * Returns the maximum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + + function max$1(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + out[3] = Math.max(a[3], b[3]); + return out; + } + /** + * Math.round the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to round + * @returns {vec4} out + */ + + function round$1(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + out[3] = Math.round(a[3]); + return out; + } + /** + * Scales a vec4 by a scalar number + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec4} out + */ + + function scale$3(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; + } + /** + * Adds two vec4's after scaling the second operand by a scalar value + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec4} out + */ + + function scaleAndAdd$1(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + return out; + } + /** + * Calculates the euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} distance between a and b + */ + + function distance$1(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return Math.hypot(x, y, z, w); + } + /** + * Calculates the squared euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} squared distance between a and b + */ + + function squaredDistance$1(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return x * x + y * y + z * z + w * w; + } + /** + * Calculates the length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate length of + * @returns {Number} length of a + */ + + function length$3(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return Math.hypot(x, y, z, w); + } + /** + * Calculates the squared length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + + function squaredLength$3(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return x * x + y * y + z * z + w * w; + } + /** + * Negates the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to negate + * @returns {vec4} out + */ + + function negate$1(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = -a[3]; + return out; + } + /** + * Returns the inverse of the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to invert + * @returns {vec4} out + */ + + function inverse$1(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + out[3] = 1.0 / a[3]; + return out; + } + /** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to normalize + * @returns {vec4} out + */ + + function normalize$3(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + var len = x * x + y * y + z * z + w * w; + + if (len > 0) { + len = 1 / Math.sqrt(len); + } + + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + return out; + } + /** + * Calculates the dot product of two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} dot product of a and b + */ + + function dot$3(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + } + /** + * Returns the cross-product of three vectors in a 4-dimensional space + * + * @param {ReadonlyVec4} result the receiving vector + * @param {ReadonlyVec4} U the first vector + * @param {ReadonlyVec4} V the second vector + * @param {ReadonlyVec4} W the third vector + * @returns {vec4} result + */ + + function cross$1(out, u, v, w) { + var A = v[0] * w[1] - v[1] * w[0], + B = v[0] * w[2] - v[2] * w[0], + C = v[0] * w[3] - v[3] * w[0], + D = v[1] * w[2] - v[2] * w[1], + E = v[1] * w[3] - v[3] * w[1], + F = v[2] * w[3] - v[3] * w[2]; + var G = u[0]; + var H = u[1]; + var I = u[2]; + var J = u[3]; + out[0] = H * F - I * E + J * D; + out[1] = -(G * F) + I * C - J * B; + out[2] = G * E - H * C + J * A; + out[3] = -(G * D) + H * B - I * A; + return out; + } + /** + * Performs a linear interpolation between two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec4} out + */ + + function lerp$3(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + var aw = a[3]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + out[3] = aw + t * (b[3] - aw); + return out; + } + /** + * Generates a random vector with the given scale + * + * @param {vec4} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned + * @returns {vec4} out + */ + + function random$2(out, scale) { + scale = scale === undefined ? 1.0 : scale; // Marsaglia, George. Choosing a Point from the Surface of a + // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. + // http://projecteuclid.org/euclid.aoms/1177692644; + + var v1, v2, v3, v4; + var s1, s2; + + do { + v1 = RANDOM() * 2 - 1; + v2 = RANDOM() * 2 - 1; + s1 = v1 * v1 + v2 * v2; + } while (s1 >= 1); + + do { + v3 = RANDOM() * 2 - 1; + v4 = RANDOM() * 2 - 1; + s2 = v3 * v3 + v4 * v4; + } while (s2 >= 1); + + var d = Math.sqrt((1 - s1) / s2); + out[0] = scale * v1; + out[1] = scale * v2; + out[2] = scale * v3 * d; + out[3] = scale * v4 * d; + return out; + } + /** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec4} out + */ + + function transformMat4$1(out, a, m) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; + } + /** + * Transforms the vec4 with a quat + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec4} out + */ + + function transformQuat(out, a, q) { + var x = a[0], + y = a[1], + z = a[2]; + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; // calculate quat * vec + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat + + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + out[3] = a[3]; + return out; + } + /** + * Set the components of a vec4 to zero + * + * @param {vec4} out the receiving vector + * @returns {vec4} out + */ + + function zero$1(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + return out; + } + /** + * Returns a string representation of a vector + * + * @param {ReadonlyVec4} a vector to represent as a string + * @returns {String} string representation of the vector + */ + + function str$3(a) { + return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; + } + /** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function exactEquals$3(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; + } + /** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function equals$3(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + } + /** + * Alias for {@link vec4.subtract} + * @function + */ + + var sub$1 = subtract$1; + /** + * Alias for {@link vec4.multiply} + * @function + */ + + var mul$3 = multiply$3; + /** + * Alias for {@link vec4.divide} + * @function + */ + + var div$1 = divide$1; + /** + * Alias for {@link vec4.distance} + * @function + */ + + var dist$1 = distance$1; + /** + * Alias for {@link vec4.squaredDistance} + * @function + */ + + var sqrDist$1 = squaredDistance$1; + /** + * Alias for {@link vec4.length} + * @function + */ + + var len$3 = length$3; + /** + * Alias for {@link vec4.squaredLength} + * @function + */ + + var sqrLen$3 = squaredLength$3; + /** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach$1 = function () { + var vec = create$3(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 4; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + vec[3] = a[i + 3]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + a[i + 3] = vec[3]; + } + + return a; + }; + }(); + + var vec4 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$3, + clone: clone$3, + fromValues: fromValues$3, + copy: copy$3, + set: set$3, + add: add$3, + subtract: subtract$1, + multiply: multiply$3, + divide: divide$1, + ceil: ceil$1, + floor: floor$1, + min: min$1, + max: max$1, + round: round$1, + scale: scale$3, + scaleAndAdd: scaleAndAdd$1, + distance: distance$1, + squaredDistance: squaredDistance$1, + length: length$3, + squaredLength: squaredLength$3, + negate: negate$1, + inverse: inverse$1, + normalize: normalize$3, + dot: dot$3, + cross: cross$1, + lerp: lerp$3, + random: random$2, + transformMat4: transformMat4$1, + transformQuat: transformQuat, + zero: zero$1, + str: str$3, + exactEquals: exactEquals$3, + equals: equals$3, + sub: sub$1, + mul: mul$3, + div: div$1, + dist: dist$1, + sqrDist: sqrDist$1, + len: len$3, + sqrLen: sqrLen$3, + forEach: forEach$1 + }); + + /** + * Quaternion in the format XYZW + * @module quat + */ + + /** + * Creates a new identity quat + * + * @returns {quat} a new quaternion + */ + + function create$2() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + + out[3] = 1; + return out; + } + /** + * Set a quat to the identity quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ + + function identity$1(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } + /** + * Sets a quat from the given angle and rotation axis, + * then returns it. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyVec3} axis the axis around which to rotate + * @param {Number} rad the angle in radians + * @returns {quat} out + **/ + + function setAxisAngle(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; + } + /** + * Gets the rotation axis and angle for a given + * quaternion. If a quaternion is created with + * setAxisAngle, this method will return the same + * values as providied in the original parameter list + * OR functionally equivalent values. + * Example: The quaternion formed by axis [0, 0, 1] and + * angle -90 is the same as the quaternion formed by + * [0, 0, 1] and 270. This method favors the latter. + * @param {vec3} out_axis Vector receiving the axis of rotation + * @param {ReadonlyQuat} q Quaternion to be decomposed + * @return {Number} Angle, in radians, of the rotation + */ + + function getAxisAngle(out_axis, q) { + var rad = Math.acos(q[3]) * 2.0; + var s = Math.sin(rad / 2.0); + + if (s > EPSILON) { + out_axis[0] = q[0] / s; + out_axis[1] = q[1] / s; + out_axis[2] = q[2] / s; + } else { + // If s is zero, return any axis (no rotation - axis does not matter) + out_axis[0] = 1; + out_axis[1] = 0; + out_axis[2] = 0; + } + + return rad; + } + /** + * Gets the angular distance between two unit quaternions + * + * @param {ReadonlyQuat} a Origin unit quaternion + * @param {ReadonlyQuat} b Destination unit quaternion + * @return {Number} Angle, in radians, between the two quaternions + */ + + function getAngle(a, b) { + var dotproduct = dot$2(a, b); + return Math.acos(2 * dotproduct * dotproduct - 1); + } + /** + * Multiplies two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {quat} out + */ + + function multiply$2(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + out[0] = ax * bw + aw * bx + ay * bz - az * by; + out[1] = ay * bw + aw * by + az * bx - ax * bz; + out[2] = az * bw + aw * bz + ax * by - ay * bx; + out[3] = aw * bw - ax * bx - ay * by - az * bz; + return out; + } + /** + * Rotates a quaternion by the given angle about the X axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + + function rotateX$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw + aw * bx; + out[1] = ay * bw + az * bx; + out[2] = az * bw - ay * bx; + out[3] = aw * bw - ax * bx; + return out; + } + /** + * Rotates a quaternion by the given angle about the Y axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + + function rotateY$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var by = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw - az * by; + out[1] = ay * bw + aw * by; + out[2] = az * bw + ax * by; + out[3] = aw * bw - ay * by; + return out; + } + /** + * Rotates a quaternion by the given angle about the Z axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ + + function rotateZ$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bz = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw + ay * bz; + out[1] = ay * bw - ax * bz; + out[2] = az * bw + aw * bz; + out[3] = aw * bw - az * bz; + return out; + } + /** + * Calculates the W component of a quat from the X, Y, and Z components. + * Assumes that quaternion is 1 unit in length. + * Any existing W component will be ignored. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate W component of + * @returns {quat} out + */ + + function calculateW(out, a) { + var x = a[0], + y = a[1], + z = a[2]; + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); + return out; + } + /** + * Calculate the exponential of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @returns {quat} out + */ + + function exp(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var r = Math.sqrt(x * x + y * y + z * z); + var et = Math.exp(w); + var s = r > 0 ? et * Math.sin(r) / r : 0; + out[0] = x * s; + out[1] = y * s; + out[2] = z * s; + out[3] = et * Math.cos(r); + return out; + } + /** + * Calculate the natural logarithm of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @returns {quat} out + */ + + function ln(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var r = Math.sqrt(x * x + y * y + z * z); + var t = r > 0 ? Math.atan2(r, w) / r : 0; + out[0] = x * t; + out[1] = y * t; + out[2] = z * t; + out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w); + return out; + } + /** + * Calculate the scalar power of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @param {Number} b amount to scale the quaternion by + * @returns {quat} out + */ + + function pow(out, a, b) { + ln(out, a); + scale$2(out, out, b); + exp(out, out); + return out; + } + /** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ + + function slerp(out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + var omega, cosom, sinom, scale0, scale1; // calc cosine + + cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) + + if (cosom < 0.0) { + cosom = -cosom; + bx = -bx; + by = -by; + bz = -bz; + bw = -bw; + } // calculate coefficients + + + if (1.0 - cosom > EPSILON) { + // standard case (slerp) + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1.0 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t; + scale1 = t; + } // calculate final values + + + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + return out; + } + /** + * Generates a random unit quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ + + function random$1(out) { + // Implementation of http://planning.cs.uiuc.edu/node198.html + // TODO: Calling random 3 times is probably not the fastest solution + var u1 = RANDOM(); + var u2 = RANDOM(); + var u3 = RANDOM(); + var sqrt1MinusU1 = Math.sqrt(1 - u1); + var sqrtU1 = Math.sqrt(u1); + out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2); + out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2); + out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3); + out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3); + return out; + } + /** + * Calculates the inverse of a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate inverse of + * @returns {quat} out + */ + + function invert$1(out, a) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; + var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 + + out[0] = -a0 * invDot; + out[1] = -a1 * invDot; + out[2] = -a2 * invDot; + out[3] = a3 * invDot; + return out; + } + /** + * Calculates the conjugate of a quat + * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate conjugate of + * @returns {quat} out + */ + + function conjugate$1(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + return out; + } + /** + * Creates a quaternion from the given 3x3 rotation matrix. + * + * NOTE: The resultant quaternion is not normalized, so you should be sure + * to renormalize the quaternion yourself where necessary. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyMat3} m rotation matrix + * @returns {quat} out + * @function + */ + + function fromMat3(out, m) { + // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes + // article "Quaternion Calculus and Fast Animation". + var fTrace = m[0] + m[4] + m[8]; + var fRoot; + + if (fTrace > 0.0) { + // |w| > 1/2, may as well choose w > 1/2 + fRoot = Math.sqrt(fTrace + 1.0); // 2w + + out[3] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; // 1/(4w) + + out[0] = (m[5] - m[7]) * fRoot; + out[1] = (m[6] - m[2]) * fRoot; + out[2] = (m[1] - m[3]) * fRoot; + } else { + // |w| <= 1/2 + var i = 0; + if (m[4] > m[0]) i = 1; + if (m[8] > m[i * 3 + i]) i = 2; + var j = (i + 1) % 3; + var k = (i + 2) % 3; + fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; + out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; + out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; + } + + return out; + } + /** + * Creates a quaternion from the given euler angle x, y, z using the provided intrinsic order for the conversion. + * + * @param {quat} out the receiving quaternion + * @param {x} x Angle to rotate around X axis in degrees. + * @param {y} y Angle to rotate around Y axis in degrees. + * @param {z} z Angle to rotate around Z axis in degrees. + * @param {'zyx'|'xyz'|'yxz'|'yzx'|'zxy'|'zyx'} order Intrinsic order for conversion, default is zyx. + * @returns {quat} out + * @function + */ + + function fromEuler(out, x, y, z) { + var order = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ANGLE_ORDER; + var halfToRad = Math.PI / 360; + x *= halfToRad; + z *= halfToRad; + y *= halfToRad; + var sx = Math.sin(x); + var cx = Math.cos(x); + var sy = Math.sin(y); + var cy = Math.cos(y); + var sz = Math.sin(z); + var cz = Math.cos(z); + + switch (order) { + case "xyz": + out[0] = sx * cy * cz + cx * sy * sz; + out[1] = cx * sy * cz - sx * cy * sz; + out[2] = cx * cy * sz + sx * sy * cz; + out[3] = cx * cy * cz - sx * sy * sz; + break; + + case "xzy": + out[0] = sx * cy * cz - cx * sy * sz; + out[1] = cx * sy * cz - sx * cy * sz; + out[2] = cx * cy * sz + sx * sy * cz; + out[3] = cx * cy * cz + sx * sy * sz; + break; + + case "yxz": + out[0] = sx * cy * cz + cx * sy * sz; + out[1] = cx * sy * cz - sx * cy * sz; + out[2] = cx * cy * sz - sx * sy * cz; + out[3] = cx * cy * cz + sx * sy * sz; + break; + + case "yzx": + out[0] = sx * cy * cz + cx * sy * sz; + out[1] = cx * sy * cz + sx * cy * sz; + out[2] = cx * cy * sz - sx * sy * cz; + out[3] = cx * cy * cz - sx * sy * sz; + break; + + case "zxy": + out[0] = sx * cy * cz - cx * sy * sz; + out[1] = cx * sy * cz + sx * cy * sz; + out[2] = cx * cy * sz + sx * sy * cz; + out[3] = cx * cy * cz - sx * sy * sz; + break; + + case "zyx": + out[0] = sx * cy * cz - cx * sy * sz; + out[1] = cx * sy * cz + sx * cy * sz; + out[2] = cx * cy * sz - sx * sy * cz; + out[3] = cx * cy * cz + sx * sy * sz; + break; + + default: + throw new Error('Unknown angle order ' + order); + } + + return out; + } + /** + * Returns a string representation of a quaternion + * + * @param {ReadonlyQuat} a vector to represent as a string + * @returns {String} string representation of the vector + */ + + function str$2(a) { + return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; + } + /** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {ReadonlyQuat} a quaternion to clone + * @returns {quat} a new quaternion + * @function + */ + + var clone$2 = clone$3; + /** + * Creates a new quat initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} a new quaternion + * @function + */ + + var fromValues$2 = fromValues$3; + /** + * Copy the values from one quat to another + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the source quaternion + * @returns {quat} out + * @function + */ + + var copy$2 = copy$3; + /** + * Set the components of a quat to the given values + * + * @param {quat} out the receiving quaternion + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} out + * @function + */ + + var set$2 = set$3; + /** + * Adds two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {quat} out + * @function + */ + + var add$2 = add$3; + /** + * Alias for {@link quat.multiply} + * @function + */ + + var mul$2 = multiply$2; + /** + * Scales a quat by a scalar number + * + * @param {quat} out the receiving vector + * @param {ReadonlyQuat} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {quat} out + * @function + */ + + var scale$2 = scale$3; + /** + * Calculates the dot product of two quat's + * + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {Number} dot product of a and b + * @function + */ + + var dot$2 = dot$3; + /** + * Performs a linear interpolation between two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + * @function + */ + + var lerp$2 = lerp$3; + /** + * Calculates the length of a quat + * + * @param {ReadonlyQuat} a vector to calculate length of + * @returns {Number} length of a + */ + + var length$2 = length$3; + /** + * Alias for {@link quat.length} + * @function + */ + + var len$2 = length$2; + /** + * Calculates the squared length of a quat + * + * @param {ReadonlyQuat} a vector to calculate squared length of + * @returns {Number} squared length of a + * @function + */ + + var squaredLength$2 = squaredLength$3; + /** + * Alias for {@link quat.squaredLength} + * @function + */ + + var sqrLen$2 = squaredLength$2; + /** + * Normalize a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quaternion to normalize + * @returns {quat} out + * @function + */ + + var normalize$2 = normalize$3; + /** + * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyQuat} a The first quaternion. + * @param {ReadonlyQuat} b The second quaternion. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + var exactEquals$2 = exactEquals$3; + /** + * Returns whether or not the quaternions point approximately to the same direction. + * + * Both quaternions are assumed to be unit length. + * + * @param {ReadonlyQuat} a The first unit quaternion. + * @param {ReadonlyQuat} b The second unit quaternion. + * @returns {Boolean} True if the quaternions are equal, false otherwise. + */ + + function equals$2(a, b) { + return Math.abs(dot$3(a, b)) >= 1 - EPSILON; + } + /** + * Sets a quaternion to represent the shortest rotation from one + * vector to another. + * + * Both vectors are assumed to be unit length. + * + * @param {quat} out the receiving quaternion. + * @param {ReadonlyVec3} a the initial vector + * @param {ReadonlyVec3} b the destination vector + * @returns {quat} out + */ + + var rotationTo = function () { + var tmpvec3 = create$4(); + var xUnitVec3 = fromValues$4(1, 0, 0); + var yUnitVec3 = fromValues$4(0, 1, 0); + return function (out, a, b) { + var dot = dot$4(a, b); + + if (dot < -0.999999) { + cross$2(tmpvec3, xUnitVec3, a); + if (len$4(tmpvec3) < 0.000001) cross$2(tmpvec3, yUnitVec3, a); + normalize$4(tmpvec3, tmpvec3); + setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + cross$2(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot; + return normalize$2(out, out); + } + }; + }(); + /** + * Performs a spherical linear interpolation with two control points + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {ReadonlyQuat} c the third operand + * @param {ReadonlyQuat} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ + + var sqlerp = function () { + var temp1 = create$2(); + var temp2 = create$2(); + return function (out, a, b, c, d, t) { + slerp(temp1, a, d, t); + slerp(temp2, b, c, t); + slerp(out, temp1, temp2, 2 * t * (1 - t)); + return out; + }; + }(); + /** + * Sets the specified quaternion with values corresponding to the given + * axes. Each axis is a vec3 and is expected to be unit length and + * perpendicular to all other specified axes. + * + * @param {ReadonlyVec3} view the vector representing the viewing direction + * @param {ReadonlyVec3} right the vector representing the local "right" direction + * @param {ReadonlyVec3} up the vector representing the local "up" direction + * @returns {quat} out + */ + + var setAxes = function () { + var matr = create$6(); + return function (out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + return normalize$2(out, fromMat3(out, matr)); + }; + }(); + + var quat = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$2, + identity: identity$1, + setAxisAngle: setAxisAngle, + getAxisAngle: getAxisAngle, + getAngle: getAngle, + multiply: multiply$2, + rotateX: rotateX$1, + rotateY: rotateY$1, + rotateZ: rotateZ$1, + calculateW: calculateW, + exp: exp, + ln: ln, + pow: pow, + slerp: slerp, + random: random$1, + invert: invert$1, + conjugate: conjugate$1, + fromMat3: fromMat3, + fromEuler: fromEuler, + str: str$2, + clone: clone$2, + fromValues: fromValues$2, + copy: copy$2, + set: set$2, + add: add$2, + mul: mul$2, + scale: scale$2, + dot: dot$2, + lerp: lerp$2, + length: length$2, + len: len$2, + squaredLength: squaredLength$2, + sqrLen: sqrLen$2, + normalize: normalize$2, + exactEquals: exactEquals$2, + equals: equals$2, + rotationTo: rotationTo, + sqlerp: sqlerp, + setAxes: setAxes + }); + + /** + * Dual Quaternion
+ * Format: [real, dual]
+ * Quaternion format: XYZW
+ * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
+ * @module quat2 + */ + + /** + * Creates a new identity dual quat + * + * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] + */ + + function create$1() { + var dq = new ARRAY_TYPE(8); + + if (ARRAY_TYPE != Float32Array) { + dq[0] = 0; + dq[1] = 0; + dq[2] = 0; + dq[4] = 0; + dq[5] = 0; + dq[6] = 0; + dq[7] = 0; + } + + dq[3] = 1; + return dq; + } + /** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {ReadonlyQuat2} a dual quaternion to clone + * @returns {quat2} new dual quaternion + * @function + */ + + function clone$1(a) { + var dq = new ARRAY_TYPE(8); + dq[0] = a[0]; + dq[1] = a[1]; + dq[2] = a[2]; + dq[3] = a[3]; + dq[4] = a[4]; + dq[5] = a[5]; + dq[6] = a[6]; + dq[7] = a[7]; + return dq; + } + /** + * Creates a new dual quat initialized with the given values + * + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component + * @param {Number} y2 Y component + * @param {Number} z2 Z component + * @param {Number} w2 W component + * @returns {quat2} new dual quaternion + * @function + */ + + function fromValues$1(x1, y1, z1, w1, x2, y2, z2, w2) { + var dq = new ARRAY_TYPE(8); + dq[0] = x1; + dq[1] = y1; + dq[2] = z1; + dq[3] = w1; + dq[4] = x2; + dq[5] = y2; + dq[6] = z2; + dq[7] = w2; + return dq; + } + /** + * Creates a new dual quat from the given values (quat and translation) + * + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component (translation) + * @param {Number} y2 Y component (translation) + * @param {Number} z2 Z component (translation) + * @returns {quat2} new dual quaternion + * @function + */ + + function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { + var dq = new ARRAY_TYPE(8); + dq[0] = x1; + dq[1] = y1; + dq[2] = z1; + dq[3] = w1; + var ax = x2 * 0.5, + ay = y2 * 0.5, + az = z2 * 0.5; + dq[4] = ax * w1 + ay * z1 - az * y1; + dq[5] = ay * w1 + az * x1 - ax * z1; + dq[6] = az * w1 + ax * y1 - ay * x1; + dq[7] = -ax * x1 - ay * y1 - az * z1; + return dq; + } + /** + * Creates a dual quat from a quaternion and a translation + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyQuat} q a normalized quaternion + * @param {ReadonlyVec3} t translation vector + * @returns {quat2} dual quaternion receiving operation result + * @function + */ + + function fromRotationTranslation(out, q, t) { + var ax = t[0] * 0.5, + ay = t[1] * 0.5, + az = t[2] * 0.5, + bx = q[0], + by = q[1], + bz = q[2], + bw = q[3]; + out[0] = bx; + out[1] = by; + out[2] = bz; + out[3] = bw; + out[4] = ax * bw + ay * bz - az * by; + out[5] = ay * bw + az * bx - ax * bz; + out[6] = az * bw + ax * by - ay * bx; + out[7] = -ax * bx - ay * by - az * bz; + return out; + } + /** + * Creates a dual quat from a translation + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyVec3} t translation vector + * @returns {quat2} dual quaternion receiving operation result + * @function + */ + + function fromTranslation(out, t) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = t[0] * 0.5; + out[5] = t[1] * 0.5; + out[6] = t[2] * 0.5; + out[7] = 0; + return out; + } + /** + * Creates a dual quat from a quaternion + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyQuat} q the quaternion + * @returns {quat2} dual quaternion receiving operation result + * @function + */ + + function fromRotation(out, q) { + out[0] = q[0]; + out[1] = q[1]; + out[2] = q[2]; + out[3] = q[3]; + out[4] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + return out; + } + /** + * Creates a new dual quat from a matrix (4x4) + * + * @param {quat2} out the dual quaternion + * @param {ReadonlyMat4} a the matrix + * @returns {quat2} dual quat receiving operation result + * @function + */ + + function fromMat4(out, a) { + //TODO Optimize this + var outer = create$2(); + getRotation(outer, a); + var t = new ARRAY_TYPE(3); + getTranslation$1(t, a); + fromRotationTranslation(out, outer, t); + return out; + } + /** + * Copy the values from one dual quat to another + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the source dual quaternion + * @returns {quat2} out + * @function + */ + + function copy$1(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + return out; + } + /** + * Set a dual quat to the identity dual quaternion + * + * @param {quat2} out the receiving quaternion + * @returns {quat2} out + */ + + function identity(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + return out; + } + /** + * Set the components of a dual quat to the given values + * + * @param {quat2} out the receiving quaternion + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component + * @param {Number} y2 Y component + * @param {Number} z2 Z component + * @param {Number} w2 W component + * @returns {quat2} out + * @function + */ + + function set$1(out, x1, y1, z1, w1, x2, y2, z2, w2) { + out[0] = x1; + out[1] = y1; + out[2] = z1; + out[3] = w1; + out[4] = x2; + out[5] = y2; + out[6] = z2; + out[7] = w2; + return out; + } + /** + * Gets the real part of a dual quat + * @param {quat} out real part + * @param {ReadonlyQuat2} a Dual Quaternion + * @return {quat} real part + */ + + var getReal = copy$2; + /** + * Gets the dual part of a dual quat + * @param {quat} out dual part + * @param {ReadonlyQuat2} a Dual Quaternion + * @return {quat} dual part + */ + + function getDual(out, a) { + out[0] = a[4]; + out[1] = a[5]; + out[2] = a[6]; + out[3] = a[7]; + return out; + } + /** + * Set the real component of a dual quat to the given quaternion + * + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat} q a quaternion representing the real part + * @returns {quat2} out + * @function + */ + + var setReal = copy$2; + /** + * Set the dual component of a dual quat to the given quaternion + * + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat} q a quaternion representing the dual part + * @returns {quat2} out + * @function + */ + + function setDual(out, q) { + out[4] = q[0]; + out[5] = q[1]; + out[6] = q[2]; + out[7] = q[3]; + return out; + } + /** + * Gets the translation of a normalized dual quat + * @param {vec3} out translation + * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed + * @return {vec3} translation + */ + + function getTranslation(out, a) { + var ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3]; + out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + return out; + } + /** + * Translates a dual quat by the given vector + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {quat2} out + */ + + function translate(out, a, v) { + var ax1 = a[0], + ay1 = a[1], + az1 = a[2], + aw1 = a[3], + bx1 = v[0] * 0.5, + by1 = v[1] * 0.5, + bz1 = v[2] * 0.5, + ax2 = a[4], + ay2 = a[5], + az2 = a[6], + aw2 = a[7]; + out[0] = ax1; + out[1] = ay1; + out[2] = az1; + out[3] = aw1; + out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; + out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; + out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; + out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; + return out; + } + /** + * Rotates a dual quat around the X axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out + */ + + function rotateX(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateX$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; + } + /** + * Rotates a dual quat around the Y axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out + */ + + function rotateY(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateY$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; + } + /** + * Rotates a dual quat around the Z axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out + */ + + function rotateZ(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateZ$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; + } + /** + * Rotates a dual quat by a given quaternion (a * q) + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {ReadonlyQuat} q quaternion to rotate by + * @returns {quat2} out + */ + + function rotateByQuatAppend(out, a, q) { + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3], + ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + out[0] = ax * qw + aw * qx + ay * qz - az * qy; + out[1] = ay * qw + aw * qy + az * qx - ax * qz; + out[2] = az * qw + aw * qz + ax * qy - ay * qx; + out[3] = aw * qw - ax * qx - ay * qy - az * qz; + ax = a[4]; + ay = a[5]; + az = a[6]; + aw = a[7]; + out[4] = ax * qw + aw * qx + ay * qz - az * qy; + out[5] = ay * qw + aw * qy + az * qx - ax * qz; + out[6] = az * qw + aw * qz + ax * qy - ay * qx; + out[7] = aw * qw - ax * qx - ay * qy - az * qz; + return out; + } + /** + * Rotates a dual quat by a given quaternion (q * a) + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat} q quaternion to rotate by + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @returns {quat2} out + */ + + function rotateByQuatPrepend(out, q, a) { + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3], + bx = a[0], + by = a[1], + bz = a[2], + bw = a[3]; + out[0] = qx * bw + qw * bx + qy * bz - qz * by; + out[1] = qy * bw + qw * by + qz * bx - qx * bz; + out[2] = qz * bw + qw * bz + qx * by - qy * bx; + out[3] = qw * bw - qx * bx - qy * by - qz * bz; + bx = a[4]; + by = a[5]; + bz = a[6]; + bw = a[7]; + out[4] = qx * bw + qw * bx + qy * bz - qz * by; + out[5] = qy * bw + qw * by + qz * bx - qx * bz; + out[6] = qz * bw + qw * bz + qx * by - qy * bx; + out[7] = qw * bw - qx * bx - qy * by - qz * bz; + return out; + } + /** + * Rotates a dual quat around a given axis. Does the normalisation automatically + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {ReadonlyVec3} axis the axis to rotate around + * @param {Number} rad how far the rotation should be + * @returns {quat2} out + */ + + function rotateAroundAxis(out, a, axis, rad) { + //Special case for rad = 0 + if (Math.abs(rad) < EPSILON) { + return copy$1(out, a); + } + + var axisLength = Math.hypot(axis[0], axis[1], axis[2]); + rad = rad * 0.5; + var s = Math.sin(rad); + var bx = s * axis[0] / axisLength; + var by = s * axis[1] / axisLength; + var bz = s * axis[2] / axisLength; + var bw = Math.cos(rad); + var ax1 = a[0], + ay1 = a[1], + az1 = a[2], + aw1 = a[3]; + out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + var ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + out[4] = ax * bw + aw * bx + ay * bz - az * by; + out[5] = ay * bw + aw * by + az * bx - ax * bz; + out[6] = az * bw + aw * bz + ax * by - ay * bx; + out[7] = aw * bw - ax * bx - ay * by - az * bz; + return out; + } + /** + * Adds two dual quat's + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {quat2} out + * @function + */ + + function add$1(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + return out; + } + /** + * Multiplies two dual quat's + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {quat2} out + */ + + function multiply$1(out, a, b) { + var ax0 = a[0], + ay0 = a[1], + az0 = a[2], + aw0 = a[3], + bx1 = b[4], + by1 = b[5], + bz1 = b[6], + bw1 = b[7], + ax1 = a[4], + ay1 = a[5], + az1 = a[6], + aw1 = a[7], + bx0 = b[0], + by0 = b[1], + bz0 = b[2], + bw0 = b[3]; + out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; + out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; + out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; + out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; + out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; + out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; + out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; + out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; + return out; + } + /** + * Alias for {@link quat2.multiply} + * @function + */ + + var mul$1 = multiply$1; + /** + * Scales a dual quat by a scalar number + * + * @param {quat2} out the receiving dual quat + * @param {ReadonlyQuat2} a the dual quat to scale + * @param {Number} b amount to scale the dual quat by + * @returns {quat2} out + * @function + */ + + function scale$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + return out; + } + /** + * Calculates the dot product of two dual quat's (The dot product of the real parts) + * + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {Number} dot product of a and b + * @function + */ + + var dot$1 = dot$2; + /** + * Performs a linear interpolation between two dual quats's + * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5) + * + * @param {quat2} out the receiving dual quat + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat2} out + */ + + function lerp$1(out, a, b, t) { + var mt = 1 - t; + if (dot$1(a, b) < 0) t = -t; + out[0] = a[0] * mt + b[0] * t; + out[1] = a[1] * mt + b[1] * t; + out[2] = a[2] * mt + b[2] * t; + out[3] = a[3] * mt + b[3] * t; + out[4] = a[4] * mt + b[4] * t; + out[5] = a[5] * mt + b[5] * t; + out[6] = a[6] * mt + b[6] * t; + out[7] = a[7] * mt + b[7] * t; + return out; + } + /** + * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a dual quat to calculate inverse of + * @returns {quat2} out + */ + + function invert(out, a) { + var sqlen = squaredLength$1(a); + out[0] = -a[0] / sqlen; + out[1] = -a[1] / sqlen; + out[2] = -a[2] / sqlen; + out[3] = a[3] / sqlen; + out[4] = -a[4] / sqlen; + out[5] = -a[5] / sqlen; + out[6] = -a[6] / sqlen; + out[7] = a[7] / sqlen; + return out; + } + /** + * Calculates the conjugate of a dual quat + * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result. + * + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat2} a quat to calculate conjugate of + * @returns {quat2} out + */ + + function conjugate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + out[4] = -a[4]; + out[5] = -a[5]; + out[6] = -a[6]; + out[7] = a[7]; + return out; + } + /** + * Calculates the length of a dual quat + * + * @param {ReadonlyQuat2} a dual quat to calculate length of + * @returns {Number} length of a + * @function + */ + + var length$1 = length$2; + /** + * Alias for {@link quat2.length} + * @function + */ + + var len$1 = length$1; + /** + * Calculates the squared length of a dual quat + * + * @param {ReadonlyQuat2} a dual quat to calculate squared length of + * @returns {Number} squared length of a + * @function + */ + + var squaredLength$1 = squaredLength$2; + /** + * Alias for {@link quat2.squaredLength} + * @function + */ + + var sqrLen$1 = squaredLength$1; + /** + * Normalize a dual quat + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a dual quaternion to normalize + * @returns {quat2} out + * @function + */ + + function normalize$1(out, a) { + var magnitude = squaredLength$1(a); + + if (magnitude > 0) { + magnitude = Math.sqrt(magnitude); + var a0 = a[0] / magnitude; + var a1 = a[1] / magnitude; + var a2 = a[2] / magnitude; + var a3 = a[3] / magnitude; + var b0 = a[4]; + var b1 = a[5]; + var b2 = a[6]; + var b3 = a[7]; + var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = (b0 - a0 * a_dot_b) / magnitude; + out[5] = (b1 - a1 * a_dot_b) / magnitude; + out[6] = (b2 - a2 * a_dot_b) / magnitude; + out[7] = (b3 - a3 * a_dot_b) / magnitude; + } + + return out; + } + /** + * Returns a string representation of a dual quaternion + * + * @param {ReadonlyQuat2} a dual quaternion to represent as a string + * @returns {String} string representation of the dual quat + */ + + function str$1(a) { + return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")"; + } + /** + * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyQuat2} a the first dual quaternion. + * @param {ReadonlyQuat2} b the second dual quaternion. + * @returns {Boolean} true if the dual quaternions are equal, false otherwise. + */ + + function exactEquals$1(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]; + } + /** + * Returns whether or not the dual quaternions have approximately the same elements in the same position. + * + * @param {ReadonlyQuat2} a the first dual quat. + * @param {ReadonlyQuat2} b the second dual quat. + * @returns {Boolean} true if the dual quats are equal, false otherwise. + */ + + function equals$1(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)); + } + + var quat2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$1, + clone: clone$1, + fromValues: fromValues$1, + fromRotationTranslationValues: fromRotationTranslationValues, + fromRotationTranslation: fromRotationTranslation, + fromTranslation: fromTranslation, + fromRotation: fromRotation, + fromMat4: fromMat4, + copy: copy$1, + identity: identity, + set: set$1, + getReal: getReal, + getDual: getDual, + setReal: setReal, + setDual: setDual, + getTranslation: getTranslation, + translate: translate, + rotateX: rotateX, + rotateY: rotateY, + rotateZ: rotateZ, + rotateByQuatAppend: rotateByQuatAppend, + rotateByQuatPrepend: rotateByQuatPrepend, + rotateAroundAxis: rotateAroundAxis, + add: add$1, + multiply: multiply$1, + mul: mul$1, + scale: scale$1, + dot: dot$1, + lerp: lerp$1, + invert: invert, + conjugate: conjugate, + length: length$1, + len: len$1, + squaredLength: squaredLength$1, + sqrLen: sqrLen$1, + normalize: normalize$1, + str: str$1, + exactEquals: exactEquals$1, + equals: equals$1 + }); + + /** + * 2 Dimensional Vector + * @module vec2 + */ + + /** + * Creates a new, empty vec2 + * + * @returns {vec2} a new 2D vector + */ + + function create() { + var out = new ARRAY_TYPE(2); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + } + + return out; + } + /** + * Creates a new vec2 initialized with values from an existing vector + * + * @param {ReadonlyVec2} a vector to clone + * @returns {vec2} a new 2D vector + */ + + function clone(a) { + var out = new ARRAY_TYPE(2); + out[0] = a[0]; + out[1] = a[1]; + return out; + } + /** + * Creates a new vec2 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} a new 2D vector + */ + + function fromValues(x, y) { + var out = new ARRAY_TYPE(2); + out[0] = x; + out[1] = y; + return out; + } + /** + * Copy the values from one vec2 to another + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the source vector + * @returns {vec2} out + */ + + function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + return out; + } + /** + * Set the components of a vec2 to the given values + * + * @param {vec2} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} out + */ + + function set(out, x, y) { + out[0] = x; + out[1] = y; + return out; + } + /** + * Adds two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + return out; + } + /** + * Subtracts vector b from vector a + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + return out; + } + /** + * Multiplies two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function multiply(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + return out; + } + /** + * Divides two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function divide(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + return out; + } + /** + * Math.ceil the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to ceil + * @returns {vec2} out + */ + + function ceil(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + return out; + } + /** + * Math.floor the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to floor + * @returns {vec2} out + */ + + function floor(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + return out; + } + /** + * Returns the minimum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function min(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + return out; + } + /** + * Returns the maximum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function max(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + return out; + } + /** + * Math.round the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to round + * @returns {vec2} out + */ + + function round(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + return out; + } + /** + * Scales a vec2 by a scalar number + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec2} out + */ + + function scale(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + return out; + } + /** + * Adds two vec2's after scaling the second operand by a scalar value + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec2} out + */ + + function scaleAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + return out; + } + /** + * Calculates the euclidian distance between two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} distance between a and b + */ + + function distance(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return Math.hypot(x, y); + } + /** + * Calculates the squared euclidian distance between two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} squared distance between a and b + */ + + function squaredDistance(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return x * x + y * y; + } + /** + * Calculates the length of a vec2 + * + * @param {ReadonlyVec2} a vector to calculate length of + * @returns {Number} length of a + */ + + function length(a) { + var x = a[0], + y = a[1]; + return Math.hypot(x, y); + } + /** + * Calculates the squared length of a vec2 + * + * @param {ReadonlyVec2} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + + function squaredLength(a) { + var x = a[0], + y = a[1]; + return x * x + y * y; + } + /** + * Negates the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to negate + * @returns {vec2} out + */ + + function negate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + return out; + } + /** + * Returns the inverse of the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to invert + * @returns {vec2} out + */ + + function inverse(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + return out; + } + /** + * Normalize a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to normalize + * @returns {vec2} out + */ + + function normalize(out, a) { + var x = a[0], + y = a[1]; + var len = x * x + y * y; + + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } + + out[0] = a[0] * len; + out[1] = a[1] * len; + return out; + } + /** + * Calculates the dot product of two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} dot product of a and b + */ + + function dot(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + /** + * Computes the cross product of two vec2's + * Note that the cross product must by definition produce a 3D vector + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec3} out + */ + + function cross(out, a, b) { + var z = a[0] * b[1] - a[1] * b[0]; + out[0] = out[1] = 0; + out[2] = z; + return out; + } + /** + * Performs a linear interpolation between two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec2} out + */ + + function lerp(out, a, b, t) { + var ax = a[0], + ay = a[1]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + return out; + } + /** + * Generates a random vector with the given scale + * + * @param {vec2} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned + * @returns {vec2} out + */ + + function random(out, scale) { + scale = scale === undefined ? 1.0 : scale; + var r = RANDOM() * 2.0 * Math.PI; + out[0] = Math.cos(r) * scale; + out[1] = Math.sin(r) * scale; + return out; + } + /** + * Transforms the vec2 with a mat2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat2} m matrix to transform with + * @returns {vec2} out + */ + + function transformMat2(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y; + out[1] = m[1] * x + m[3] * y; + return out; + } + /** + * Transforms the vec2 with a mat2d + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat2d} m matrix to transform with + * @returns {vec2} out + */ + + function transformMat2d(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + /** + * Transforms the vec2 with a mat3 + * 3rd vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat3} m matrix to transform with + * @returns {vec2} out + */ + + function transformMat3(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[3] * y + m[6]; + out[1] = m[1] * x + m[4] * y + m[7]; + return out; + } + /** + * Transforms the vec2 with a mat4 + * 3rd vector component is implicitly '0' + * 4th vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec2} out + */ + + function transformMat4(out, a, m) { + var x = a[0]; + var y = a[1]; + out[0] = m[0] * x + m[4] * y + m[12]; + out[1] = m[1] * x + m[5] * y + m[13]; + return out; + } + /** + * Rotate a 2D vector + * @param {vec2} out The receiving vec2 + * @param {ReadonlyVec2} a The vec2 point to rotate + * @param {ReadonlyVec2} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec2} out + */ + + function rotate(out, a, b, rad) { + //Translate point to the origin + var p0 = a[0] - b[0], + p1 = a[1] - b[1], + sinC = Math.sin(rad), + cosC = Math.cos(rad); //perform rotation and translate to correct position + + out[0] = p0 * cosC - p1 * sinC + b[0]; + out[1] = p0 * sinC + p1 * cosC + b[1]; + return out; + } + /** + * Get the angle between two 2D vectors + * @param {ReadonlyVec2} a The first operand + * @param {ReadonlyVec2} b The second operand + * @returns {Number} The angle in radians + */ + + function angle(a, b) { + var x1 = a[0], + y1 = a[1], + x2 = b[0], + y2 = b[1], + // mag is the product of the magnitudes of a and b + mag = Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)), + // mag &&.. short circuits if mag == 0 + cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1 + + return Math.acos(Math.min(Math.max(cosine, -1), 1)); + } + /** + * Set the components of a vec2 to zero + * + * @param {vec2} out the receiving vector + * @returns {vec2} out + */ + + function zero(out) { + out[0] = 0.0; + out[1] = 0.0; + return out; + } + /** + * Returns a string representation of a vector + * + * @param {ReadonlyVec2} a vector to represent as a string + * @returns {String} string representation of the vector + */ + + function str(a) { + return "vec2(" + a[0] + ", " + a[1] + ")"; + } + /** + * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec2} a The first vector. + * @param {ReadonlyVec2} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1]; + } + /** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec2} a The first vector. + * @param {ReadonlyVec2} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function equals(a, b) { + var a0 = a[0], + a1 = a[1]; + var b0 = b[0], + b1 = b[1]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); + } + /** + * Alias for {@link vec2.length} + * @function + */ + + var len = length; + /** + * Alias for {@link vec2.subtract} + * @function + */ + + var sub = subtract; + /** + * Alias for {@link vec2.multiply} + * @function + */ + + var mul = multiply; + /** + * Alias for {@link vec2.divide} + * @function + */ + + var div = divide; + /** + * Alias for {@link vec2.distance} + * @function + */ + + var dist = distance; + /** + * Alias for {@link vec2.squaredDistance} + * @function + */ + + var sqrDist = squaredDistance; + /** + * Alias for {@link vec2.squaredLength} + * @function + */ + + var sqrLen = squaredLength; + /** + * Perform some operation over an array of vec2s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach = function () { + var vec = create(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 2; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + } + + return a; + }; + }(); + + var vec2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create, + clone: clone, + fromValues: fromValues, + copy: copy, + set: set, + add: add, + subtract: subtract, + multiply: multiply, + divide: divide, + ceil: ceil, + floor: floor, + min: min, + max: max, + round: round, + scale: scale, + scaleAndAdd: scaleAndAdd, + distance: distance, + squaredDistance: squaredDistance, + length: length, + squaredLength: squaredLength, + negate: negate, + inverse: inverse, + normalize: normalize, + dot: dot, + cross: cross, + lerp: lerp, + random: random, + transformMat2: transformMat2, + transformMat2d: transformMat2d, + transformMat3: transformMat3, + transformMat4: transformMat4, + rotate: rotate, + angle: angle, + zero: zero, + str: str, + exactEquals: exactEquals, + equals: equals, + len: len, + sub: sub, + mul: mul, + div: div, + dist: dist, + sqrDist: sqrDist, + sqrLen: sqrLen, + forEach: forEach + }); + + exports.glMatrix = common; + exports.mat2 = mat2; + exports.mat2d = mat2d; + exports.mat3 = mat3; + exports.mat4 = mat4; + exports.quat = quat; + exports.quat2 = quat2; + exports.vec2 = vec2; + exports.vec3 = vec3; + exports.vec4 = vec4; + + Object.defineProperty(exports, '__esModule', { value: true }); + + })); + \ No newline at end of file diff --git a/Übung_30112023/Insel/common/initShaders.js b/Übung_30112023/Insel/common/initShaders.js new file mode 100644 index 0000000..95a6657 --- /dev/null +++ b/Übung_30112023/Insel/common/initShaders.js @@ -0,0 +1,46 @@ +// +// initShaders.js +// + +function initShaders( gl, vertexShaderId, fragmentShaderId ) +{ + const compileShader = ( gl, gl_shaderType, shaderSource ) => { + // Create the shader + shader = gl.createShader( gl_shaderType ); + + // Set the shader source code + gl.shaderSource( shader, shaderSource ); + + // Compile the shader to make it readable for the GPU + gl.compileShader( shader ); + var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + + if (!success) { + // Something went wrong during compilation; get the error + throw "could not compile shader:" + gl.getShaderInfoLog(shader); + } + else { + return shader; + } + } + + /* + * Setup shader program + */ + vShaderSource = document.querySelector( '#' + vertexShaderId ).text; + fShaderSource = document.querySelector( '#' + fragmentShaderId ).text; + + vertexShader = compileShader( gl, gl.VERTEX_SHADER, vShaderSource ); + fragmentShader = compileShader( gl, gl.FRAGMENT_SHADER, fShaderSource ); + + // Build the program + const program = gl.createProgram(); + + // Attach shaders to it + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; +} \ No newline at end of file diff --git a/Übung_30112023/Insel/common/objects3D.js b/Übung_30112023/Insel/common/objects3D.js new file mode 100644 index 0000000..fe8ed0e --- /dev/null +++ b/Übung_30112023/Insel/common/objects3D.js @@ -0,0 +1,437 @@ +class Object3D +{ + constructor() + { + this.posVBO = gl.createBuffer(); + this.colorVBO = gl.createBuffer(); + this.indexVBO = gl.createBuffer(); + } + + initBuffers() + { + // Create VBO for positions and activate it + gl.bindBuffer(gl.ARRAY_BUFFER, this.posVBO); + + // Fill VBO with positions + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.positions), gl.STATIC_DRAW); + + // Create VBO for colors and activate it + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorVBO); + + // Fill VBO with colors + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.colors), gl.STATIC_DRAW); + + // Create VBO for indices and activate it + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexVBO); + + // Fill VBO with indices + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.indices), gl.STATIC_DRAW); + } + + render() + { + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, this.posVBO); + gl.enableVertexAttribArray(posLoc); + gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0); + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorVBO); + gl.enableVertexAttribArray(colorLoc); + gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0); + + // Render + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexVBO); + gl.drawElements(gl.TRIANGLES, this.indices.length, gl.UNSIGNED_SHORT, 0); + } +} + + + +class Cube extends Object3D +{ + constructor() + { + super(); + + this.positions = + [ + -1 , -1 , -1 , // index 0 + -1 , -1 , 1 , // index 1 + -1 , 1 , -1 , // index 2 + -1 , 1 , 1 , // index 3 + 1 , -1 , -1 , // index 4 + 1 , -1 , 1 , // index 5 + 1 , 1 , -1 , // index 6 + 1 , 1 , 1 // index 7 + ]; + + this.indices = + [ + 1 , 7 , 3 , 1 , 5 , 7 , // Front + 5 , 6 , 7 , 5 , 4 , 6 , // Right + 4 , 2 , 0 , 4 , 6 , 2 , // Back + 0 , 3 , 2 , 0 , 1 , 3 , // Left + 0 , 5 , 1 , 0 , 4 , 5 , // Bottom + 3 , 6 , 2 , 3 , 7 , 6 // Top + ]; + + this.colors = + [ + 0 , 0 , 0 , 1 , // index 0 + 1 , 0 , 0 , 1 , // index 1 + 0 , 1 , 0 , 1 , // index 2 + 0 , 0 , 1 , 1 , // index 3 + 1 , 1 , 0 , 1 , // index 4 + 1 , 0 , 1 , 1 , // index 5 + 0 , 1 , 1 , 1 , // index 6 + 1 , 1 , 1 , 1 // index 7 + ]; + + this.initBuffers(); + } +} + +class Insel extends Object3D +{ + constructor() + { + super(); + + this.positions = + [ + -0.344503,-0.106899,-2.313329, + 0.254658,0.065420,-2.430170, + 0.506020,-0.293147,-2.207084, + 1.415955,0.064912,-1.957500, + 1.489208,-0.318759,-1.320762, + 1.685851,0.084184,-1.268915, + 2.014675,-0.126122,-0.782958, + 0.957233,-1.089151,-0.905606, + 0.454708,-1.256676,-0.897711, + 0.810208,-0.709404,-1.141590, + 0.739686,-1.249709,-0.541415, + 0.231851,-1.904112,-0.621845, + 0.052641,-1.633897,-0.758536, + -0.020753,-0.743329,-1.377161, + 1.364762,-0.324582,0.647285, + 2.074500,0.090083,0.068582, + 1.608835,0.037777,0.559365, + 1.955554,-0.191974,0.132568, + 1.393132,0.037777,1.383312, + 1.210661,-0.322174,1.134609, + 0.514977,-0.286422,1.576757, + 0.507135,-1.581211,0.348922, + 0.342563,-2.052501,-0.027325, + 0.620568,-1.491335,-0.146730, + 0.745909,-0.723539,0.485115, + 0.089439,-1.345612,0.360167, + 1.089500,-0.770651,-0.314462, + -0.123718,-0.298339,1.611730, + -0.930959,0.037777,1.550149, + -0.866234,-0.291222,1.300128, + -0.414258,0.037777,1.808618, + -1.444312,-0.282136,0.794076, + -1.591571,0.097928,0.827036, + -1.839477,-0.177971,0.145553, + -0.936850,-0.751093,-0.176985, + -0.611777,-1.317411,-0.262516, + -0.326162,-1.310280,0.225784, + 0.289486,-0.743127,0.679448, + 0.020776,-1.770522,0.330532, + -1.675519,-0.336500,-0.606829, + -1.607249,0.010755,-1.680275, + -0.625318,-0.725192,-1.039731, + -2.011082,0.043485,-0.744422, + -1.247727,0.059337,-1.332687, + -0.934732,-0.314137,-1.943344, + -0.184171,-0.491687,-2.096484, + -0.707720,0.065178,-2.205832, + -0.350659,-1.373304,-0.758204, + -0.299529,-2.155551,-0.308846, + -0.086080,-2.478361,-0.004677, + 0.091215,-2.267556,0.130842, + -0.260030,-2.240649,0.060849, + -0.470828,-1.954876,0.024811, + -0.278168,0.037777,-0.209083, + -0.914878,0.210568,-1.267986, + -0.862298,0.231412,-0.781910, + -0.302799,0.520691,-1.301783, + -1.068480,0.101026,-0.360536, + -1.736910,0.103204,0.106553, + 0.236277,0.037777,0.701510, + 0.656348,0.037777,-0.098120, + 0.501631,0.037777,1.688231, + 1.034499,0.275328,-1.269756, + 0.471459,0.267036,-1.698558, + 0.637660,0.376390,-1.207861, + 0.812177,0.491673,-0.567514, + 1.244986,0.398908,-0.324291, + 1.002755,0.639249,-0.717163, + 1.381545,0.288786,-0.765328, + 1.348978,0.284964,-1.076072, + -0.505260,0.213488,-1.704558, + -0.221831,0.306144,-1.838428, + -0.274246,0.065420,-2.359878, + 2.054775,0.091828,-0.677912, + -0.148262,0.773865,-0.947432, + 0.101020,0.922236,-0.839739, + 0.312442,0.779166,-1.109731, + -0.262315,0.721321,-1.533752, + -0.404757,0.197895,-0.782219, + 0.568488,0.537125,-0.913448, + 0.115069,0.760356,-1.450921, + -0.061115,0.654189,-0.643377, + 0.205810,0.801703,-0.757537, + 0.344937,0.262088,-0.492076, + 0.077232,0.934717,-1.202342, + -0.102879,0.422805,-0.489015, + -0.269697,0.566033,-0.874217, + -0.186512,0.743264,-1.152426 + ]; + + this.indices = + [ + 0,1,2, + 3,4,2, + 5,6,4, + 7,8,9, + 8,10,11, + 9,12,13, + 14,15,16, + 14,6,17, + 6,15,17, + 14,18,19, + 18,20,19, + 21,22,23, + 24,25,21, + 24,23,26, + 27,28,29, + 20,30,27, + 28,31,29, + 32,33,31, + 34,35,36, + 36,25,37, + 36,38,25, + 39,40,41, + 40,42,43, + 33,42,39, + 40,44,41, + 44,0,45, + 40,46,44, + 46,0,44, + 41,12,47, + 47,12,48, + 41,35,34, + 48,35,47, + 48,11,49, + 11,50,49, + 50,51,49, + 50,52,51, + 51,48,49, + 53,32,28, + 54,55,56, + 57,58,32, + 59,16,60, + 28,59,53, + 59,61,18, + 62,63,64, + 65,66,67, + 68,5,69, + 70,43,54, + 63,1,71, + 71,72,46, + 13,45,2, + 9,4,7, + 4,26,7, + 26,14,24, + 26,6,14, + 19,37,24, + 37,29,36, + 29,34,36, + 44,13,41, + 2,1,3, + 2,45,0, + 0,72,1, + 9,2,4, + 3,5,4, + 5,73,6, + 7,10,8, + 7,26,10, + 9,8,12, + 8,11,12, + 14,17,15, + 6,73,15, + 14,16,18, + 18,61,20, + 24,21,23, + 21,38,22, + 24,37,25, + 21,25,38, + 26,23,10, + 23,22,10, + 27,30,28, + 20,61,30, + 28,32,31, + 32,58,33, + 36,35,52, + 74,75,76, + 36,52,38, + 40,39,42, + 33,58,42, + 40,43,46, + 46,72,0, + 41,13,12, + 41,47,35, + 48,52,35, + 48,12,11, + 11,22,50, + 11,10,22, + 50,38,52, + 22,38,50, + 48,51,52, + 53,57,32, + 43,42,57, + 57,42,58, + 59,18,16, + 28,30,59, + 59,30,61, + 5,62,69, + 60,16,15, + 66,73,68, + 71,70,77, + 63,3,1, + 71,1,72, + 13,2,9, + 4,6,26, + 14,19,24, + 19,20,37, + 37,27,29, + 37,20,27, + 29,31,34, + 31,33,34, + 34,39,41, + 34,33,39, + 44,45,13, + 55,78,56, + 59,60,53, + 79,60,65, + 77,56,80, + 81,82,75, + 82,76,75, + 60,76,83, + 76,80,84, + 53,83,85, + 86,74,87, + 64,76,79, + 74,84,87, + 53,60,83, + 78,85,86, + 67,64,79, + 67,79,65, + 67,66,68, + 67,69,62, + 67,68,69, + 60,66,65, + 67,62,64, + 62,3,63, + 68,73,5, + 5,3,62, + 66,15,73, + 79,76,60, + 64,63,76, + 60,15,66, + 76,82,83, + 85,82,81, + 85,83,82, + 74,85,81, + 56,78,86, + 56,87,84, + 56,86,87, + 56,84,80, + 71,80,63, + 53,55,57, + 56,77,70, + 56,70,54, + 43,55,54, + 70,46,43, + 71,46,70, + 76,63,80, + 86,85,74, + 74,76,84, + 78,53,85, + 71,77,80, + 53,78,55, + 43,57,55, + 74,81,75 + ]; + + this.colors = []; + for(var i = 0; i < this.positions.length; i += 3) + { + this.colors.push(0.5, 0.5, 0.5, 1); + } + + this.initBuffers(); + } +} + +class River extends Object3D +{ + constructor() + { + super(); + + this.positions = + [ + 0.0, 0.0, 14.0, // index 0 + 0.75, 0.0, 12.5, // index 1 + 1.25, 0.0, 12.5, // index 2 + 1.0, 0.0, 11.0, // index 3 + 2.0, 0.0, 11.0, // index 4 + 0.75, 0.0, 9.5, // index 5 + 2.25, 0.0, 9.5, // index 6 + 0.0, 0.0, 8.0, // index 7 + 2.0, 0.0, 8.0, // index 8 + -2.25, 0.0, 6.1875, // index 9 + 0.25, 0.0, 6.1875, // index 10 + -3.0, 0.0, 4.0, // index 11 + 0.0, 0.0, 4.0, // index 12 + -2.25, 0.0, 1.8125, // index 13 + 1.25, 0.0, 1.8125, // index 14 + 0.0, 0.0, 0.0, // index 15 + 4.0, 0.0, 0.0, // index 16 + 0.0, -7.0, 0.0, // index 17 -> additional for waterfall + 4.0, -6.0, 0.0 // index 18 -> additional for waterfall + ]; + + this.indices = + [ + 0, 1, 2, + 1, 2, 3, + 2, 3, 4, + 3, 4, 5, + 4, 5, 6, + 5, 6, 7, + 6, 7, 8, + 7, 8, 9, + 8, 9, 10, + 9, 10, 11, + 10, 11, 12, + 11, 12, 13, + 12, 13, 14, + 13, 14, 15, + 14, 15, 16, + 15, 16, 17, // additional for waterfall + 16, 17, 18 // additional for waterfall + ]; + + this.colors = []; + for(var i = 0; i < this.positions.length; i += 3) { + this.colors.push(0.2, 0.2, 0.8, 1); + } + + this.initBuffers(); + } +} \ No newline at end of file diff --git a/Übung_30112023/Insel/index.html b/Übung_30112023/Insel/index.html new file mode 100644 index 0000000..71f233c --- /dev/null +++ b/Übung_30112023/Insel/index.html @@ -0,0 +1,69 @@ + + + + + WebGL Example + + + + + + + + +

Lorem Ipsum

+ + + If you see this, your browser doesn't support WebGL. + + + + + + diff --git a/Übung_30112023/Insel/main.js b/Übung_30112023/Insel/main.js new file mode 100644 index 0000000..e4a5ce8 --- /dev/null +++ b/Übung_30112023/Insel/main.js @@ -0,0 +1,534 @@ +let gl; +let program; +let positions1, + positions2, + colors1, + colors2, + indices1, + indices2; +let posVBO1, + posVBO2, + colorVBO1, + colorVBO2, + indexVBO1, + indexVBO2; +let posLoc, + colorLoc; +let objects = []; +let lastTimestamp; +const {mat4, mat3, vec3} = glMatrix; + +function main() { + + // Get canvas and setup WebGL context + const canvas = document.getElementById("gl-canvas"); + gl = canvas.getContext('webgl2'); + + // Configure viewport + gl.viewport(0,0,canvas.width,canvas.height); + gl.clearColor(1.0,1.0,1.0,1.0); + + gl.enable(gl.DEPTH_TEST); + + // Init shader program via additional function and bind it + program = initShaders(gl, "vertex-shader", "fragment-shader"); + gl.useProgram(program); + + // Get locations of shader variables + posLoc = gl.getAttribLocation(program, "vPosition"); + colorLoc = gl.getAttribLocation(program, "vColor"); + + const moveLoc = gl.getUniformLocation(program, "moveDown"); + + transformMatrix = [ + 1, 0, 0, 0, + 0, 1, 0, -0.2, + 0, 0, 1, 0, + 0, 0, 0, 1, + ]; + + gl.uniformMatrix4fv(moveLoc, false, transformMatrix) + + const viewLoc = gl.getUniformLocation(program, "viewMatrix"); + + /* + viewMatrix = [ + 0.1767766922712326, -0.0589255653321743, -0.013334667310118675, 0, + 0, 0.2357022613286972, -0.006667333655059338, 0, + -0.1767766922712326, -0.0589255653321743, -0.013334667310118675, 0, + 0, 0, -0.8801880478858948, 1 + ]; + */ + + viewMatrix = mat4.create(); + projectionMatrix = mat4.create(); + modelViewProjection = mat4.create(); + mat4.perspective(projectionMatrix, 90.0, 1.0, 0.0001, 1000.0); + + gl.uniformMatrix4fv(viewLoc, false, viewMatrix); + + + // Only clear once + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + objects.push(new Insel()); + objects.push(new River()); + + //initListener(); + + window.requestAnimationFrame(render); +}; + + +function initListener() +{ + document.body.addEventListener('mousemove', printMouseMovement); + document.body.addEventListener('keydown', printKeyPress); +} + +function printMouseMovement(e) +{ + console.log('mousemoved'); +} + +function printKeyPress(e) +{ + console.log(e.which); +} + + +function render(timestamp) +{ + if(lastTimestamp == undefined) + { + lastTimestamp = timestamp; + } + + const elapsed = timestamp - lastTimestamp; + + let p = [3 * Math.sin(0.001 * timestamp), 1, 3 * Math.cos(0.001 * timestamp)]; + mat4.lookAt(viewMatrix, p, [0, 0, 0], [0, 1, 0]); + + mat4.multiply(modelViewProjection, projectionMatrix, viewMatrix); + viewLoc = gl.getUniformLocation(program, "viewMatrix"); + gl.uniformMatrix4fv(viewLoc, false, modelViewProjection); + + for (var i = 0; i < objects.length; i++) + { + objects[i].render(); + } + + window.requestAnimationFrame(render); +} + +function init1() { + + // Specify geometry + positions1 = [ + -0.344503,-0.106899,-2.313329, + 0.254658,0.065420,-2.430170, + 0.506020,-0.293147,-2.207084, + 1.415955,0.064912,-1.957500, + 1.489208,-0.318759,-1.320762, + 1.685851,0.084184,-1.268915, + 2.014675,-0.126122,-0.782958, + 0.957233,-1.089151,-0.905606, + 0.454708,-1.256676,-0.897711, + 0.810208,-0.709404,-1.141590, + 0.739686,-1.249709,-0.541415, + 0.231851,-1.904112,-0.621845, + 0.052641,-1.633897,-0.758536, + -0.020753,-0.743329,-1.377161, + 1.364762,-0.324582,0.647285, + 2.074500,0.090083,0.068582, + 1.608835,0.037777,0.559365, + 1.955554,-0.191974,0.132568, + 1.393132,0.037777,1.383312, + 1.210661,-0.322174,1.134609, + 0.514977,-0.286422,1.576757, + 0.507135,-1.581211,0.348922, + 0.342563,-2.052501,-0.027325, + 0.620568,-1.491335,-0.146730, + 0.745909,-0.723539,0.485115, + 0.089439,-1.345612,0.360167, + 1.089500,-0.770651,-0.314462, + -0.123718,-0.298339,1.611730, + -0.930959,0.037777,1.550149, + -0.866234,-0.291222,1.300128, + -0.414258,0.037777,1.808618, + -1.444312,-0.282136,0.794076, + -1.591571,0.097928,0.827036, + -1.839477,-0.177971,0.145553, + -0.936850,-0.751093,-0.176985, + -0.611777,-1.317411,-0.262516, + -0.326162,-1.310280,0.225784, + 0.289486,-0.743127,0.679448, + 0.020776,-1.770522,0.330532, + -1.675519,-0.336500,-0.606829, + -1.607249,0.010755,-1.680275, + -0.625318,-0.725192,-1.039731, + -2.011082,0.043485,-0.744422, + -1.247727,0.059337,-1.332687, + -0.934732,-0.314137,-1.943344, + -0.184171,-0.491687,-2.096484, + -0.707720,0.065178,-2.205832, + -0.350659,-1.373304,-0.758204, + -0.299529,-2.155551,-0.308846, + -0.086080,-2.478361,-0.004677, + 0.091215,-2.267556,0.130842, + -0.260030,-2.240649,0.060849, + -0.470828,-1.954876,0.024811, + -0.278168,0.037777,-0.209083, + -0.914878,0.210568,-1.267986, + -0.862298,0.231412,-0.781910, + -0.302799,0.520691,-1.301783, + -1.068480,0.101026,-0.360536, + -1.736910,0.103204,0.106553, + 0.236277,0.037777,0.701510, + 0.656348,0.037777,-0.098120, + 0.501631,0.037777,1.688231, + 1.034499,0.275328,-1.269756, + 0.471459,0.267036,-1.698558, + 0.637660,0.376390,-1.207861, + 0.812177,0.491673,-0.567514, + 1.244986,0.398908,-0.324291, + 1.002755,0.639249,-0.717163, + 1.381545,0.288786,-0.765328, + 1.348978,0.284964,-1.076072, + -0.505260,0.213488,-1.704558, + -0.221831,0.306144,-1.838428, + -0.274246,0.065420,-2.359878, + 2.054775,0.091828,-0.677912, + -0.148262,0.773865,-0.947432, + 0.101020,0.922236,-0.839739, + 0.312442,0.779166,-1.109731, + -0.262315,0.721321,-1.533752, + -0.404757,0.197895,-0.782219, + 0.568488,0.537125,-0.913448, + 0.115069,0.760356,-1.450921, + -0.061115,0.654189,-0.643377, + 0.205810,0.801703,-0.757537, + 0.344937,0.262088,-0.492076, + 0.077232,0.934717,-1.202342, + -0.102879,0.422805,-0.489015, + -0.269697,0.566033,-0.874217, + -0.186512,0.743264,-1.152426 + ]; + + indices1 = [ + 0,1,2, + 3,4,2, + 5,6,4, + 7,8,9, + 8,10,11, + 9,12,13, + 14,15,16, + 14,6,17, + 6,15,17, + 14,18,19, + 18,20,19, + 21,22,23, + 24,25,21, + 24,23,26, + 27,28,29, + 20,30,27, + 28,31,29, + 32,33,31, + 34,35,36, + 36,25,37, + 36,38,25, + 39,40,41, + 40,42,43, + 33,42,39, + 40,44,41, + 44,0,45, + 40,46,44, + 46,0,44, + 41,12,47, + 47,12,48, + 41,35,34, + 48,35,47, + 48,11,49, + 11,50,49, + 50,51,49, + 50,52,51, + 51,48,49, + 53,32,28, + 54,55,56, + 57,58,32, + 59,16,60, + 28,59,53, + 59,61,18, + 62,63,64, + 65,66,67, + 68,5,69, + 70,43,54, + 63,1,71, + 71,72,46, + 13,45,2, + 9,4,7, + 4,26,7, + 26,14,24, + 26,6,14, + 19,37,24, + 37,29,36, + 29,34,36, + 44,13,41, + 2,1,3, + 2,45,0, + 0,72,1, + 9,2,4, + 3,5,4, + 5,73,6, + 7,10,8, + 7,26,10, + 9,8,12, + 8,11,12, + 14,17,15, + 6,73,15, + 14,16,18, + 18,61,20, + 24,21,23, + 21,38,22, + 24,37,25, + 21,25,38, + 26,23,10, + 23,22,10, + 27,30,28, + 20,61,30, + 28,32,31, + 32,58,33, + 36,35,52, + 74,75,76, + 36,52,38, + 40,39,42, + 33,58,42, + 40,43,46, + 46,72,0, + 41,13,12, + 41,47,35, + 48,52,35, + 48,12,11, + 11,22,50, + 11,10,22, + 50,38,52, + 22,38,50, + 48,51,52, + 53,57,32, + 43,42,57, + 57,42,58, + 59,18,16, + 28,30,59, + 59,30,61, + 5,62,69, + 60,16,15, + 66,73,68, + 71,70,77, + 63,3,1, + 71,1,72, + 13,2,9, + 4,6,26, + 14,19,24, + 19,20,37, + 37,27,29, + 37,20,27, + 29,31,34, + 31,33,34, + 34,39,41, + 34,33,39, + 44,45,13, + 55,78,56, + 59,60,53, + 79,60,65, + 77,56,80, + 81,82,75, + 82,76,75, + 60,76,83, + 76,80,84, + 53,83,85, + 86,74,87, + 64,76,79, + 74,84,87, + 53,60,83, + 78,85,86, + 67,64,79, + 67,79,65, + 67,66,68, + 67,69,62, + 67,68,69, + 60,66,65, + 67,62,64, + 62,3,63, + 68,73,5, + 5,3,62, + 66,15,73, + 79,76,60, + 64,63,76, + 60,15,66, + 76,82,83, + 85,82,81, + 85,83,82, + 74,85,81, + 56,78,86, + 56,87,84, + 56,86,87, + 56,84,80, + 71,80,63, + 53,55,57, + 56,77,70, + 56,70,54, + 43,55,54, + 70,46,43, + 71,46,70, + 76,63,80, + 86,85,74, + 74,76,84, + 78,53,85, + 71,77,80, + 53,78,55, + 43,57,55, + 74,81,75 + ]; + + colors1 = []; + for(var i = 0; i < positions1.length; i += 3) { + colors1.push(0.5, 0.5, 0.5, 1); + } + + initBuffers1(); +} + +function initBuffers1() { + + // Create VBO for positions and activate it + posVBO1 = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, posVBO1); + + // Fill VBO with positions + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions1), gl.STATIC_DRAW); + + // Create VBO for colors and activate it + colorVBO1 = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO1); + + // Fill VBO with colors + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors1), gl.STATIC_DRAW); + + // Create VBO for indices and activate it + indexVBO1 = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexVBO1); + + // Fill VBO with indices + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices1), gl.STATIC_DRAW); +} + +function render1() { + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, posVBO1); + gl.enableVertexAttribArray(posLoc); + gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0); + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO1); + gl.enableVertexAttribArray(colorLoc); + gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0); + + // Render + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexVBO1); + gl.drawElements(gl.TRIANGLES, indices1.length, gl.UNSIGNED_SHORT, 0); +} + +function init2() { + + // Specify geometry + positions2 = [ + 0.0, 0.0, 14.0, // index 0 + 0.75, 0.0, 12.5, // index 1 + 1.25, 0.0, 12.5, // index 2 + 1.0, 0.0, 11.0, // index 3 + 2.0, 0.0, 11.0, // index 4 + 0.75, 0.0, 9.5, // index 5 + 2.25, 0.0, 9.5, // index 6 + 0.0, 0.0, 8.0, // index 7 + 2.0, 0.0, 8.0, // index 8 + -2.25, 0.0, 6.1875, // index 9 + 0.25, 0.0, 6.1875, // index 10 + -3.0, 0.0, 4.0, // index 11 + 0.0, 0.0, 4.0, // index 12 + -2.25, 0.0, 1.8125, // index 13 + 1.25, 0.0, 1.8125, // index 14 + 0.0, 0.0, 0.0, // index 15 + 4.0, 0.0, 0.0, // index 16 + 0.0, -7.0, 0.0, // index 17 -> additional for waterfall + 4.0, -6.0, 0.0 // index 18 -> additional for waterfall + ]; + + indices2 = [ + 0, 1, 2, + 1, 2, 3, + 2, 3, 4, + 3, 4, 5, + 4, 5, 6, + 5, 6, 7, + 6, 7, 8, + 7, 8, 9, + 8, 9, 10, + 9, 10, 11, + 10, 11, 12, + 11, 12, 13, + 12, 13, 14, + 13, 14, 15, + 14, 15, 16, + 15, 16, 17, // additional for waterfall + 16, 17, 18 // additional for waterfall + ]; + + colors2 = []; + for(var i = 0; i < positions2.length; i += 3) { + colors2.push(0.2, 0.2, 0.8, 1); + } + + initBuffers2(); +} + +function initBuffers2() { + // Create VBO for positions and activate it + posVBO2 = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, posVBO2); + + // Fill VBO with positions + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions2), gl.STATIC_DRAW); + + // Create VBO for colors and activate it + colorVBO2 = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO2); + + // Fill VBO with colors + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors2), gl.STATIC_DRAW); + + // Create VBO for indices and activate it + indexVBO2 = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexVBO2); + + // Fill VBO with indices + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices2), gl.STATIC_DRAW); +} + +function render2() { + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, posVBO2); + gl.enableVertexAttribArray(posLoc); + gl.vertexAttribPointer(posLoc, 3, gl.FLOAT, false, 0, 0); + + // Link data in VBO to shader variables + gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO2); + gl.enableVertexAttribArray(colorLoc); + gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0); + + // Render + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexVBO2); + gl.drawElements(gl.TRIANGLES, indices2.length, gl.UNSIGNED_SHORT, 0); +} + +main(); diff --git a/Übung_30112023/uebung-woche7.pdf b/Übung_30112023/uebung-woche7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b0fc5bb207746d02d9c1235dff4a0c63fd514cdc GIT binary patch literal 561678 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%0AS%}K< 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 literal 0 HcmV?d00001

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 IhD=nIZqZ-k<^!5lR;&|MNN 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%0DYmTFVdOo^M-lzsars? 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