| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766 | <!DOCTYPE html><html lang="en"><head>    <meta charset="utf-8">    <title>JSDoc: Source: mat4.js</title>    <script src="scripts/prettify/prettify.js"> </script>    <script src="scripts/prettify/lang-css.js"> </script>    <!--[if lt IE 9]>      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>    <![endif]-->    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"></head><body><div id="main">    <h1 class="page-title">Source: mat4.js</h1>            <section>        <article>            <pre class="prettyprint source linenums"><code>import * as glMatrix from "./common.js";/** * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied. * @module mat4 *//** * Creates a new identity mat4 * * @returns {mat4} a new 4x4 matrix */export function create() {  let out = new glMatrix.ARRAY_TYPE(16);  if(glMatrix.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 {mat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */export function clone(a) {  let 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 */export function copy(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 */export function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {  let out = new glMatrix.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 */export function set(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 */export function identity(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 {mat4} a the source matrix * @returns {mat4} out */export function transpose(out, a) {  // If we are transposing ourselves we can skip a few steps but have to cache some values  if (out === a) {    let a01 = a[1], a02 = a[2], a03 = a[3];    let a12 = a[6], a13 = a[7];    let 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 {mat4} a the source matrix * @returns {mat4} out */export function invert(out, a) {  let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];  let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];  let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];  let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];  let b00 = a00 * a11 - a01 * a10;  let b01 = a00 * a12 - a02 * a10;  let b02 = a00 * a13 - a03 * a10;  let b03 = a01 * a12 - a02 * a11;  let b04 = a01 * a13 - a03 * a11;  let b05 = a02 * a13 - a03 * a12;  let b06 = a20 * a31 - a21 * a30;  let b07 = a20 * a32 - a22 * a30;  let b08 = a20 * a33 - a23 * a30;  let b09 = a21 * a32 - a22 * a31;  let b10 = a21 * a33 - a23 * a31;  let b11 = a22 * a33 - a23 * a32;  // Calculate the determinant  let 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 {mat4} a the source matrix * @returns {mat4} out */export function adjoint(out, a) {  let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];  let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];  let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];  let 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 determinant of a mat4 * * @param {mat4} a the source matrix * @returns {Number} determinant of a */export function determinant(a) {  let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];  let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];  let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];  let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];  let b00 = a00 * a11 - a01 * a10;  let b01 = a00 * a12 - a02 * a10;  let b02 = a00 * a13 - a03 * a10;  let b03 = a01 * a12 - a02 * a11;  let b04 = a01 * a13 - a03 * a11;  let b05 = a02 * a13 - a03 * a12;  let b06 = a20 * a31 - a21 * a30;  let b07 = a20 * a32 - a22 * a30;  let b08 = a20 * a33 - a23 * a30;  let b09 = a21 * a32 - a22 * a31;  let b10 = a21 * a33 - a23 * a31;  let b11 = a22 * a33 - a23 * a32;  // Calculate the determinant  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;}/** * Multiplies two mat4s * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */export function multiply(out, a, b) {  let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];  let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];  let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];  let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];  // Cache only the current line of the second matrix  let 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 {mat4} a the matrix to translate * @param {vec3} v vector to translate by * @returns {mat4} out */export function translate(out, a, v) {  let x = v[0], y = v[1], z = v[2];  let a00, a01, a02, a03;  let a10, a11, a12, a13;  let 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 {mat4} a the matrix to scale * @param {vec3} v the vec3 to scale the matrix by * @returns {mat4} out **/export function scale(out, a, v) {  let 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 {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 */export function rotate(out, a, rad, axis) {  let x = axis[0], y = axis[1], z = axis[2];  let len = Math.sqrt(x * x + y * y + z * z);  let s, c, t;  let a00, a01, a02, a03;  let a10, a11, a12, a13;  let a20, a21, a22, a23;  let b00, b01, b02;  let b10, b11, b12;  let b20, b21, b22;  if (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 * * @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 */export function rotateX(out, a, rad) {  let s = Math.sin(rad);  let c = Math.cos(rad);  let a10 = a[4];  let a11 = a[5];  let a12 = a[6];  let a13 = a[7];  let a20 = a[8];  let a21 = a[9];  let a22 = a[10];  let 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 {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */export function rotateY(out, a, rad) {  let s = Math.sin(rad);  let c = Math.cos(rad);  let a00 = a[0];  let a01 = a[1];  let a02 = a[2];  let a03 = a[3];  let a20 = a[8];  let a21 = a[9];  let a22 = a[10];  let 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 {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */export function rotateZ(out, a, rad) {  let s = Math.sin(rad);  let c = Math.cos(rad);  let a00 = a[0];  let a01 = a[1];  let a02 = a[2];  let a03 = a[3];  let a10 = a[4];  let a11 = a[5];  let a12 = a[6];  let 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 {vec3} v Translation vector * @returns {mat4} out */export function fromTranslation(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 */export 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 {vec3} axis the axis to rotate around * @returns {mat4} out */export function fromRotation(out, rad, axis) {  let x = axis[0], y = axis[1], z = axis[2];  let len = Math.sqrt(x * x + y * y + z * z);  let s, c, t;  if (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 */export function fromXRotation(out, rad) {  let s = Math.sin(rad);  let 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 */export function fromYRotation(out, rad) {  let s = Math.sin(rad);  let 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 */export function fromZRotation(out, rad) {  let s = Math.sin(rad);  let 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 {vec3} v Translation vector * @returns {mat4} out */export function fromRotationTranslation(out, q, v) {  // Quaternion math  let x = q[0], y = q[1], z = q[2], w = q[3];  let x2 = x + x;  let y2 = y + y;  let z2 = z + z;  let xx = x * x2;  let xy = x * y2;  let xz = x * z2;  let yy = y * y2;  let yz = y * z2;  let zz = z * z2;  let wx = w * x2;  let wy = w * y2;  let 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 {quat2} a Dual Quaternion * @returns {mat4} mat4 receiving operation result */export function fromQuat2(out, a) {  let translation = new glMatrix.ARRAY_TYPE(3);  let bx = -a[0], by = -a[1], bz = -a[2], bw = a[3],  ax = a[4], ay = a[5], az = a[6], aw = a[7];  let 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(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  {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */export function getTranslation(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  {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */export function getScaling(out, mat) {  let m11 = mat[0];  let m12 = mat[1];  let m13 = mat[2];  let m21 = mat[4];  let m22 = mat[5];  let m23 = mat[6];  let m31 = mat[8];  let m32 = mat[9];  let m33 = mat[10];  out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);  out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);  out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * 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 {mat4} mat Matrix to be decomposed (input) * @return {quat} out */export function getRotation(out, mat) {  // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm  let trace = mat[0] + mat[5] + mat[10];  let S = 0;  if (trace > 0) {    S = Math.sqrt(trace + 1.0) * 2;    out[3] = 0.25 * S;    out[0] = (mat[6] - mat[9]) / S;    out[1] = (mat[8] - mat[2]) / S;    out[2] = (mat[1] - mat[4]) / S;  } else if ((mat[0] > mat[5]) && (mat[0] > mat[10])) {    S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;    out[3] = (mat[6] - mat[9]) / S;    out[0] = 0.25 * S;    out[1] = (mat[1] + mat[4]) / S;    out[2] = (mat[8] + mat[2]) / S;  } else if (mat[5] > mat[10]) {    S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;    out[3] = (mat[8] - mat[2]) / S;    out[0] = (mat[1] + mat[4]) / S;    out[1] = 0.25 * S;    out[2] = (mat[6] + mat[9]) / S;  } else {    S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;    out[3] = (mat[1] - mat[4]) / S;    out[0] = (mat[8] + mat[2]) / S;    out[1] = (mat[6] + mat[9]) / S;    out[2] = 0.25 * S;  }  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); *     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 {vec3} v Translation vector * @param {vec3} s Scaling vector * @returns {mat4} out */export function fromRotationTranslationScale(out, q, v, s) {  // Quaternion math  let x = q[0], y = q[1], z = q[2], w = q[3];  let x2 = x + x;  let y2 = y + y;  let z2 = z + z;  let xx = x * x2;  let xy = x * y2;  let xz = x * z2;  let yy = y * y2;  let yz = y * z2;  let zz = z * z2;  let wx = w * x2;  let wy = w * y2;  let wz = w * z2;  let sx = s[0];  let sy = s[1];  let 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 {vec3} v Translation vector * @param {vec3} s Scaling vector * @param {vec3} o The origin vector around which to scale and rotate * @returns {mat4} out */export function fromRotationTranslationScaleOrigin(out, q, v, s, o) {  // Quaternion math  let x = q[0], y = q[1], z = q[2], w = q[3];  let x2 = x + x;  let y2 = y + y;  let z2 = z + z;  let xx = x * x2;  let xy = x * y2;  let xz = x * z2;  let yy = y * y2;  let yz = y * z2;  let zz = z * z2;  let wx = w * x2;  let wy = w * y2;  let wz = w * z2;  let sx = s[0];  let sy = s[1];  let sz = s[2];  let ox = o[0];  let oy = o[1];  let oz = o[2];  let out0 = (1 - (yy + zz)) * sx;  let out1 = (xy + wz) * sx;  let out2 = (xz - wy) * sx;  let out4 = (xy - wz) * sy;  let out5 = (1 - (xx + zz)) * sy;  let out6 = (yz + wx) * sy;  let out8 = (xz + wy) * sz;  let out9 = (yz - wx) * sz;  let 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 {quat} q Quaternion to create matrix from * * @returns {mat4} out */export function fromQuat(out, q) {  let x = q[0], y = q[1], z = q[2], w = q[3];  let x2 = x + x;  let y2 = y + y;  let z2 = z + z;  let xx = x * x2;  let yx = y * x2;  let yy = y * y2;  let zx = z * x2;  let zy = z * y2;  let zz = z * z2;  let wx = w * x2;  let wy = w * y2;  let 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 */export function frustum(out, left, right, bottom, top, near, far) {  let rl = 1 / (right - left);  let tb = 1 / (top - bottom);  let 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. * 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 */export function perspective(out, fovy, aspect, near, far) {  let f = 1.0 / Math.tan(fovy / 2), nf;  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) {    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;}/** * 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 */export function perspectiveFromFieldOfView(out, fov, near, far) {  let upTan = Math.tan(fov.upDegrees * Math.PI/180.0);  let downTan = Math.tan(fov.downDegrees * Math.PI/180.0);  let leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0);  let rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0);  let xScale = 2.0 / (leftTan + rightTan);  let 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 */export function ortho(out, left, right, bottom, top, near, far) {  let lr = 1 / (left - right);  let bt = 1 / (bottom - top);  let 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. * 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 {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */export function lookAt(out, eye, center, up) {  let x0, x1, x2, y0, y1, y2, z0, z1, z2, len;  let eyex = eye[0];  let eyey = eye[1];  let eyez = eye[2];  let upx = up[0];  let upy = up[1];  let upz = up[2];  let centerx = center[0];  let centery = center[1];  let centerz = center[2];  if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&      Math.abs(eyey - centery) < glMatrix.EPSILON &&      Math.abs(eyez - centerz) < glMatrix.EPSILON) {    return 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;}/** * Generates a matrix that makes something look at something else. * * @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 */export function targetTo(out, eye, target, up) {  let eyex = eye[0],      eyey = eye[1],      eyez = eye[2],      upx = up[0],      upy = up[1],      upz = up[2];  let z0 = eyex - target[0],      z1 = eyey - target[1],      z2 = eyez - target[2];  let len = z0*z0 + z1*z1 + z2*z2;  if (len > 0) {    len = 1 / Math.sqrt(len);    z0 *= len;    z1 *= len;    z2 *= len;  }  let 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 {mat4} a matrix to represent as a string * @returns {String} string representation of the matrix */export function str(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 */export function frob(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) ))}/** * Adds two mat4's * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */export function add(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 {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */export function subtract(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 {mat4} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */export 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 {mat4} a the first operand * @param {mat4} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */export 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 {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */export function exactEquals(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 {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */export function equals(a, b) {  let a0  = a[0],  a1  = a[1],  a2  = a[2],  a3  = a[3];  let a4  = a[4],  a5  = a[5],  a6  = a[6],  a7  = a[7];  let a8  = a[8],  a9  = a[9],  a10 = a[10], a11 = a[11];  let a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];  let b0  = b[0],  b1  = b[1],  b2  = b[2],  b3  = b[3];  let b4  = b[4],  b5  = b[5],  b6  = b[6],  b7  = b[7];  let b8  = b[8],  b9  = b[9],  b10 = b[10], b11 = b[11];  let b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];  return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&          Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&          Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&          Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&          Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&          Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&          Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&          Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&          Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&          Math.abs(a9 - b9) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&          Math.abs(a10 - b10) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&          Math.abs(a11 - b11) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&          Math.abs(a12 - b12) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&          Math.abs(a13 - b13) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&          Math.abs(a14 - b14) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&          Math.abs(a15 - b15) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a15), Math.abs(b15)));}/** * Alias for {@link mat4.multiply} * @function */export const mul = multiply;/** * Alias for {@link mat4.subtract} * @function */export const sub = subtract;</code></pre>        </article>    </section></div><nav>    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-glMatrix.html">glMatrix</a></li><li><a href="module-mat2.html">mat2</a></li><li><a href="module-mat2d.html">mat2d</a></li><li><a href="module-mat3.html">mat3</a></li><li><a href="module-mat4.html">mat4</a></li><li><a href="module-quat.html">quat</a></li><li><a href="module-quat2.html">quat2</a></li><li><a href="module-vec2.html">vec2</a></li><li><a href="module-vec3.html">vec3</a></li><li><a href="module-vec4.html">vec4</a></li></ul></nav><br class="clear"><footer>    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Fri Jul 13 2018 11:51:33 GMT+0200 (W. Europe Daylight Time)</footer><script> prettyPrint(); </script><script src="scripts/linenumber.js"> </script></body></html>
 |