streamana/site/glsl-canvas.min.js.map
2021-08-03 07:58:04 +01:00

1 line
291 KiB
Plaintext

{"version":3,"sources":["src/glsl.ts","../../src/context/chunks.ts","../../node_modules/promise-polyfill/src/index.js","../../node_modules/promise-polyfill/src/finally.js","../../node_modules/promise-polyfill/src/allSettled.js","../../src/logger/logger.ts","../../src/core/common.ts","../../src/context/context.ts","../../src/buffers/buffers.ts","../../src/core/iterable.ts","../../src/geometry/geometry.ts","../../src/geometry/flat-geometry.ts","../../src/math/vector2.ts","../../src/math/vector3.ts","../../src/camera/orbit-camera.ts","../../node_modules/gl-matrix/esm/common.js","../../node_modules/gl-matrix/esm/mat4.js","../../src/textures/textures.ts","../../src/canvas/canvas-timer.ts","../../src/core/subscriber.ts","../../src/geometry/box-geometry.ts","../../src/geometry/sphere-geometry.ts","../../src/geometry/torus-geometry.ts","../../src/loaders/obj-loader.ts","../../src/uniforms/uniforms.ts","../../src/renderer/renderer.ts","../../src/canvas/canvas.ts","../../src/glsl.ts"],"names":["g","f","exports","module","define","amd","globalThis","self","glsl","this","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_inheritsLoose","subClass","superClass","prototype","create","constructor","_setPrototypeOf","o","p","setPrototypeOf","__proto__","_assertThisInitialized","ReferenceError","DefaultWebGLVertexAttributes_","DefaultWebGLFragmentAttributes_","DefaultWebGL2VertexAttributes_","DefaultWebGL2FragmentAttributes_","DefaultWebGLUniform_","DefaultWebGLFlatVertex_","DefaultWebGLMeshVertex_","DefaultWebGLMeshVertex","DefaultWebGL2MeshVertex","DefaultWebGLFlatFragment","DefaultWebGL2FlatFragment","DefaultWebGLMeshFragment","DefaultWebGL2MeshFragment","DefaultWebGLBufferVertex","DefaultWebGL2BufferVertex","DefaultWebGLBufferFragment","DefaultWebGL2BufferFragment","setTimeoutFunc","setTimeout","isArray","x","Boolean","noop","Promise","fn","TypeError","_state","_handled","_value","undefined","_deferreds","doResolve","handle","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","e","reject","promise","resolve","push","newValue","then","finale","thisArg","apply","arguments","_unhandledRejectionFn","len","Handler","done","value","reason","ex","prom","callback","all","arr","args","Array","slice","call","remaining","res","val","allSettled","status","race","setImmediate","err","console","warn","LoggerLevel","Common","fetch","url","xhr","XMLHttpRequest","onload","response","responseText","onerror","error","log","Error","ontimeout","onabort","open","send","getResource","filepath","workpath","indexOf","join","comps","_len","forEach","a","pop","dirname","path","replace","split","ContextVersion","ContextPrecision","ContextMode","Logger","_console","enabled","level","Log","_console2","Warn","_console3","ContextError","ContextDefault","webgl","flat","vertex","fragment","mesh","webgl2","ContextVertexBuffers","Context","getContext_","canvas","options","names","context","getContext","getContext2_","getFragmentVertex","gl","fragmentString","vertexString","isWebGl2","exec","getIncludes","input","match","regex","promises","_loop","index","filePath","nextWorkpath","chunks","isWebGl","WebGLRenderingContext","window","WebGL2RenderingContext","inferVersion","source","WebGl2","WebGl","inferPrecision","precision","versionDiffers","currentVersion","getBufferVertex","getVertex","mode","Flat","version","getFragment","tryInferContext","attributes","extensions","errorCallback","handleError","errorCode","html","container","parentNode","innerHTML","BrowserSupport","inferContext","supportedExtensions","getSupportedExtensions","getExtension","Other","tryGetContext","createShader","type","offset","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","lastError","getShaderInfoLog","deleteShader","createProgram","shaders","locations","program","attachShader","bindAttribLocation","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","useProgram","getProgramInfoLog","deleteProgram","createVertexBuffers","vertexBuffers","texcoordIndex","getAttribLocation","texcoord","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","positionIndex","position","MediumP","BufferFloatType","StringMap","IterableStringMap","values","_proto","has","set","item","get","callbackfn","_this","keys","reduce","initialValue","_this2","previous","Geometry","assign","positions","size","createData_","createAttributes_","createBufferData_","array","buffer","createAttribLocation_","name","location","positionBuffer","positionLocation","texcoords","texcoordBuffer","texcoordLocation","normals","normalBuffer","normalLocation","colors","colorBuffer","colorLocation","attachAttributes_","attribLocation","bindAttributes_","fromIndices","indices","FlatGeometry","_Geometry","Buffer","BW","BH","createFramebuffer","texture","getTexture","texParameteri","TEXTURE_2D","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","getFloatType","getHalfFloatType","extension","HALF_FLOAT","HALF_FLOAT_OES","getInternalFormat","RGBA16F","RGBA","getType","internalFormat","format","createTexture","activeTexture","TEXTURE0","bindTexture","texImage2D","checkFramebufferStatus","FRAMEBUFFER","FRAMEBUFFER_COMPLETE","resize","bindFramebuffer","pixels","minW","Math","min","minH","readPixels","newIndex","newTexture","texSubImage2D","newBuffer","deleteTexture","IOBuffer","isValid","geometry","_proto2","vertexShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","output","render","framebufferTexture2D","COLOR_ATTACHMENT0","clearColor","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","viewport","drawArrays","TRIANGLES","destroy","Buffers","_IterableStringMap","Constructor","protoProps","staticProps","getBuffers","buffers","count","matches","regexp","bufferFragmentString","drawingBufferWidth","drawingBufferHeight","Vector2","y","isVector2","copy","v","sqrt","normalize","divideScalar","scalar","multiplyScalar","subVectors","b","addVectors","Vector3","z","isVector3","crossVectors","ax","ay","az","bx","by","bz","RAD","PI","OrbitCamera","theta","phi","radius","_Vector","mouse","dirty","down","move","max","up","wheel","d","fromVector","vector","acos","atan","toArray","camera","spr","sin","cos","ARRAY_TYPE","out","glMatrix.ARRAY_TYPE","identity","rotate","rad","axis","s","c","t","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","b00","b01","b02","b10","b11","b12","b20","b21","b22","hypot","TextureSourceType","TextureFilteringType","CanvasTimer","delay","current","delta","paused","start","now","performance","play","pause","next","Listener","event","Subscriber","listeners","Set","logListeners","subscribe","listener","add","unsubscribe","delete","unsubscribeAll","on","off","trigger","data","BoxGeometry","faceColors","j","concat","SphereGeometry","ix","iy","phiLength","thetaLength","n","thetaEnd","grid","positionRow","uOffset","u","uvx","uvy","heightDivisions","TorusGeometry","tubularDivisions","radialDivisions","normal","p1","p2","B","T","N","calculatePositionOnCurve","cx","cy","round","q","cu","su","quOverP","cs","COLORS","CI","ObjLoader","load","text","parse","parseIndices","faceIndices","k","l","NaN","parseFaces","F","V","VN","VT","si","vl","fill","rgb","_this3","line","trim","map","parseFloat","parseInt","boundingBox","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","dx","dy","dz","unrapUvw","pitch","asin","yaw","atan2","tx","ty","TextureImageExtensions","TextureVideoExtensions","TextureExtensions","isTextureData","object","UniformMethod","UniformType","Texture","_Subscriber","filtering","Linear","valid","animated","powerOf2","isPowerOf2","isSafari","test","navigator","userAgent","isTextureUrl","isTexture","urlElementOrData","getTextureOptions","getMaxTextureSize","getParameter","MAX_TEXTURE_SIZE","prev","curr","params","decodeURIComponent","document","querySelector","HTMLCanvasElement","HTMLImageElement","HTMLVideoElement","element","width","height","setData","Uint8Array","setUrl","setElement","sourceType","Url","ext","toLowerCase","isVideo","src","createElement","setAttribute","loop","muted","addEventListener","crossOrigin","originalElement","Element","video","update","setFiltering","message","JSON","stringify","Data","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","naturalWidth","naturalHeight","UNSIGNED_BYTE","videoWidth","videoHeight","imageBuffer","tryUpdate","MipMap","wrapS","repeat","REPEAT","wrapT","LINEAR_MIPMAP_LINEAR","LINEAR","generateMipmap","Nearest","Textures","clean","_this4","createOrUpdate","_this5","textureOptions","flag","METHODS_INT","Uniform1i","Uniform2i","Uniform3i","Uniform4i","METHODS_FLOAT","Uniform1f","Uniform2f","Uniform3f","Uniform4f","METHODS_INTV","Uniform1iv","Uniform2iv","Uniform3iv","Uniform4iv","METHODS_FLOATV","Uniform1fv","Uniform2fv","Uniform3fv","Uniform4fv","Uniform","method","UniformMatrix2fv","UniformMatrix3fv","UniformMatrix4fv","getUniformLocation","UniformTexture","_Uniform","Uniforms","isArrayOfInteger","isInteger","isArrayOfNumber","isArrayOfBoolean","isArrayOfTexture","isArrayOfSampler2D","Sampler2D","getType_","Unknown","subject","Float","Bool","getMethod_","isVector","Int","parseUniform","uniform","isDifferent","Renderer","uniforms","textures","textureList","W","H","radians","cache","drawFunc_","drawArrays_","update_","timer","deltaTime","clearDepth","enable","DEPTH_TEST","depthFunc","LEQUAL","CULL_FACE","doubleSided","cullFace","FRONT","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","BACK","create_","createGeometry_","createUniforms_","parseGeometry_","setMode","defaultMesh","hasDelta","hasTime","hasDate","hasMouse","hasCamera","updateUniformDelta_","updateUniformDelta__","updateUniformNoop_","updateUniformTime_","updateUniformTime__","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","updateUniformDate_","updateUniformDate__","updateUniformMouse_","updateUniformMouse__","updateUniformCamera_","updateUniformCamera__","projectionMatrix","mat4","modelViewMatrix","normalMatrix","updateUniformMesh_","updateUniformMesh__","updateProjectionMatrix_","updateModelViewMatrix_","updateNormalMatrix_","updateUniformFlat__","fieldOfView","aspect","fovy","near","far","nf","tan","Infinity","a30","a31","a32","a33","b03","b04","b05","b06","b07","b08","b09","det","Mesh","Box","Sphere","Torus","setMesh","Canvas","_Renderer","visible","controls","vertexPath","fragmentPath","rect","getBoundingClientRect","devicePixelRatio","style","backgroundColor","getShaders_","_","addListeners_","onLoop","items","urls","hasAttribute","getAttribute","body","onScroll","bind","onWheel","onClick","onMove","onMouseDown","onMouseMove","onMouseOver","onMouseOut","onMouseUp","onTouchMove","onTouchEnd","onTouchStart","addCanvasListeners_","removeCanvasListeners_","removeEventListener","removeListeners_","cancelAnimationFrame","rafId","deltaY","toggle","onDown","mx","my","left","top","onUp","clientX","clientY","touch","touches","checkRender","requestAnimationFrame","setUniform_","loadTexture","isVisible_","innerHeight","documentElement","clientHeight","isAnimated_","isDirty_","sizeDidChanged_","CW","ceil","clientWidth","CH","parseTextures_","_this6","fragmentVertexString","createContext_","destroyContext_","swapCanvas_","onError","defaultFragment","classList","remove","parseMode_","parseMesh_","createBuffers_","createTextures_","_this7","_this8","filter","setTexture","updateBuffers_","updateTextures_","_this9","_this10","_this11","canvas_","cloneNode","replaceChild","splice","_this12","keyResolution","setUniform","setUniformOfInt","setUniforms","_this13","of","find","loadAll","getElementsByClassName"],"mappings":"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","file":"dist/umd/glsl-canvas.min.js","sourcesContent":[null,"\nexport const DefaultWebGLVertexAttributes_ = `\n#ifdef GL_ES\nprecision mediump float;\n#endif\n\nattribute vec4 a_position;\nattribute vec4 a_normal;\nattribute vec2 a_texcoord;\nattribute vec4 a_color;\n\nvarying vec4 v_position;\nvarying vec4 v_normal;\nvarying vec2 v_texcoord;\nvarying vec4 v_color;\n`;\n\nexport const DefaultWebGLFragmentAttributes_ = `\n#ifdef GL_ES\nprecision mediump float;\n#endif\n\nvarying vec4 v_position;\nvarying vec4 v_normal;\nvarying vec2 v_texcoord;\nvarying vec4 v_color;\n`;\n\nexport const DefaultWebGL2VertexAttributes_ = `#version 300 es\n\nprecision mediump float;\n\nin vec4 a_position;\nin vec4 a_normal;\nin vec2 a_texcoord;\nin vec4 a_color;\n\nout vec4 v_position;\nout vec4 v_normal;\nout vec2 v_texcoord;\nout vec4 v_color;\n`;\n\nexport const DefaultWebGL2FragmentAttributes_ = `#version 300 es\n\nprecision mediump float;\n\nin vec4 v_position;\nin vec4 v_normal;\nin vec2 v_texcoord;\nin vec4 v_color;\n\nout vec4 outColor;\n`;\n\nexport const DefaultWebGLUniform_ = `\nuniform mat4 u_projectionMatrix;\nuniform mat4 u_modelViewMatrix;\nuniform mat4 u_normalMatrix;\n\nuniform vec2 u_resolution;\nuniform float u_time;\n`;\n\nexport const DefaultWebGL2Uniform_ = DefaultWebGLUniform_;\n\nexport const DefaultWebGLFlatVertex_ = `\nvoid main() {\n\tv_position = a_position;\n\tv_normal = a_normal;\n\tv_texcoord = a_texcoord;\n\tv_color = a_color;\n\tgl_Position = a_position;\n}\n`;\n\nexport const DefaultWebGLMeshVertex_ = `\nvoid main(void) {\n\tv_position = u_projectionMatrix * u_modelViewMatrix * a_position;\n\tv_normal = u_normalMatrix * a_normal;\n\tv_texcoord = a_texcoord;\n\tv_color = a_color;\n\tgl_Position = v_position;\n}\n`;\n\nexport const DefaultWebGLFlatFragment_ = `\nvoid main() {\n\tvec2 st = gl_FragCoord.xy / u_resolution.xy;\n\tst.x *= u_resolution.x / u_resolution.y;\n\tvec3 color = vec3(\n\t\tabs(cos(u_time * 0.1)) * st.y,\n\t\tabs(cos(u_time * 0.2)) * st.y,\n\t\tabs(sin(u_time)) * st.y\n\t);\n\tgl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport const DefaultWebGL2FlatFragment_ = `\nvoid main() {\n\tvec2 st = gl_FragCoord.xy / u_resolution.xy;\n\tst.x *= u_resolution.x / u_resolution.y;\n\tvec3 color = vec3(\n\t\tabs(cos(u_time * 0.1)) * st.y,\n\t\tabs(cos(u_time * 0.2)) * st.y,\n\t\tabs(sin(u_time)) * st.y\n\t);\n\toutColor = vec4(color, 1.0);\n}\n`;\n\nexport const DefaultWebGLMeshFragment_ = `\nvoid main() {\n\tvec2 uv = v_texcoord;\n\tvec3 color = vec3(\n\t\tabs(cos(u_time * 0.1)) * uv.y,\n\t\tabs(cos(u_time * 0.2)) * uv.y,\n\t\tabs(sin(u_time)) * uv.y\n\t);\n\tfloat incidence = max(dot(v_normal.xyz, vec3(0.0, 1.0, 0.0)), 0.0);\n\tvec3 light = vec3(0.2) + (vec3(1.0) * incidence);\n\tgl_FragColor = vec4(v_color.rgb * color * light, 1.0);\n}\n`;\n\nexport const DefaultWebGL2MeshFragment_ = `\nvoid main() {\n\tvec2 uv = v_texcoord;\n\tvec3 color = vec3(\n\t\tabs(cos(u_time * 0.1)) * uv.y,\n\t\tabs(cos(u_time * 0.2)) * uv.y,\n\t\tabs(sin(u_time)) * uv.y\n\t);\n\tfloat incidence = max(dot(v_normal.xyz, vec3(0.0, 1.0, 0.0)), 0.0);\n\tvec3 light = vec3(0.2) + (vec3(1.0) * incidence);\n\toutColor = vec4(v_color.rgb * color * light, 1.0);\n}\n`;\n\nexport const DefaultWebGLBufferFragment_ = `\nvoid main(){\n\tgl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n}`;\n\nexport const DefaultWebGL2BufferFragment_ = `\nvoid main() {\n\toutColor = vec4(0.0, 0.0, 0.0, 1.0);\n}\n`;\n\n//\nexport const DefaultWebGLMeshVertex = DefaultWebGLVertexAttributes_ + DefaultWebGLUniform_ + DefaultWebGLMeshVertex_;\nexport const DefaultWebGL2MeshVertex = DefaultWebGL2VertexAttributes_ + DefaultWebGLUniform_ + DefaultWebGLMeshVertex_;\nexport const DefaultWebGLFlatFragment = DefaultWebGLFragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGLFlatFragment_;\nexport const DefaultWebGL2FlatFragment = DefaultWebGL2FragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGL2FlatFragment_;\nexport const DefaultWebGLMeshFragment = DefaultWebGLFragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGLMeshFragment_;\nexport const DefaultWebGL2MeshFragment = DefaultWebGL2FragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGL2MeshFragment_;\n//\nexport const DefaultWebGLBufferVertex = DefaultWebGLVertexAttributes_ + DefaultWebGLUniform_ + DefaultWebGLFlatVertex_;\nexport const DefaultWebGL2BufferVertex = DefaultWebGL2VertexAttributes_ + DefaultWebGLUniform_ + DefaultWebGLFlatVertex_;\nexport const DefaultWebGLBufferFragment = DefaultWebGLFragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGLBufferFragment_;\nexport const DefaultWebGL2BufferFragment = DefaultWebGL2FragmentAttributes_ + DefaultWebGLUniform_ + DefaultWebGL2BufferFragment_;\n//\n\n","import promiseFinally from './finally';\nimport allSettled from './allSettled';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction isArray(x) {\n return Boolean(x && typeof x.length !== 'undefined');\n}\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array<!Function>} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.all accepts an array'));\n }\n\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.allSettled = allSettled;\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.race accepts an array'));\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n Promise.resolve(arr[i]).then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n // @ts-ignore\n (typeof setImmediate === 'function' &&\n function(fn) {\n // @ts-ignore\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n // @ts-ignore\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","function allSettled(arr) {\n var P = this;\n return new P(function(resolve, reject) {\n if (!(arr && typeof arr.length !== 'undefined')) {\n return reject(\n new TypeError(\n typeof arr +\n ' ' +\n arr +\n ' is not iterable(cannot read property Symbol(Symbol.iterator))'\n )\n );\n }\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n function(e) {\n args[i] = { status: 'rejected', reason: e };\n if (--remaining === 0) {\n resolve(args);\n }\n }\n );\n return;\n }\n }\n args[i] = { status: 'fulfilled', value: val };\n if (--remaining === 0) {\n resolve(args);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n}\n\nexport default allSettled;\n","export enum LoggerLevel {\n\tNone = 0,\n\tError = 1,\n\tWarn = 2,\n\tLog = 3,\n}\n\nexport default class Logger {\n\n\tstatic level: LoggerLevel = LoggerLevel.Warn;\n\n\tstatic enabled: boolean = true;\n\n\tstatic log(...datas: any[]) {\n\t\tif (Logger.enabled && Logger.level >= LoggerLevel.Log) {\n\t\t\tconsole.log(...datas);\n\t\t}\n\t}\n\n\tstatic warn(...datas: any[]) {\n\t\tif (Logger.enabled && Logger.level >= LoggerLevel.Warn) {\n\t\t\tconsole.warn(...datas);\n\t\t}\n\t}\n\n\tstatic error(...datas: any[]) {\n\t\tif (Logger.enabled && Logger.level >= LoggerLevel.Error) {\n\t\t\tconsole.error(...datas);\n\t\t}\n\t}\n\n}\n","import 'promise-polyfill';\n\nexport default class Common {\n\tstatic fetch(url: string): Promise<string> {\n\t\t// console.log('Common.fetch', url);\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tconst xhr: XMLHttpRequest = new XMLHttpRequest();\n\t\t\txhr.onload = function () {\n\t\t\t\tresolve(xhr.response || xhr.responseText);\n\t\t\t};\n\t\t\txhr.onerror = function (error) {\n\t\t\t\tconsole.log('Common.error', error);\n\t\t\t\treject(new Error(`Network request failed for url ${url}`));\n\t\t\t};\n\t\t\txhr.ontimeout = function (error) {\n\t\t\t\t// console.log(error);\n\t\t\t\treject(new Error(`Network request failed for url ${url}`));\n\t\t\t};\n\t\t\txhr.onabort = function () {\n\t\t\t\treject(new Error('Aborted'));\n\t\t\t};\n\t\t\txhr.open('GET', url, true);\n\t\t\txhr.send(null);\n\t\t})\n\t}\n\n\tstatic getResource(filepath: string, workpath: string = ''): string {\n\t\tconst resource: string = (filepath.indexOf(':/') === -1) ? Common.join(workpath, filepath) : filepath;\n\t\treturn resource;\n\t}\n\n\tstatic join(...args: string[]): string {\n\t\tlet comps: string[] = [];\n\t\targs.forEach(a => {\n\t\t\tif (a.indexOf('/') === 0) {\n\t\t\t\tcomps = [];\n\t\t\t}\n\t\t\tconst parts = Common.comps(a);\n\t\t\tparts.forEach(x => {\n\t\t\t\tswitch(x) {\n\t\t\t\t\tcase '.':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '..':\n\t\t\t\t\t\tcomps.pop();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcomps.push(x);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn comps.join('/');\n\t}\n\n\tstatic dirname(path: string): string {\n\t\t// return path.replace(/\\/[^\\/]+\\.\\w+/, '');\n\t\tconst comps: string[] = Common.comps(path);\n\t\tcomps.pop();\n\t\treturn comps.join('/');\n\t}\n\n\tstatic comps(path: string): string[] {\n\t\treturn path.replace(/\\/$/, '').split(/\\/+/);\n\t}\n}\n","import Common from '../core/common';\nimport Logger from '../logger/logger';\nimport { DefaultWebGL2BufferVertex, DefaultWebGL2FlatFragment, DefaultWebGL2MeshFragment, DefaultWebGL2MeshVertex, DefaultWebGLBufferVertex, DefaultWebGLFlatFragment, DefaultWebGLMeshFragment, DefaultWebGLMeshVertex } from './chunks';\n\nexport enum ContextVersion {\n\tWebGl = 'webgl',\n\tWebGl2 = 'webgl2',\n}\n\nexport enum ContextPrecision {\n\tLowP = 'lowp',\n\tMediumP = 'mediump',\n\tHighP = 'highp',\n}\n\nexport enum ContextMode {\n\tFlat = 'flat',\n\tBox = 'box',\n\tSphere = 'sphere',\n\tTorus = 'torus',\n\tMesh = 'mesh',\n}\n\nexport const ContextDefault = {\n\t'webgl': {\n\t\t'flat': {\n\t\t\tvertex: DefaultWebGLMeshVertex,\n\t\t\tfragment: DefaultWebGLFlatFragment,\n\t\t},\n\t\t'mesh': {\n\t\t\tvertex: DefaultWebGLMeshVertex,\n\t\t\tfragment: DefaultWebGLMeshFragment,\n\t\t}\n\t},\n\t'webgl2': {\n\t\t'flat': {\n\t\t\tvertex: DefaultWebGL2MeshVertex,\n\t\t\tfragment: DefaultWebGL2FlatFragment,\n\t\t},\n\t\t'mesh': {\n\t\t\tvertex: DefaultWebGL2MeshVertex,\n\t\t\tfragment: DefaultWebGL2MeshFragment,\n\t\t}\n\t}\n};\n\nexport enum ContextError {\n\tBrowserSupport = 1,\n\tOther = 2,\n}\n\nexport class ContextVertexBuffers {\n\ttexcoord: WebGLBuffer;\n\tposition: WebGLBuffer;\n}\n\nexport default class Context {\n\n\tstatic precision: ContextPrecision = ContextPrecision.MediumP;\n\tstatic lastError: string = '';\n\n\tstatic getContext_(canvas: HTMLCanvasElement, options?: WebGLContextAttributes): WebGLRenderingContext {\n\t\tconst names = ['webgl', 'experimental-webgl'];\n\t\tlet context = null;\n\t\tfor (let i = 0; i < names.length; ++i) {\n\t\t\ttry {\n\t\t\t\tcontext = canvas.getContext(names[i], options) as WebGLRenderingContext;\n\t\t\t} catch (e) {\n\t\t\t\tif (context) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn context;\n\t}\n\n\tstatic getContext2_(canvas: HTMLCanvasElement, options?: WebGLContextAttributes): WebGL2RenderingContext {\n\t\tlet context = null;\n\t\ttry {\n\t\t\tcontext = canvas.getContext('webgl2', options) as WebGL2RenderingContext;\n\t\t} catch (e) {\n\t\t\t// console.error('GlslCanvas.Context.getContext2_.error', e);\n\t\t}\n\t\treturn context;\n\t}\n\n\tstatic getFragmentVertex(gl: WebGLRenderingContext | WebGL2RenderingContext, fragmentString: string): string {\n\t\tlet vertexString;\n\t\tif (fragmentString) {\n\t\t\tif (Context.isWebGl2(gl)) {\n\t\t\t\tfragmentString = fragmentString.replace(/^\\#version\\s*300\\s*es\\s*\\n/, '');\n\t\t\t}\n\t\t\tconst regexp = /(?:^\\s*)((?:#if|#elif)(?:\\s*)(defined\\s*\\(\\s*VERTEX)(?:\\s*\\))|(?:#ifdef)(?:\\s*VERTEX)(?:\\s*))/gm;\n\t\t\tconst matches = regexp.exec(fragmentString);\n\t\t\tif (matches !== null) {\n\t\t\t\tvertexString = Context.isWebGl2(gl) ? `#version 300 es\n#define VERTEX\n${fragmentString}` : `#define VERTEX\n${fragmentString}`;\n\t\t\t}\n\t\t}\n\t\t// console.log('vertexString', vertexString);\n\t\treturn vertexString;\n\t}\n\n\tstatic getIncludes(input: string | undefined, workpath: string = ''): Promise<string | undefined> {\n\t\tif (input === undefined) {\n\t\t\treturn Promise.resolve(input);\n\t\t}\n\t\tconst regex = /#include\\s*['|\"](.*.glsl)['|\"]/gm;\n\t\tconst promises = [];\n\t\tlet i = 0;\n\t\tlet match;\n\t\twhile ((match = regex.exec(input)) !== null) {\n\t\t\tpromises.push(Promise.resolve(input.slice(i, match.index)));\n\t\t\ti = match.index + match[0].length;\n\t\t\tconst filePath = match[1];\n\t\t\tconst url = Common.getResource(filePath, workpath);\n\t\t\tconst nextWorkpath = filePath.indexOf(':/') === -1 ? Common.dirname(url) : '';\n\t\t\tpromises.push(Common.fetch(url).then(input => Context.getIncludes(input, nextWorkpath)));\n\t\t}\n\t\tpromises.push(Promise.resolve(input.slice(i)));\n\t\treturn Promise.all(promises).then(chunks => {\n\t\t\treturn chunks.join('');\n\t\t});\n\t}\n\n\tstatic isWebGl(context: WebGLRenderingContext | WebGL2RenderingContext): boolean {\n\t\treturn context instanceof WebGLRenderingContext;\n\t}\n\n\tstatic isWebGl2(context: WebGLRenderingContext | WebGL2RenderingContext): boolean {\n\t\t// console.log(context);\n\t\t// return context !== undefined && typeof (context as any).bindBufferRange === 'function';\n\t\treturn (window as any).WebGL2RenderingContext && context instanceof WebGL2RenderingContext;\n\t}\n\n\tstatic inferVersion(vertexString?: string, fragmentString?: string): ContextVersion {\n\t\tconst source: string = vertexString || fragmentString;\n\t\tif (source) {\n\t\t\treturn source.indexOf('#version 300 es') === 0 ? ContextVersion.WebGl2 : ContextVersion.WebGl;\n\t\t} else {\n\t\t\treturn ContextVersion.WebGl;\n\t\t}\n\t}\n\n\tstatic inferPrecision(fragmentString: string): ContextPrecision {\n\t\tconst precision: RegExpMatchArray = fragmentString.match(/precision\\s+(.+)\\s+float/);\n\t\tif (precision && precision.length > 1) {\n\t\t\tContext.precision = precision[1] as ContextPrecision;\n\t\t}\n\t\t// console.log('precision', Context.precision);\n\t\treturn Context.precision;\n\t}\n\n\tstatic versionDiffers(gl: WebGLRenderingContext | WebGL2RenderingContext, vertexString?: string, fragmentString?: string): boolean {\n\t\tif (gl) {\n\t\t\tconst currentVersion = this.isWebGl2(gl) ? ContextVersion.WebGl2 : ContextVersion.WebGl;\n\t\t\tconst newVersion = Context.inferVersion(vertexString, fragmentString);\n\t\t\treturn newVersion !== currentVersion;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic getBufferVertex(gl: WebGLRenderingContext | WebGL2RenderingContext): string {\n\t\treturn this.isWebGl2(gl) ? DefaultWebGL2BufferVertex : DefaultWebGLBufferVertex;\n\t}\n\n\tstatic getVertex(vertexString?: string, fragmentString?: string, mode: ContextMode = ContextMode.Flat): string {\n\t\tif (vertexString) {\n\t\t\treturn vertexString;\n\t\t} else {\n\t\t\tconst version: ContextVersion = this.inferVersion(vertexString, fragmentString);\n\t\t\treturn ContextDefault[version][mode === ContextMode.Flat ? 'flat' : 'mesh'].vertex;\n\t\t}\n\t}\n\n\tstatic getFragment(vertexString?: string, fragmentString?: string, mode: ContextMode = ContextMode.Flat): string {\n\t\tif (fragmentString) {\n\t\t\treturn fragmentString;\n\t\t} else {\n\t\t\tconst version: ContextVersion = this.inferVersion(vertexString, fragmentString);\n\t\t\treturn ContextDefault[version][mode === ContextMode.Flat ? 'flat' : 'mesh'].fragment;\n\t\t}\n\t}\n\n\tstatic tryInferContext(vertexString: string, fragmentString: string, canvas: HTMLCanvasElement, attributes: WebGLContextAttributes, extensions: string[] = [], errorCallback: Function): WebGLRenderingContext | WebGL2RenderingContext {\n\t\tfunction handleError(errorCode: number, html: string) {\n\t\t\tif (typeof errorCallback === 'function') {\n\t\t\t\terrorCallback(errorCode);\n\t\t\t} else {\n\t\t\t\tconst container = canvas.parentNode;\n\t\t\t\tif (container) {\n\t\t\t\t\t(container as HTMLElement).innerHTML = `<div class=\"glsl-canvas--error\">${html}</div>`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!WebGLRenderingContext) {\n\t\t\thandleError(ContextError.BrowserSupport, `This page requires a browser that supports WebGL.<br/>\n\t\t\t<a href=\"http://get.webgl.org\">Click here to upgrade your browser.</a>`);\n\t\t\treturn null;\n\t\t}\n\t\tconst context: WebGLRenderingContext | WebGL2RenderingContext = Context.inferContext(vertexString, fragmentString, canvas, attributes);\n\t\tif (!context) {\n\t\t\thandleError(ContextError.Other, `It does not appear your computer can support WebGL.<br/>\n\t\t\t<a href=\"http://get.webgl.org/troubleshooting/\">Click here for more information.</a>`);\n\t\t} else {\n\t\t\tif (!(this.isWebGl2(context)) && extensions.indexOf('OES_standard_derivatives') === -1) {\n\t\t\t\textensions.push('OES_standard_derivatives');\n\t\t\t}\n\t\t\tconst supportedExtensions = context.getSupportedExtensions();\n\t\t\textensions.forEach(key => {\n\t\t\t\tif (supportedExtensions.indexOf(key) !== -1) {\n\t\t\t\t\tcontext.getExtension(key);\n\t\t\t\t} else {\n\t\t\t\t\tLogger.warn(`GlslCanvas ${key} not supported`);\n\t\t\t\t}\n\t\t\t});\n\t\t\t// context.getExtension('OES_standard_derivatives');\n\t\t}\n\t\treturn context;\n\t}\n\n\tstatic tryGetContext(canvas: HTMLCanvasElement, attributes: WebGLContextAttributes, errorCallback: Function): WebGLRenderingContext {\n\t\tfunction handleError(errorCode: number, html: string) {\n\t\t\tif (typeof errorCallback === 'function') {\n\t\t\t\terrorCallback(errorCode);\n\t\t\t} else {\n\t\t\t\tconst container = canvas.parentNode;\n\t\t\t\tif (container) {\n\t\t\t\t\t(container as HTMLElement).innerHTML = `<div class=\"glsl-canvas--error\">${html}</div>`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!WebGLRenderingContext) {\n\t\t\thandleError(ContextError.BrowserSupport, `This page requires a browser that supports WebGL.<br/>\n\t\t\t<a href=\"http://get.webgl.org\">Click here to upgrade your browser.</a>`);\n\t\t\treturn null;\n\t\t}\n\t\tconst context: WebGLRenderingContext = Context.getContext_(canvas, attributes);\n\t\tif (!context) {\n\t\t\thandleError(ContextError.Other, `It does not appear your computer can support WebGL.<br/>\n\t\t\t<a href=\"http://get.webgl.org/troubleshooting/\">Click here for more information.</a>`);\n\t\t} else {\n\t\t\tcontext.getExtension('OES_standard_derivatives');\n\t\t}\n\t\treturn context;\n\t}\n\n\tstatic inferContext(vertexString: string, fragmentString: string, canvas: HTMLCanvasElement, options?: WebGLContextAttributes): WebGLRenderingContext | WebGL2RenderingContext {\n\t\tconst version: ContextVersion = this.inferVersion(vertexString, fragmentString);\n\t\treturn version === ContextVersion.WebGl2 ? this.getContext2_(canvas, options) : this.getContext_(canvas, options);\n\t}\n\n\tstatic createShader(gl: WebGLRenderingContext | WebGL2RenderingContext, source: string, type: number, offset: number = 0): WebGLShader {\n\t\tconst shader = gl.createShader(type);\n\t\tsource = source.replace(/precision\\s+(.+)\\s+float/, `precision ${Context.precision} float`);\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tconst compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\t\tif (!compiled) {\n\t\t\t// Something went wrong during compilation; get the error\n\t\t\tContext.lastError = gl.getShaderInfoLog(shader);\n\t\t\t// console.log('lastError', Context.lastError);\n\t\t\tLogger.error(`*** Error compiling shader: ${Context.lastError}`);\n\t\t\t// main.trigger('error', {\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow ({\n\t\t\t\tshader: shader,\n\t\t\t\tsource: source,\n\t\t\t\ttype: type,\n\t\t\t\terror: Context.lastError,\n\t\t\t\toffset: offset\n\t\t\t});\n\t\t}\n\t\treturn shader;\n\t}\n\n\tstatic createProgram(gl: WebGLRenderingContext | WebGL2RenderingContext, shaders: WebGLShader[], attributes?: any[], locations?: number[]): WebGLProgram {\n\t\tconst program = gl.createProgram();\n\t\tfor (let i = 0; i < shaders.length; ++i) {\n\t\t\tgl.attachShader(program, shaders[i]);\n\t\t}\n\t\tif (attributes && locations) {\n\t\t\tfor (let i = 0; i < attributes.length; ++i) {\n\t\t\t\tgl.bindAttribLocation(program, locations ? locations[i] : i, attributes[i]);\n\t\t\t}\n\t\t}\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\t// Check the link status\n\t\tconst linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n\t\tif (!linked) {\n\t\t\t// something went wrong with the link\n\t\t\tContext.lastError = gl.getProgramInfoLog(program);\n\t\t\tLogger.error(`Error in program linking: ${Context.lastError}`);\n\t\t\tgl.deleteProgram(program);\n\t\t\treturn null;\n\t\t}\n\t\tgl.useProgram(program);\n\t\treturn program;\n\t}\n\n\tstatic createVertexBuffers(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram): ContextVertexBuffers {\n\t\tconst vertexBuffers: ContextVertexBuffers = new ContextVertexBuffers();\n\t\tconst texcoordIndex: number = gl.getAttribLocation(program, 'a_texcoord');\n\t\tvertexBuffers.texcoord = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffers.texcoord);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(texcoordIndex);\n\t\tgl.vertexAttribPointer(texcoordIndex, 2, gl.FLOAT, false, 0, 0);\n\t\tconst positionIndex: number = gl.getAttribLocation(program, 'a_position');\n\t\tvertexBuffers.position = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffers.position);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(positionIndex);\n\t\tgl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\t\treturn vertexBuffers;\n\t}\n}\n","import { DefaultWebGL2BufferFragment, DefaultWebGLBufferFragment } from '../context/chunks';\nimport Context from '../context/context';\nimport IterableStringMap from '../core/iterable';\nimport FlatGeometry from '../geometry/flat-geometry';\nimport Geometry from '../geometry/geometry';\n\nexport enum BufferFloatType {\n\tFLOAT = 0,\n\tHALF_FLOAT,\n}\n\nexport class Buffer {\n\n\ttexture: WebGLTexture;\n\tbuffer: WebGLFramebuffer;\n\tBW: number;\n\tBH: number;\n\tindex: number;\n\n\tstatic type: BufferFloatType = BufferFloatType.HALF_FLOAT;\n\n\tstatic getFloatType(gl: WebGLRenderingContext | WebGL2RenderingContext): number | null {\n\t\tlet extension: any;\n\t\tif (Context.isWebGl2(gl)) {\n\t\t\textension = gl.getExtension('EXT_color_buffer_float');\n\t\t\tif (extension) {\n\t\t\t\treturn gl.FLOAT;\n\t\t\t}\n\t\t}\n\t\textension = gl.getExtension('OES_texture_float');\n\t\tif (extension) {\n\t\t\treturn gl.FLOAT;\n\t\t}\n\t\treturn null;\n\t}\n\n\tstatic getHalfFloatType(gl: WebGLRenderingContext | WebGL2RenderingContext): number | null {\n\t\tlet extension: any;\n\t\tif (Context.isWebGl2(gl)) {\n\t\t\textension = gl.getExtension('EXT_color_buffer_half_float') || gl.getExtension('EXT_color_buffer_float');\n\t\t\tif (extension) {\n\t\t\t\treturn (gl as WebGL2RenderingContext).HALF_FLOAT;\n\t\t\t}\n\t\t}\n\t\textension = gl.getExtension('OES_texture_half_float');\n\t\tif (extension) {\n\t\t\treturn extension.HALF_FLOAT_OES || null;\n\t\t}\n\t\treturn null;\n\t}\n\n\tstatic getInternalFormat(gl: WebGLRenderingContext | WebGL2RenderingContext): number {\n\t\treturn (Context.isWebGl2(gl) ? (gl as WebGL2RenderingContext).RGBA16F : gl.RGBA);\n\t}\n\n\tstatic getType(gl: WebGLRenderingContext | WebGL2RenderingContext): number {\n\t\tlet type: number;\n\t\tif (Buffer.type === BufferFloatType.HALF_FLOAT) {\n\t\t\ttype = Buffer.getHalfFloatType(gl);\n\t\t\tif (type) {\n\t\t\t\treturn type;\n\t\t\t} else {\n\t\t\t\tBuffer.type = BufferFloatType.FLOAT;\n\t\t\t\treturn Buffer.getType(gl);\n\t\t\t}\n\t\t} else {\n\t\t\ttype = Buffer.getFloatType(gl);\n\t\t\tif (type) {\n\t\t\t\treturn type;\n\t\t\t} else {\n\t\t\t\tBuffer.type = BufferFloatType.HALF_FLOAT;\n\t\t\t\treturn Buffer.getType(gl);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic getTexture(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number, index: number): WebGLTexture {\n\t\tconst internalFormat = Buffer.getInternalFormat(gl);\n\t\tconst format = gl.RGBA;\n\t\tconst type = Buffer.getType(gl);\n\t\tconst texture = gl.createTexture();\n\t\tgl.activeTexture(gl.TEXTURE0 + index);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, BW, BH, 0, format, type, null);\n\t\tconst status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\t\tif (status !== gl.FRAMEBUFFER_COMPLETE) {\n\t\t\tif (Buffer.type === BufferFloatType.FLOAT) {\n\t\t\t\tBuffer.type = BufferFloatType.HALF_FLOAT;\n\t\t\t} else {\n\t\t\t\tBuffer.type = BufferFloatType.FLOAT;\n\t\t\t}\n\t\t\treturn Buffer.getTexture(gl, BW, BH, index);\n\t\t}\n\t\t// console.log('getTexture', 'internalFormat', internalFormat === (gl as WebGL2RenderingContext).RGBA16F, 'format', format === gl.RGBA, 'type', type === (gl as WebGL2RenderingContext).HALF_FLOAT, 'status', status === gl.FRAMEBUFFER_COMPLETE);\n\t\treturn texture;\n\t}\n\n\tconstructor(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number, index: number) {\n\t\tconst buffer = gl.createFramebuffer();\n\t\tconst texture = Buffer.getTexture(gl, BW, BH, index);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tthis.texture = texture;\n\t\tthis.buffer = buffer;\n\t\tthis.BW = BW;\n\t\tthis.BH = BH;\n\t\tthis.index = index;\n\t}\n\n\tresize(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number) {\n\t\tif (BW !== this.BW || BH !== this.BH) {\n\t\t\tconst buffer = this.buffer;\n\t\t\tconst texture = this.texture;\n\t\t\tconst index = this.index;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, buffer);\n\t\t\tconst status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\t\t\tconst minW = Math.min(BW, this.BW);\n\t\t\tconst minH = Math.min(BH, this.BH);\n\t\t\tlet pixels: Float32Array;\n\t\t\tlet type = Buffer.getType(gl);\n\t\t\tif (status === gl.FRAMEBUFFER_COMPLETE) {\n\t\t\t\tpixels = new Float32Array(minW * minH * 4);\n\t\t\t\tgl.readPixels(0, 0, minW, minH, gl.RGBA, type, pixels);\n\t\t\t}\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tconst newIndex = index + 1; // temporary index\n\t\t\tconst newTexture = Buffer.getTexture(gl, BW, BH, newIndex);\n\t\t\ttype = Buffer.getType(gl);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\tif (pixels) {\n\t\t\t\tgl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, minW, minH, gl.RGBA, type, pixels);\n\t\t\t}\n\t\t\tconst newBuffer = gl.createFramebuffer();\n\t\t\t/*\n\t\t\tif (!newBuffer) {\n\t\t\t\tLogger.error('Failed to create the frame buffer object');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t*/\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tgl.deleteTexture(texture);\n\t\t\tgl.activeTexture(gl.TEXTURE0 + index);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, newTexture);\n\t\t\tthis.index = index;\n\t\t\tthis.texture = newTexture;\n\t\t\tthis.buffer = newBuffer;\n\t\t\tthis.BW = BW;\n\t\t\tthis.BH = BH;\n\t\t\t// console.log('resize', newBuffer);\n\t\t}\n\t}\n}\n\nexport class IOBuffer {\n\n\tprogram: WebGLProgram;\n\tgeometry: Geometry;\n\tinput: Buffer;\n\toutput: Buffer;\n\tindex: number;\n\tkey: string;\n\tvertexString: string;\n\tfragmentString: string;\n\tBW: number;\n\tBH: number;\n\tisValid: boolean = false;\n\n\tconstructor(index: number, key: string, vertexString: string, fragmentString: string) {\n\t\tthis.index = index;\n\t\tthis.key = key;\n\t\tthis.vertexString = vertexString;\n\t\tthis.fragmentString = fragmentString;\n\t\tthis.geometry = new FlatGeometry();\n\t}\n\n\tcreate(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number) {\n\t\t// BW = BH = 1024;\n\t\tconst vertexShader = Context.createShader(gl, this.vertexString, gl.VERTEX_SHADER);\n\t\tlet fragmentShader = Context.createShader(gl, this.fragmentString, gl.FRAGMENT_SHADER, 1);\n\t\tif (!fragmentShader) {\n\t\t\tfragmentShader = Context.createShader(gl, Context.isWebGl2(gl) ? DefaultWebGL2BufferFragment : DefaultWebGLBufferFragment, gl.FRAGMENT_SHADER);\n\t\t\tthis.isValid = false;\n\t\t} else {\n\t\t\tthis.isValid = true;\n\t\t}\n\t\tconst program = Context.createProgram(gl, [vertexShader, fragmentShader]);\n\t\tif (!program) {\n\t\t\tthis.isValid = false;\n\t\t\tgl.deleteShader(vertexShader);\n\t\t\tgl.deleteShader(fragmentShader);\n\t\t\treturn;\n\t\t}\n\t\tthis.geometry.create(gl, program);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\t\tconst input = new Buffer(gl, BW, BH, this.index + 0);\n\t\tconst output = new Buffer(gl, BW, BH, this.index + 2);\n\t\tthis.program = program;\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t\t// console.log(geometry.position.length / 3, geometry.size);\n\t\t// console.log(gl.getProgramInfoLog(program));\n\t\t// Context.lastError = gl.getProgramInfoLog(program);\n\t\t// Logger.warn(`Error in program linking: ${Context.lastError}`);\n\t}\n\n\trender(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number) {\n\t\t// BW = BH = 1024;\n\t\tgl.useProgram(this.program);\n\t\t// gl.activeTexture(gl.TEXTURE0);\n\t\t// gl.bindTexture(gl.TEXTURE_2D, this.input.texture);\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.output.buffer);\n\t\t// gl.bindTexture(gl.TEXTURE_2D, this.output.texture);\n\t\t// console.log(this.output.texture);\n\t\t// console.log('binding', gl.getParameter(gl.FRAMEBUFFER_BINDING));\n\t\t// gl.enable(gl.DEPTH_TEST); // Enable depth testing\n\t\t// gl.depthFunc(gl.LEQUAL); // Near things obscure far things\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.output.texture, 0);\n\t\tconst status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\t\tif (status === gl.FRAMEBUFFER_COMPLETE) {\n\t\t\t// Clear the canvas before we start drawing on it.\n\t\t\tgl.clearColor(0, 0, 0, 1); // black\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\t\t}\n\t\t// this.geometry.createAttributes_(gl, this.program);\n\t\t// this.geometry.bindAttributes_(gl, this.program);\n\t\tgl.viewport(0, 0, BW, BH);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, this.geometry.size);\n\t\t// console.log(this.geometry.size);\n\t\t// gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t// console.log(BW, BH);\n\t\t// console.log(gl.getProgramInfoLog(this.program));\n\t\t// swap\n\t\tconst input = this.input;\n\t\t// const output = this.output;\n\t\tthis.input = this.output;\n\t\tthis.output = input;\n\t\t// console.log('swap');\n\t}\n\n\tresize(gl: WebGLRenderingContext | WebGL2RenderingContext, BW: number, BH: number) {\n\t\t// BW = BH = 1024;\n\t\tgl.useProgram(this.program);\n\t\tgl.viewport(0, 0, BW, BH);\n\t\tthis.input.resize(gl, BW, BH);\n\t\tthis.output.resize(gl, BW, BH);\n\t}\n\n\tdestroy(gl: WebGLRenderingContext | WebGL2RenderingContext) {\n\t\tgl.deleteProgram(this.program);\n\t\tthis.program = null;\n\t\tthis.input = null;\n\t\tthis.output = null;\n\t}\n}\n\nexport default class Buffers extends IterableStringMap<IOBuffer> {\n\n\tget count(): number {\n\t\treturn Object.keys(this.values).length * 4;\n\t}\n\n\tstatic getBuffers(gl: WebGLRenderingContext | WebGL2RenderingContext, fragmentString: string, vertexString: string): Buffers {\n\t\tconst buffers: Buffers = new Buffers();\n\t\tlet count = 0;\n\t\tif (fragmentString) {\n\t\t\tif (Context.isWebGl2(gl)) {\n\t\t\t\tfragmentString = fragmentString.replace(/^\\#version\\s*300\\s*es\\s*\\n/, '');\n\t\t\t}\n\t\t\tconst regexp = /(?:^\\s*)((?:#if|#elif)(?:\\s*)(defined\\s*\\(\\s*BUFFER_)(\\d+)(?:\\s*\\))|(?:#ifdef)(?:\\s*BUFFER_)(\\d+)(?:\\s*))/gm;\n\t\t\tlet matches;\n\t\t\twhile ((matches = regexp.exec(fragmentString)) !== null) {\n\t\t\t\tconst i = matches[3] || matches[4];\n\t\t\t\tconst key = 'u_buffer' + i;\n\t\t\t\tconst bufferFragmentString = Context.isWebGl2(gl) ? `#version 300 es\n#define BUFFER_${i}\n${fragmentString}` : `#define BUFFER_${i}\n${fragmentString}`;\n\t\t\t\tconst buffer = new IOBuffer(count, key, vertexString, bufferFragmentString);\n\t\t\t\tbuffer.create(gl, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\t\t\t\tif (buffer.program) {\n\t\t\t\t\tbuffers.set(key, buffer);\n\t\t\t\t} else {\n\t\t\t\t\tthrow (`buffer error ${key}`);\n\t\t\t\t}\n\t\t\t\tcount += 4;\n\t\t\t}\n\t\t}\n\t\treturn buffers;\n\t}\n}\n","export class NumberMap<T> { [key: number]: T; };\nexport class StringMap<T> { [key: string]: T; };\n\nexport default class IterableStringMap<T> {\n\n\tvalues: StringMap<T> = new StringMap<T>();\n\n\thas(key: string) {\n\t\treturn key in this.values;\n\t\t// return this.values.hasOwnProperty(key);\n\t}\n\n\tset(key: string, item: T) {\n\t\tthis.values[key] = item;\n\t}\n\n\tget(key: string): T {\n\t\treturn this.values[key];\n\t}\n\n\tforEach(callbackfn: Function) {\n\t\tlet i = 0;\n\t\tObject.keys(this.values).forEach((key) => {\n\t\t\tcallbackfn(this.values[key], i, this.values);\n\t\t\ti++;\n\t\t});\n\t}\n\n\treduce(callbackfn: Function, initialValue?: any) {\n\t\tlet previous = initialValue, i = 0;\n\t\tObject.keys(this.values).forEach((key) => {\n\t\t\tprevious = callbackfn(previous, this.values[key], i, this.values);\n\t\t\ti++;\n\t\t});\n\t\treturn previous;\n\t}\n\n}\n","export interface IGeometry {\n\tpositions: number[];\n\tcolors: number[];\n\tnormals: number[];\n\ttexcoords: number[];\n}\n\nexport default class Geometry implements IGeometry {\n\n\tpositions: number[];\n\tcolors: number[];\n\tnormals: number[];\n\ttexcoords: number[];\n\n\tpositionBuffer: WebGLBuffer;\n\tcolorBuffer: WebGLBuffer;\n\tnormalBuffer: WebGLBuffer;\n\ttexcoordBuffer: WebGLBuffer;\n\n\tpositionLocation: number;\n\tcolorLocation: number;\n\tnormalLocation: number;\n\ttexcoordLocation: number;\n\n\tsize: number;\n\n\tconstructor(options?: IGeometry) {\n\t\tif (options) {\n\t\t\tObject.assign(this, options);\n\t\t\tif (this.positions) {\n\t\t\t\tthis.size = this.positions.length / 3;\n\t\t\t}\n\t\t\t// this.positions = Geometry.fromIndices(options.indices, options.positions, 3);\n\t\t\t// this.normals = Geometry.fromIndices(options.indices, options.normals, 3);\n\t\t\t// this.texcoords = Geometry.fromIndices(options.indices, options.texcoords, 2);\n\t\t\t// this.colors = Geometry.fromIndices(options.indices, options.colors, 4);\n\t\t}\n\t}\n\n\tcreate(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) {\n\t\tthis.createData_();\n\t\tthis.createAttributes_(gl, program);\n\t}\n\n\tcreateBufferData_(gl: WebGLRenderingContext | WebGL2RenderingContext, type: number, array: BufferSource) {\n\t\tconst buffer = gl.createBuffer();\n\t\tgl.bindBuffer(type, buffer);\n\t\tgl.bufferData(type, array, gl.STATIC_DRAW);\n\t\treturn buffer;\n\t}\n\n\tcreateAttribLocation_(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram, name: string, size: number, type: number) {\n\t\tconst location: number = gl.getAttribLocation(program, name);\n\t\tgl.enableVertexAttribArray(location);\n\t\tgl.vertexAttribPointer(location, size, type, false, 0, 0);\n\t\treturn location;\n\t}\n\n\tcreateAttributes_(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) {\n\t\tif (this.positions) {\n\t\t\tthis.positionBuffer = this.createBufferData_(gl, gl.ARRAY_BUFFER, new Float32Array(this.positions));\n\t\t\tthis.positionLocation = this.createAttribLocation_(gl, program, 'a_position', this.positions.length / this.size, gl.FLOAT);\n\t\t\tgl.bindAttribLocation(program, this.positionLocation, 'a_position');\n\t\t}\n\t\tif (this.texcoords) {\n\t\t\tthis.texcoordBuffer = this.createBufferData_(gl, gl.ARRAY_BUFFER, new Float32Array(this.texcoords));\n\t\t\tthis.texcoordLocation = this.createAttribLocation_(gl, program, 'a_texcoord', this.texcoords.length / this.size, gl.FLOAT);\n\t\t\tgl.bindAttribLocation(program, this.texcoordLocation, 'a_texcoord');\n\t\t}\n\t\tif (this.normals) {\n\t\t\tthis.normalBuffer = this.createBufferData_(gl, gl.ARRAY_BUFFER, new Float32Array(this.normals));\n\t\t\tthis.normalLocation = this.createAttribLocation_(gl, program, 'a_normal', this.normals.length / this.size, gl.FLOAT);\n\t\t\tgl.bindAttribLocation(program, this.normalLocation, 'a_normal');\n\t\t}\n\t\tif (this.colors) {\n\t\t\tthis.colorBuffer = this.createBufferData_(gl, gl.ARRAY_BUFFER, new Float32Array(this.colors));\n\t\t\tthis.colorLocation = this.createAttribLocation_(gl, program, 'a_color', this.colors.length / this.size, gl.FLOAT);\n\t\t\tgl.bindAttribLocation(program, this.colorLocation, 'a_color');\n\t\t}\n\t\t// console.log('positionLocation', this.positionLocation);\n\t\t// console.log('texcoordLocation', this.texcoordLocation);\n\t\t// console.log('normalLocation', this.normalLocation);\n\t\t// console.log('colorLocation', this.colorLocation);\n\t}\n\n\tattachAttributes_(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) {\n\t\tlet attribLocation: number;\n\t\tif (this.positions) {\n\t\t\t// this.positionLocation = this.createAttribLocation_(gl, program, 'a_position', this.positions.length / this.size, gl.FLOAT);\n\t\t\tattribLocation = gl.getAttribLocation(program, 'a_position');\n\t\t\tgl.enableVertexAttribArray(attribLocation);\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n\t\t\tgl.vertexAttribPointer(attribLocation, this.positions.length / this.size, gl.FLOAT, false, 0, 0);\n\t\t\t// gl.bindAttribLocation(program, this.positionLocation, 'a_position');\n\t\t\t// console.log('positionLocation', attribLocation);\n\t\t}\n\t\tif (this.texcoords) {\n\t\t\t// this.texcoordLocation = this.createAttribLocation_(gl, program, 'a_texcoord', this.texcoords.length / this.size, gl.FLOAT);\n\t\t\tattribLocation = gl.getAttribLocation(program, 'a_texcoord');\n\t\t\tgl.enableVertexAttribArray(this.texcoordLocation);\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.texcoordBuffer);\n\t\t\tgl.vertexAttribPointer(this.texcoordLocation, this.texcoords.length / this.size, gl.FLOAT, false, 0, 0);\n\t\t\t// gl.bindAttribLocation(program, this.texcoordLocation, 'a_texcoord');\n\t\t\t// console.log('texcoordLocation', attribLocation);\n\t\t}\n\t\tif (this.normals) {\n\t\t\t// this.normalLocation = this.createAttribLocation_(gl, program, 'a_normal', this.normals.length / this.size, gl.FLOAT);\n\t\t\tattribLocation = gl.getAttribLocation(program, 'a_normal');\n\t\t\tgl.enableVertexAttribArray(this.normalLocation);\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n\t\t\tgl.vertexAttribPointer(this.normalLocation, this.normals.length / this.size, gl.FLOAT, false, 0, 0);\n\t\t\t// gl.bindAttribLocation(program, this.normalLocation, 'a_normal');\n\t\t\t// console.log('normalLocation', attribLocation);\n\t\t}\n\t\tif (this.colors) {\n\t\t\t// this.colorLocation = this.createAttribLocation_(gl, program, 'a_color', this.colors.length / this.size, gl.FLOAT);\n\t\t\tattribLocation = gl.getAttribLocation(program, 'a_color');\n\t\t\tgl.enableVertexAttribArray(this.colorLocation);\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n\t\t\tgl.vertexAttribPointer(this.colorLocation, this.colors.length / this.size, gl.FLOAT, false, 0, 0);\n\t\t\t// gl.bindAttribLocation(program, this.colorLocation, 'a_color');\n\t\t\t// console.log('colorLocation', attribLocation);\n\t\t}\n\t}\n\n\tbindAttributes_(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) {\n\t\tif (this.positions) {\n\t\t\tgl.bindAttribLocation(program, this.positionLocation, 'a_position');\n\t\t}\n\t\tif (this.texcoords) {\n\t\t\tgl.bindAttribLocation(program, this.texcoordLocation, 'a_texcoord');\n\t\t}\n\t\tif (this.normals) {\n\t\t\tgl.bindAttribLocation(program, this.normalLocation, 'a_normal');\n\t\t}\n\t\tif (this.colors) {\n\t\t\tgl.bindAttribLocation(program, this.colorLocation, 'a_color');\n\t\t}\n\t}\n\n\tprotected createData_() {\n\t\t// Now create an array of positions for the cube.\n\t\tthis.positions = [];\n\t\tthis.normals = [];\n\t\tthis.texcoords = [];\n\t\tthis.colors = [];\n\t\tthis.size = 0;\n\t\t// console.log('positions', this.positions.length);\n\t\t// console.log('normals', this.normals.length);\n\t\t// console.log('texcoords', this.texcoords.length);\n\t\t// console.log('colors', this.colors.length);\n\t}\n\n\tstatic fromIndices(indices: number[], array: number[], size: number): number[] {\n\t\tconst buffer: number[] = [];\n\t\tindices.forEach(i => {\n\t\t\tbuffer.push.apply(buffer, array.slice(i * size, i * size + size));\n\t\t});\n\t\treturn buffer;\n\t}\n\n}\n","import Geometry from './geometry';\n\nexport default class FlatGeometry extends Geometry {\n\n\tprotected createData_() {\n\t\tthis.size = 6;\n\t\tthis.positions = [\n\t\t\t-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0,\n\t\t\t-1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0,\n\t\t];\n\t\tthis.texcoords = [\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t];\n\t\tthis.normals = [\n\t\t\t0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,\n\t\t];\n\t\tthis.colors = [\n\t\t\t1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n\t\t\t1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n\t\t];\n\t\t// console.log('positions', this.positions.length);\n\t\t// console.log('normals', this.normals.length);\n\t\t// console.log('texcoords', this.texcoords.length);\n\t\t// console.log('colors', this.colors.length);\n\t}\n\n}\n","export default class Vector2 {\n\n\tisVector2: boolean = true;\n\tx: number;\n\ty: number;\n\n\tconstructor(x: number = 0, y: number = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tcopy(v: Vector2): Vector2 {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\treturn this;\n\t}\n\n\tlength(): number {\n\t\treturn Math.sqrt(this.x * this.x + this.y * this.y);\n\t}\n\n\tnormalize(): Vector2 {\n\t\treturn this.divideScalar(this.length() || 1);\n\t}\n\n\tdivideScalar(scalar: number): Vector2 {\n\t\treturn this.multiplyScalar(1 / scalar);\n\t}\n\n\tmultiplyScalar(scalar: number): Vector2 {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\treturn this;\n\t}\n\n\tsubVectors(a: Vector2, b: Vector2): Vector2 {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\treturn this;\n\t}\n\n\taddVectors(a: Vector2, b: Vector2): Vector2 {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\treturn this;\n\t}\n\n}\n\n","export default class Vector3 {\n\n\tisVector3: boolean = true;\n\tx: number;\n\ty: number;\n\tz: number;\n\n\tconstructor(x: number = 0, y: number = 0, z: number = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\tcopy(v: Vector3): Vector3 {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\treturn this;\n\t}\n\n\tlength(): number {\n\t\treturn Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n\t}\n\n\tnormalize(): Vector3 {\n\t\treturn this.divideScalar(this.length() || 1);\n\t}\n\n\n\tdivideScalar(scalar: number): Vector3 {\n\t\treturn this.multiplyScalar(1 / scalar);\n\t}\n\n\tmultiplyScalar(scalar: number): Vector3 {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\treturn this;\n\t}\n\n\tsubVectors(a: Vector3, b: Vector3): Vector3 {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\treturn this;\n\t}\n\n\taddVectors(a: Vector3, b: Vector3): Vector3 {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\treturn this;\n\t}\n\n\tcrossVectors(a: Vector3, b: Vector3): Vector3 {\n\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\tvar bx = b.x, by = b.y, bz = b.z;\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\t\treturn this;\n\t}\n\n\t/*\n\tset(x, y, z) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\tsetScalar(scalar) {\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\treturn this;\n\t}\n\n\tsetX(x) {\n\t\tthis.x = x;\n\t\treturn this;\n\t}\n\n\tsetY(y) {\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tsetZ(z) {\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\tsetComponent(index, value) {\n\t\tswitch (index) {\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error('index is out of range: ' + index);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tgetComponent(index) {\n\t\tswitch (index) {\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error('index is out of range: ' + index);\n\t\t}\n\n\t}\n\n\tclone() {\n\t\treturn new Vector3(this.x, this.y, this.z);\n\t}\n\n\tadd(v, w) {\n\t\tif (w !== undefined) {\n\t\t\treturn this.addVectors(v, w);\n\t\t}\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\treturn this;\n\t}\n\n\taddScalar(s) {\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\treturn this;\n\t}\n\n\taddScaledVector(v, s) {\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\treturn this;\n\t}\n\n\tsub(v, w) {\n\t\tif (w !== undefined) {\n\t\t\treturn this.subVectors(v, w);\n\t\t}\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\treturn this;\n\t}\n\n\tsubScalar(s) {\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\treturn this;\n\t}\n\n\n\tmultiply(v, w) {\n\t\tif (w !== undefined) {\n\t\t\treturn this.multiplyVectors(v, w);\n\t\t}\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\treturn this;\n\t}\n\n\tmultiplyVectors(a:Vector3, b:Vector3):Vector3 {\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\t\treturn this;\n\t}\n\n\tapplyMatrix3(m) {\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\t\tthis.x = e[0] * x + e[3] * y + e[6] * z;\n\t\tthis.y = e[1] * x + e[4] * y + e[7] * z;\n\t\tthis.z = e[2] * x + e[5] * y + e[8] * z;\n\t\treturn this;\n\t}\n\n\tapplyNormalMatrix(m) {\n\t\treturn this.applyMatrix3(m).normalize();\n\t}\n\n\tapplyMatrix4(m) {\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\t\tvar w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\t\tthis.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n\t\tthis.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n\t\tthis.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\t\treturn this;\n\t}\n\n\tapplyQuaternion(q) {\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\t\t// calculate quat * vector\n\t\tvar ix = qw * x + qy * z - qz * y;\n\t\tvar iy = qw * y + qz * x - qx * z;\n\t\tvar iz = qw * z + qx * y - qy * x;\n\t\tvar iw = - qx * x - qy * y - qz * z;\n\t\t// calculate result * inverse quat\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\t\treturn this;\n\t}\n\n\tproject(camera) {\n\t\treturn this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);\n\t}\n\n\tunproject(camera) {\n\t\treturn this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld);\n\t}\n\n\ttransformDirection(m) {\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z;\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z;\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z;\n\t\treturn this.normalize();\n\t}\n\n\tdivide(v) {\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\treturn this;\n\t}\n\n\tmin(v) {\n\t\tthis.x = Math.min(this.x, v.x);\n\t\tthis.y = Math.min(this.y, v.y);\n\t\tthis.z = Math.min(this.z, v.z);\n\t\treturn this;\n\t}\n\n\tmax(v) {\n\t\tthis.x = Math.max(this.x, v.x);\n\t\tthis.y = Math.max(this.y, v.y);\n\t\tthis.z = Math.max(this.z, v.z);\n\t\treturn this;\n\t}\n\n\tclamp(min, max) {\n\t\t// assumes min < max, componentwise\n\t\tthis.x = Math.max(min.x, Math.min(max.x, this.x));\n\t\tthis.y = Math.max(min.y, Math.min(max.y, this.y));\n\t\tthis.z = Math.max(min.z, Math.min(max.z, this.z));\n\t\treturn this;\n\t}\n\n\tclampScalar(minVal, maxVal) {\n\t\tthis.x = Math.max(minVal, Math.min(maxVal, this.x));\n\t\tthis.y = Math.max(minVal, Math.min(maxVal, this.y));\n\t\tthis.z = Math.max(minVal, Math.min(maxVal, this.z));\n\t\treturn this;\n\t}\n\n\tclampLength(min, max) {\n\t\tvar length = this.length();\n\t\treturn this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n\t}\n\n\tfloor() {\n\t\tthis.x = Math.floor(this.x);\n\t\tthis.y = Math.floor(this.y);\n\t\tthis.z = Math.floor(this.z);\n\t\treturn this;\n\t}\n\n\tceil() {\n\t\tthis.x = Math.ceil(this.x);\n\t\tthis.y = Math.ceil(this.y);\n\t\tthis.z = Math.ceil(this.z);\n\t\treturn this;\n\t}\n\n\tround() {\n\t\tthis.x = Math.round(this.x);\n\t\tthis.y = Math.round(this.y);\n\t\tthis.z = Math.round(this.z);\n\t\treturn this;\n\t}\n\n\troundToZero() {\n\t\tthis.x = (this.x < 0) ? Math.ceil(this.x) : Math.floor(this.x);\n\t\tthis.y = (this.y < 0) ? Math.ceil(this.y) : Math.floor(this.y);\n\t\tthis.z = (this.z < 0) ? Math.ceil(this.z) : Math.floor(this.z);\n\t\treturn this;\n\t}\n\n\tnegate() {\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\treturn this;\n\t}\n\n\tdot(v) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\t}\n\n\t// TODO lengthSquared?\n\tlengthSq() {\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\t}\n\n\tmanhattanLength() {\n\t\treturn Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);\n\t}\n\n\tsetLength(length) {\n\t\treturn this.normalize().multiplyScalar(length);\n\t}\n\n\tlerp(v, alpha) {\n\t\tthis.x += (v.x - this.x) * alpha;\n\t\tthis.y += (v.y - this.y) * alpha;\n\t\tthis.z += (v.z - this.z) * alpha;\n\t\treturn this;\n\t}\n\n\tlerpVectors(v1, v2, alpha) {\n\t\treturn this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);\n\t}\n\n\tcross(v, w) {\n\t\tif (w !== undefined) {\n\t\t\treturn this.crossVectors(v, w);\n\t\t}\n\t\treturn this.crossVectors(this, v);\n\t}\n\n\tprojectOnVector(v) {\n\t\tvar denominator = v.lengthSq();\n\t\tif (denominator === 0) return this.set(0, 0, 0);\n\t\tvar scalar = v.dot(this) / denominator;\n\t\treturn this.copy(v).multiplyScalar(scalar);\n\t}\n\n\tprojectOnPlane(planeNormal) {\n\t\tconst v = new Vector3();\n\t\tv.copy(this).projectOnVector(planeNormal);\n\t\treturn this.sub(v);\n\t}\n\n\treflect(normal) {\n\t\tconst v = new Vector3();\n\t\treturn this.sub(v.copy(normal).multiplyScalar(2 * this.dot(normal)));\n\t}\n\n\tangleTo(v) {\n\t\tvar denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n\t\tif (denominator === 0) return Math.PI / 2;\n\t\tvar theta = this.dot(v) / denominator;\n\t\t// clamp, to handle numerical problems\n\t\treturn Math.acos(MathUtils.clamp(theta, - 1, 1));\n\t}\n\n\tdistanceTo(v) {\n\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t}\n\n\tdistanceToSquared(v) {\n\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\t\treturn dx * dx + dy * dy + dz * dz;\n\t}\n\n\tmanhattanDistanceTo(v) {\n\t\treturn Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);\n\t}\n\n\tsetFromSpherical(s) {\n\t\treturn this.setFromSphericalCoords(s.radius, s.phi, s.theta);\n\t}\n\n\tsetFromSphericalCoords(radius, phi, theta) {\n\t\tvar sinPhiRadius = Math.sin(phi) * radius;\n\t\tthis.x = sinPhiRadius * Math.sin(theta);\n\t\tthis.y = Math.cos(phi) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos(theta);\n\t\treturn this;\n\t}\n\n\tsetFromCylindrical(c) {\n\t\treturn this.setFromCylindricalCoords(c.radius, c.theta, c.y);\n\t}\n\n\tsetFromCylindricalCoords(radius, theta, y) {\n\t\tthis.x = radius * Math.sin(theta);\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos(theta);\n\t\treturn this;\n\t}\n\n\tsetFromMatrixPosition(m) {\n\t\tvar e = m.elements;\n\t\tthis.x = e[12];\n\t\tthis.y = e[13];\n\t\tthis.z = e[14];\n\t\treturn this;\n\t}\n\n\tsetFromMatrixScale(m) {\n\t\tvar sx = this.setFromMatrixColumn(m, 0).length();\n\t\tvar sy = this.setFromMatrixColumn(m, 1).length();\n\t\tvar sz = this.setFromMatrixColumn(m, 2).length();\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\t\treturn this;\n\t}\n\n\tsetFromMatrixColumn(m, index) {\n\t\treturn this.fromArray(m.elements, index * 4);\n\t}\n\n\tsetFromMatrix3Column(m, index) {\n\t\treturn this.fromArray(m.elements, index * 3);\n\t}\n\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n\t}\n\n\tfromArray(array, offset) {\n\t\tif (offset === undefined) offset = 0;\n\t\tthis.x = array[offset];\n\t\tthis.y = array[offset + 1];\n\t\tthis.z = array[offset + 2];\n\t\treturn this;\n\t}\n\n\ttoArray(array, offset) {\n\t\tif (array === undefined) array = [];\n\t\tif (offset === undefined) offset = 0;\n\t\tarray[offset] = this.x;\n\t\tarray[offset + 1] = this.y;\n\t\tarray[offset + 2] = this.z;\n\t\treturn array;\n\t}\n\n\tfromBufferAttribute(attribute, index) {\n\t\tthis.x = attribute.getX(index);\n\t\tthis.y = attribute.getY(index);\n\t\tthis.z = attribute.getZ(index);\n\t\treturn this;\n\t}\n\n\trandom() {\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\treturn this;\n\t}\n\t*/\n\n}\n\n","\nimport Vector2 from '../math/vector2';\nimport Vector3 from '../math/vector3';\n\nconst PI = Math.PI;\nconst RAD = PI / 180;\n\nexport default class OrbitCamera extends Vector3 {\n\n\ttheta: number;\n\tphi: number;\n\tradius: number;\n\tposition: Vector3 = new Vector3();\n\tvalue: Float32Array = new Float32Array([0, 0, 0]);\n\tmouse: Vector2 = null;\n\tdirty: boolean = false;\n\n\tconstructor(theta?: number, phi?: number, radius?: number) {\n\t\tsuper();\n\t\tthis.theta = (theta || 0) * RAD;\n\t\tthis.phi = (phi || 0) * RAD;\n\t\tthis.radius = radius || 6.0;\n\t\t// this.update();\n\t}\n\n\tdown(x: number, y: number) {\n\t\tthis.mouse = new Vector2(x, y);\n\t}\n\n\tmove(x: number, y: number) {\n\t\tconst mouse = this.mouse;\n\t\tif (mouse && (mouse.x !== x || mouse.y !== y)) {\n\t\t\tconst theta = (x - mouse.x) * 180 * RAD;\n\t\t\tconst phi = (y - mouse.y) * 180 * RAD;\n\t\t\tmouse.x = x;\n\t\t\tmouse.y = y;\n\t\t\tthis.theta += theta;\n\t\t\tthis.phi = Math.max(-60 * RAD, Math.min(60 * RAD, this.phi + phi));\n\t\t\t// this.update();\n\t\t}\n\t}\n\n\tup() {\n\t\tthis.mouse = null;\n\t}\n\n\twheel(d: number) {\n\t\tthis.radius = Math.max(4.0, Math.min(10.0, this.radius + d * 0.02));\n\t}\n\n\tstatic fromVector(vector: Vector3) {\n\t\tconst radius = vector.length();\n\t\tconst theta = Math.acos(vector.y / radius); //theta\n\t\tconst phi = Math.atan(vector.x / vector.z); //phi\n\t\treturn new OrbitCamera(theta, phi, radius);\n\t}\n\n\tstatic toArray(camera: OrbitCamera): number[] {\n const spr = Math.sin(camera.phi) * camera.radius;\n const x = spr * Math.sin(camera.theta);\n const y = Math.cos(camera.phi) * camera.radius;\n const z = spr * Math.cos(camera.theta);\n return [x, y, z];\n }\n}\n","/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\r\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n 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] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n 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]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n 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];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n 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));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","// import 'promise-polyfill';\nimport Common from '../core/common';\nimport IterableStringMap from '../core/iterable';\nimport Subscriber from '../core/subscriber';\nimport Logger from '../logger/logger';\n\nexport const TextureImageExtensions = ['jpg', 'jpeg', 'png'];\nexport const TextureVideoExtensions = ['ogv', 'webm', 'mp4'];\nexport const TextureExtensions = TextureImageExtensions.concat(TextureVideoExtensions);\n\nexport enum TextureSourceType {\n\tData = 0,\n\tElement = 1,\n\tUrl = 2,\n}\n\nexport enum TextureFilteringType {\n\tMipMap = 'mipmap',\n\tLinear = 'linear',\n\tNearest = 'nearest',\n}\n\nexport interface ITextureData {\n\tdata: Uint8Array;\n\twidth: number;\n\theight: number;\n}\n\nexport interface ITextureOptions {\n\turl?: string;\n\telement?: HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | HTMLElement | Element;\n\tdata?: Uint8Array;\n\twidth?: number;\n\theight?: number;\n\tfiltering?: TextureFilteringType;\n\trepeat?: boolean;\n\tUNPACK_FLIP_Y_WEBGL?: boolean;\n\tUNPACK_PREMULTIPLY_ALPHA_WEBGL?: number;\n\tTEXTURE_WRAP_S?: number; // gl.REPEAT | gl.CLAMP_TO_EDGE | gl.MIRRORED_REPEAT;\n\tTEXTURE_WRAP_T?: number; // gl.REPEAT | gl.CLAMP_TO_EDGE | gl.MIRRORED_REPEAT;\n}\n\nexport interface ITextureInput {\n\tkey: string;\n\turl: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData;\n\toptions?: ITextureOptions;\n}\n\nexport function isTextureData(object: any): object is ITextureData {\n\treturn 'data' in object && 'width' in object && 'height' in object;\n}\n\n// GL texture wrapper object for keeping track of a global set of textures, keyed by a unique user-defined name\nexport class Texture extends Subscriber {\n\n\tkey: string;\n\tindex: number;\n\toptions: ITextureOptions;\n\tworkpath: string;\n\twidth: number;\n\theight: number;\n\n\ttexture: WebGLTexture;\n\tsource: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | Uint8Array;\n\tsourceType: TextureSourceType;\n\tfiltering: TextureFilteringType;\n\turl: string;\n\tvalid: boolean = false;\n\tdirty: boolean = false;\n\tanimated: boolean = false;\n\tpowerOf2: boolean = false;\n\n\tconstructor(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\tkey: string,\n\t\tindex: number,\n\t\toptions: ITextureOptions = { filtering: TextureFilteringType.Linear },\n\t\tworkpath?: string,\n\t) {\n\t\tsuper();\n\t\tthis.key = key;\n\t\tthis.index = index;\n\t\tthis.options = options;\n\t\tthis.workpath = workpath;\n\t\tthis.create(gl);\n\t}\n\n\tstatic isPowerOf2(value: number): boolean {\n\t\treturn (value & (value - 1)) === 0;\n\t}\n\n\tstatic isSafari(): boolean {\n\t\treturn /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\t}\n\n\tstatic isTextureUrl(text: string): boolean {\n\t\treturn text && (/\\.(jpg|jpeg|png|ogv|webm|mp4)$/i).test(text.split('?')[0]);\n\t}\n\n\tstatic isTexture(\n\t\turlElementOrData: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData,\n\t): boolean {\n\t\tconst options = Texture.getTextureOptions(urlElementOrData);\n\t\treturn options !== undefined;\n\t}\n\n\tstatic getMaxTextureSize(gl: WebGLRenderingContext | WebGL2RenderingContext): number {\n\t\treturn gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\t};\n\n\tstatic getTextureOptions(\n\t\turlElementOrData: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData,\n\t\toptions: ITextureOptions = {}\n\t): ITextureOptions {\n\t\tif (typeof urlElementOrData === 'string' && urlElementOrData !== '') {\n\t\t\tif (Texture.isTextureUrl(urlElementOrData)) {\n\t\t\t\toptions.url = urlElementOrData;\n\t\t\t\tif (urlElementOrData.indexOf('?') !== -1) {\n\t\t\t\t\toptions = urlElementOrData.split('?')[1].split('&').reduce(function (prev: ITextureOptions, curr) {\n\t\t\t\t\t\tconst params = curr.split('=');\n\t\t\t\t\t\tconst key = decodeURIComponent(params[0]);\n\t\t\t\t\t\tconst value = decodeURIComponent(params[1]);\n\t\t\t\t\t\tswitch (key) {\n\t\t\t\t\t\t\tcase 'filtering':\n\t\t\t\t\t\t\t\tprev[key] = value as TextureFilteringType;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'repeat':\n\t\t\t\t\t\t\tcase 'UNPACK_FLIP_Y_WEBGL':\n\t\t\t\t\t\t\t\tprev[key] = Boolean(value);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'UNPACK_PREMULTIPLY_ALPHA_WEBGL':\n\t\t\t\t\t\t\tcase 'TEXTURE_WRAP_S':\n\t\t\t\t\t\t\tcase 'TEXTURE_WRAP_T':\n\t\t\t\t\t\t\t\tprev[key] = Number(value);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t}, options);\n\t\t\t\t}\n\t\t\t\treturn options;\n\t\t\t}\n\t\t\tif (document) {\n\t\t\t\turlElementOrData = document.querySelector(urlElementOrData);\n\t\t\t\t// Logger.log(urlElementOrData);\n\t\t\t}\n\t\t}\n\t\tif (urlElementOrData instanceof HTMLCanvasElement || urlElementOrData instanceof HTMLImageElement || urlElementOrData instanceof HTMLVideoElement) {\n\t\t\toptions.element = urlElementOrData;\n\t\t\treturn options;\n\t\t} else if (isTextureData(urlElementOrData)) {\n\t\t\toptions.data = urlElementOrData.data;\n\t\t\toptions.width = urlElementOrData.width;\n\t\t\toptions.height = urlElementOrData.height;\n\t\t\treturn options;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tcreate(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext\n\t): void {\n\t\tthis.texture = gl.createTexture();\n\t\tif (this.texture) {\n\t\t\tthis.valid = true;\n\t\t}\n\t\t// Default to a 1-pixel black texture so we can safely render while we wait for an image to load\n\t\t// See: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load\n\t\t// [255, 255, 255, 255]\n\t\tthis.setData(gl, 1, 1, new Uint8Array([0, 0, 0, 0]), this.options);\n\t\t// this.bindTexture();\n\t\t// this.load(options);\n\t}\n\n\tload(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\toptions: ITextureOptions = {}\n\t): Promise<Texture> {\n\t\tthis.options = options;\n\t\tif (typeof options.url === 'string') {\n\t\t\tif (this.url === undefined || options.url !== this.url) {\n\t\t\t\treturn this.setUrl(gl, options.url, options);\n\t\t\t} else {\n\t\t\t\treturn Promise.resolve(this);\n\t\t\t}\n\t\t} else if (options.element) {\n\t\t\treturn this.setElement(gl, options.element, options);\n\t\t} else if (options.data && options.width && options.height) {\n\t\t\treturn this.setData(gl, options.width, options.height, options.data, options);\n\t\t} else {\n\t\t\treturn Promise.reject(this);\n\t\t}\n\t}\n\n\tsetUrl(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\turl: string,\n\t\toptions: ITextureOptions = {}\n\t): Promise<Texture> {\n\t\tif (!this.valid) {\n\t\t\treturn Promise.reject(this);\n\t\t}\n\t\tthis.url = url; // save URL reference (will be overwritten when element is loaded below)\n\t\tthis.source = url;\n\t\tthis.sourceType = TextureSourceType.Url;\n\t\tthis.options = Object.assign(this.options, options);\n\t\tconst ext = url.split('?')[0].split('.').pop().toLowerCase();\n\t\tconst isVideo = TextureVideoExtensions.indexOf(ext) !== -1;\n\t\tconst src = Common.getResource(url, this.workpath);\n\t\tlet element: HTMLVideoElement | HTMLImageElement;\n\t\tlet promise: Promise<Texture>;\n\t\tif (isVideo) {\n\t\t\tLogger.log('GlslCanvas.setUrl video', src);\n\t\t\telement = document.createElement('video'); // new HTMLVideoElement();\n\t\t\telement.setAttribute('preload', 'auto');\n\t\t\t// element.setAttribute('autoplay', 'true');\n\t\t\telement.setAttribute('loop', 'true');\n\t\t\telement.setAttribute('muted', 'true');\n\t\t\telement.setAttribute('playsinline', 'true');\n\t\t\t// element.autoplay = true;\n\t\t\telement.loop = true;\n\t\t\telement.muted = true;\n\t\t\t/*\n\t\t\tif (!(Texture.isSafari() && /(?<!http|https):\\//.test(url))) {\n\t\t\t\telement.crossOrigin = 'anonymous';\n\t\t\t}\n\t\t\t*/\n\t\t\tpromise = this.setElement(gl, element, options);\n\t\t\telement.src = src;\n\t\t\telement.addEventListener('canplay', () => {\n\t\t\t\t(element as HTMLVideoElement).play();\n\t\t\t});\n\t\t} else {\n\t\t\tLogger.log('GlslCanvas.setUrl image', src);\n\t\t\telement = document.createElement('img'); // new HTMLImageElement();\n\t\t\tpromise = this.setElement(gl, element, options);\n\t\t\tif (!(Texture.isSafari() && url.slice(0, 5) === 'data:')) {\n\t\t\t\telement.crossOrigin = 'anonymous';\n\t\t\t}\n\t\t\telement.src = src;\n\t\t}\n\t\treturn promise;\n\t}\n\n\tsetElement(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\telement: HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | HTMLElement | Element,\n\t\toptions: ITextureOptions = {}\n\t): Promise<Texture> {\n\t\toptions = this.options = Object.assign(this.options, options);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst originalElement = element;\n\t\t\t// a string element is interpeted as a CSS selector\n\t\t\tif (typeof element === 'string') {\n\t\t\t\telement = document.querySelector(element);\n\t\t\t}\n\t\t\tif (element instanceof HTMLCanvasElement ||\n\t\t\t\telement instanceof HTMLImageElement ||\n\t\t\t\telement instanceof HTMLVideoElement) {\n\t\t\t\tthis.source = element;\n\t\t\t\tthis.sourceType = TextureSourceType.Element;\n\t\t\t\tif (element instanceof HTMLVideoElement) {\n\t\t\t\t\tconst video = element as HTMLVideoElement;\n\t\t\t\t\tvideo.addEventListener('loadeddata', (event) => {\n\t\t\t\t\t\tthis.update(gl, options);\n\t\t\t\t\t\tthis.setFiltering(gl, options);\n\t\t\t\t\t\tresolve(this);\n\t\t\t\t\t});\n\t\t\t\t\tvideo.addEventListener('error', (error) => {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t\t\tvideo.load();\n\t\t\t\t} else if (element instanceof HTMLImageElement) {\n\t\t\t\t\telement.addEventListener('load', () => {\n\t\t\t\t\t\tthis.update(gl, options);\n\t\t\t\t\t\tthis.setFiltering(gl, options);\n\t\t\t\t\t\tresolve(this);\n\t\t\t\t\t});\n\t\t\t\t\telement.addEventListener('error', (error) => {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.update(gl, options);\n\t\t\t\t\tthis.setFiltering(gl, options);\n\t\t\t\t\tresolve(this);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet message = `the 'element' parameter (\\`element: ${JSON.stringify(originalElement)}\\`) must be a CSS selector string, or a <canvas>, <image> or <video> object`;\n\t\t\t\tLogger.log(`Texture '${this.key}': ${message}`, options);\n\t\t\t\treject(message);\n\t\t\t}\n\t\t});\n\t}\n\n\tsetData(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t\tdata: Uint8Array,\n\t\toptions: ITextureOptions = {}\n\t): Promise<Texture> {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.options = Object.assign(this.options, options);\n\t\tthis.source = data;\n\t\tthis.sourceType = TextureSourceType.Data;\n\t\tthis.update(gl, options);\n\t\tthis.setFiltering(gl, options);\n\t\treturn Promise.resolve(this);\n\t}\n\n\t// Uploads current image or buffer to the GPU (can be used to update animated textures on the fly)\n\tupdate(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\toptions: ITextureOptions\n\t): void {\n\t\tif (!this.valid) {\n\t\t\treturn;\n\t\t}\n\t\tgl.activeTexture(gl.TEXTURE0 + this.index);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.texture);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (options.UNPACK_FLIP_Y_WEBGL === false ? 0 : 1));\n\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, options.UNPACK_PREMULTIPLY_ALPHA_WEBGL || 0);\n\t\tif (this.sourceType === TextureSourceType.Element) {\n\t\t\tif (this.source instanceof HTMLImageElement && this.source.naturalWidth && this.source.naturalHeight) {\n\t\t\t\tthis.width = this.source.naturalWidth;\n\t\t\t\tthis.height = this.source.naturalHeight;\n\t\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.source);\n\t\t\t} else if (this.source instanceof HTMLVideoElement && this.source.videoWidth && this.source.videoHeight) {\n\t\t\t\tthis.width = this.source.videoWidth;\n\t\t\t\tthis.height = this.source.videoHeight;\n\t\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.source);\n\t\t\t} else if (this.source instanceof HTMLCanvasElement) {\n\t\t\t\tthis.width = this.source.width;\n\t\t\t\tthis.height = this.source.height;\n\t\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.source);\n\t\t\t}\n\t\t} else if (this.sourceType === TextureSourceType.Data) {\n\t\t\tconst imageBuffer: ArrayBufferView = this.source as ArrayBufferView;\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, imageBuffer);\n\t\t}\n\t\tthis.trigger('loaded', this);\n\t}\n\n\ttryUpdate(gl: WebGLRenderingContext | WebGL2RenderingContext): boolean {\n\t\tlet dirty = false;\n\t\tif (this.animated) {\n\t\t\tdirty = true;\n\t\t\tthis.update(gl, this.options);\n\t\t}\n\t\treturn dirty;\n\t}\n\n\tdestroy(gl: WebGLRenderingContext | WebGL2RenderingContext): void {\n\t\tif (!this.valid) {\n\t\t\treturn;\n\t\t}\n\t\tgl.deleteTexture(this.texture);\n\t\tthis.texture = null;\n\t\tdelete this.source;\n\t\tthis.source = null;\n\t\tthis.valid = false;\n\t}\n\n\tsetFiltering(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\toptions: ITextureOptions\n\t): void {\n\t\tif (!this.valid) {\n\t\t\treturn;\n\t\t}\n\t\tconst powerOf2 = Texture.isPowerOf2(this.width) && Texture.isPowerOf2(this.height);\n\t\tlet filtering = options.filtering || TextureFilteringType.MipMap;\n\t\tlet wrapS = options.TEXTURE_WRAP_S || (options.repeat ? gl.REPEAT : gl.CLAMP_TO_EDGE);\n\t\tlet wrapT = options.TEXTURE_WRAP_T || (options.repeat ? gl.REPEAT : gl.CLAMP_TO_EDGE);\n\t\tif (!powerOf2) {\n\t\t\tfiltering = filtering === TextureFilteringType.MipMap ? TextureFilteringType.Linear : filtering;\n\t\t\twrapS = wrapT = gl.CLAMP_TO_EDGE;\n\t\t\tif (options.repeat || options.TEXTURE_WRAP_S || options.TEXTURE_WRAP_T) {\n\t\t\t\tLogger.warn(`GlslCanvas: cannot repeat texture ${options.url} cause is not power of 2.`);\n\t\t\t}\n\t\t}\n\t\tthis.powerOf2 = powerOf2;\n\t\tthis.filtering = filtering;\n\t\t// this.bindTexture();\n\t\t// WebGL has strict requirements on non-power-of-2 textures:\n\t\t// No mipmaps and must clamp to edge\n\t\t// For power-of-2 textures, the following presets are available:\n\t\t// mipmap: linear blend from nearest mip\n\t\t// linear: linear blend from original image (no mips)\n\t\t// nearest: nearest pixel from original image (no mips, 'blocky' look)\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT);\n\t\tif (this.filtering === TextureFilteringType.MipMap) {\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); // TODO: use trilinear filtering by defualt instead?\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\t\tgl.generateMipmap(gl.TEXTURE_2D);\n\t\t} else if (this.filtering === TextureFilteringType.Nearest) {\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t} else if (this.filtering === TextureFilteringType.Linear) {\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\t}\n\t}\n}\n\nexport default class Textures extends IterableStringMap<Texture> {\n\n\tcount: number = 0;\n\tdirty: boolean = false;\n\tanimated: boolean = false;\n\n\tclean() {\n\t\tObject.keys(this.values).forEach((key) => {\n\t\t\tthis.values[key].dirty = false;\n\t\t});\n\t\tthis.dirty = false;\n\t}\n\n\tcreateOrUpdate(\n\t\tgl: WebGLRenderingContext | WebGL2RenderingContext,\n\t\tkey: string,\n\t\turlElementOrData: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData,\n\t\tindex: number = 0,\n\t\toptions: ITextureOptions = {},\n\t\tworkpath: string,\n\t): Promise<Texture> {\n\t\tlet texture;\n\t\tconst textureOptions = Texture.getTextureOptions(urlElementOrData, options);\n\t\ttexture = this.get(key);\n\t\tif (!texture) {\n\t\t\ttexture = new Texture(gl, key, index + this.count, textureOptions, workpath);\n\t\t\tthis.count++;\n\t\t\tthis.set(key, texture);\n\t\t}\n\t\tif (textureOptions !== undefined) {\n\t\t\treturn texture.load(gl, textureOptions).then(\n\t\t\t\t(texture) => {\n\t\t\t\t\tif (texture.source instanceof HTMLVideoElement) {\n\t\t\t\t\t\tconst video = texture.source as HTMLVideoElement;\n\t\t\t\t\t\t// Logger.log('video', video);\n\t\t\t\t\t\tvideo.addEventListener('play', () => {\n\t\t\t\t\t\t\t// Logger.log('play', texture.key);\n\t\t\t\t\t\t\ttexture.animated = true;\n\t\t\t\t\t\t\tthis.animated = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvideo.addEventListener('pause', () => {\n\t\t\t\t\t\t\t// Logger.log('pause', texture.key);\n\t\t\t\t\t\t\ttexture.animated = false;\n\t\t\t\t\t\t\tthis.animated = this.reduce((flag: boolean, texture: Texture) => {\n\t\t\t\t\t\t\t\treturn flag || texture.animated;\n\t\t\t\t\t\t\t}, false);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvideo.addEventListener('seeked', () => {\n\t\t\t\t\t\t\t// Logger.log('seeked');\n\t\t\t\t\t\t\ttexture.update(gl, texture.options);\n\t\t\t\t\t\t\tthis.dirty = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Logger.log('video');\n\t\t\t\t\t\t/*\n\t\t\t\t\t\tvideo.addEventListener('canplaythrough', () => {\n\t\t\t\t\t\t\t// !!!\n\t\t\t\t\t\t\tthis.intervalID = setInterval(() => {\n\t\t\t\t\t\t\t\tthis.update(gl, options);\n\t\t\t\t\t\t\t}, 15);\n\t\t\t\t\t\t}, true);\n\t\t\t\t\t\tvideo.addEventListener('ended', () => {\n\t\t\t\t\t\t\tvideo.currentTime = 0;\n\t\t\t\t\t\t\tvideo.play();\n\t\t\t\t\t\t}, true);\n\t\t\t\t\t\t*/\n\t\t\t\t\t}\n\t\t\t\t\treturn texture;\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\treturn Promise.resolve(texture);\n\t\t}\n\t}\n}\n","export default class CanvasTimer {\n\n\tstart: number;\n\tprevious: number;\n\tdelay: number = 0.0;\n\tcurrent: number = 0.0;\n\tdelta: number = 0.0;\n\tpaused: boolean = false;\n\n\tconstructor() {\n\t\tthis.start = this.previous = this.now();\n\t}\n\n\tnow() {\n\t\treturn performance.now();\n\t}\n\n\tplay() {\n\t\tif (this.previous) {\n\t\t\tconst now = this.now();\n\t\t\tthis.delay += (now - this.previous);\n\t\t\tthis.previous = now;\n\t\t}\n\t\t// Logger.log(this.delay);\n\t\tthis.paused = false;\n\t}\n\n\tpause() {\n\t\tthis.paused = true;\n\t}\n\n\tnext(): CanvasTimer {\n\t\tconst now = this.now();\n\t\tthis.delta = now - this.previous;\n\t\tthis.current = now - this.start - this.delay;\n\t\tthis.previous = now;\n\t\treturn this;\n\t}\n\n}\n","import Logger from '../logger/logger';\n\nexport class Listener {\n\tevent: string;\n\tcallback: Function;\n\n\tconstructor(\n\t\tevent: string,\n\t\tcallback: Function\n\t) {\n\t\tthis.event = event;\n\t\tthis.callback = callback;\n\t}\n}\n\nexport default class Subscriber {\n\tprivate listeners: Set<Listener> = new Set<Listener>();\n\n\tlogListeners() {\n\t\tthis.listeners.forEach(x => Logger.log(x));\n\t}\n\n\tsubscribe(listener: Listener) {\n\t\tthis.listeners.add(listener);\n\t}\n\n\tunsubscribe(listener: Listener) {\n\t\tthis.listeners.delete(listener);\n\t}\n\n\tunsubscribeAll() {\n\t\tthis.listeners.clear();\n\t}\n\n\ton(event: string, callback: Function) {\n\t\tthis.listeners.add(new Listener(event, callback));\n\t\treturn this;\n\t}\n\n\toff(event: string, callback?: Function) {\n\t\tif (callback) {\n\t\t\tthis.listeners.delete(new Listener(event, callback));\n\t\t} else {\n\t\t\tthis.listeners.forEach(x => {\n\t\t\t\tif (x.event === event) {\n\t\t\t\t\tthis.listeners.delete(x);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\n\ttrigger(event: string, ...data: any[]) {\n\t\tthis.listeners.forEach(x => {\n\t\t\tif (x.event === event && typeof x.callback === 'function') {\n\t\t\t\tx.callback(...data);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n}\n","import Geometry from './geometry';\n\nexport default class BoxGeometry extends Geometry {\n\n\tprotected createData_() {\n\t\tthis.size = 36;\n\t\t// Now create an array of positions for the cube.\n\t\tthis.positions = [\n\t\t\t// Front face\n\t\t\t-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0,\n\t\t\t-1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0,\n\t\t\t// Back face\n\t\t\t-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0,\n\t\t\t-1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0,\n\t\t\t// Top face\n\t\t\t-1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n\t\t\t-1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,\n\t\t\t// Bottom face\n\t\t\t-1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0,\n\t\t\t-1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0,\n\t\t\t// Right face\n\t\t\t1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0,\n\t\t\t1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0,\n\t\t\t// Left face\n\t\t\t-1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0,\n\t\t\t-1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0,\n\t\t];\n\t\tthis.texcoords = [\n\t\t\t// Front\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t\t// Back\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t\t// Top\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t\t// Bottom\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t\t// Right\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t\t// Left\n\t\t\t0.0, 0.0, 1.0, 0.0, 1.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 1.0, 0.0, 1.0,\n\t\t];\n\t\tthis.normals = [\n\t\t\t// Front\n\t\t\t0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,\n\t\t\t0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,\n\t\t\t// Back\n\t\t\t0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0,\n\t\t\t0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0,\n\t\t\t// Top\n\t\t\t0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,\n\t\t\t0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,\n\t\t\t// Bottom\n\t\t\t0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,\n\t\t\t0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,\n\t\t\t// Right\n\t\t\t1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,\n\t\t\t1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,\n\t\t\t// Left\n\t\t\t-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,\n\t\t\t-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,\n\t\t];\n\t\t// Now set up the colors for the faces. We'll use solid colors\n\t\t// for each face.\n\t\tconst faceColors = [\n\t\t\t[1.0, 1.0, 1.0, 1.0], // Front face: white\n\t\t\t[1.0, 0.0, 0.0, 1.0], // Back face: red\n\t\t\t[0.0, 1.0, 0.0, 1.0], // Top face: green\n\t\t\t[0.0, 0.0, 1.0, 1.0], // Bottom face: blue\n\t\t\t[1.0, 1.0, 0.0, 1.0], // Right face: yellow\n\t\t\t[1.0, 0.0, 1.0, 1.0], // Left face: purple\n\t\t];\n\t\t// Convert the array of colors into a table for all the vertices.\n\t\tlet colors: number[] = [];\n\t\tfor (var j = 0; j < faceColors.length; ++j) {\n\t\t\tconst c = faceColors[j];\n\t\t\t// Repeat each color four times for the four vertices of the face\n\t\t\tcolors = colors.concat(c, c, c, c, c, c);\n\t\t}\n\t\tthis.colors = colors;\n\t\t// console.log('positions', this.positions.length);\n\t\t// console.log('normals', this.normals.length);\n\t\t// console.log('texcoords', this.texcoords.length);\n\t\t// console.log('colors', this.colors.length);\n\t}\n\n}\n","import Vector3 from '../math/vector3';\nimport Geometry from './geometry';\n\nexport default class SphereGeometry extends Geometry {\n\n\tprotected createData_() {\n\t\tconst radius = 1.4;\n\t\tconst widthDivisions = 80;\n\t\tconst heightDivisions = 60;\n\t\tconst phiStart = 0;\n\t\tconst phiLength = Math.PI * 2;\n\t\tconst thetaStart = 0;\n\t\tconst thetaLength = Math.PI;\n\t\tconst p = new Vector3();\n\t\tconst n = new Vector3();\n\t\t// buffers\n\t\tconst indices = [];\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst texcoords = [];\n\t\tconst colors = [];\n\t\t//\n\t\tlet thetaEnd = Math.min(thetaStart + thetaLength, Math.PI);\n\t\tlet ix, iy;\n\t\tlet index = 0;\n\t\tlet grid = [];\n\t\t// generate positions, normals and uvs\n\t\tfor (iy = 0; iy <= heightDivisions; iy++) {\n\t\t\tlet positionRow = [];\n\t\t\tlet v = iy / heightDivisions;\n\t\t\t// special case for the poles\n\t\t\tlet uOffset = 0;\n\t\t\tif (iy == 0 && thetaStart == 0) {\n\t\t\t\tuOffset = 0.5 / widthDivisions;\n\t\t\t} else if (iy == heightDivisions && thetaEnd == Math.PI) {\n\t\t\t\tuOffset = -0.5 / widthDivisions;\n\t\t\t}\n\t\t\tfor (ix = 0; ix <= widthDivisions; ix++) {\n\t\t\t\tlet u = ix / widthDivisions;\n\t\t\t\t// position\n\t\t\t\tp.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\tp.y = radius * Math.cos(thetaStart + v * thetaLength);\n\t\t\t\tp.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\tpositions.push(p.x, p.y, p.z);\n\t\t\t\t// normal\n\t\t\t\tn.copy(p).normalize();\n\t\t\t\tnormals.push(n.x, n.y, n.z);\n\t\t\t\t// uv\n\t\t\t\tconst uvx = (u + uOffset);\n\t\t\t\tconst uvy = (1 - v);\n\t\t\t\ttexcoords.push(uvx, uvy);\n\t\t\t\tcolors.push(1.0, 1.0, 1.0, 1.0);\n\t\t\t\tpositionRow.push(index++);\n\t\t\t}\n\t\t\tgrid.push(positionRow);\n\t\t}\n\t\t// indices\n\t\tfor (iy = 0; iy < heightDivisions; iy++) {\n\t\t\tfor (ix = 0; ix < widthDivisions; ix++) {\n\t\t\t\tconst a = grid[iy][ix + 1];\n\t\t\t\tconst b = grid[iy][ix];\n\t\t\t\tconst c = grid[iy + 1][ix];\n\t\t\t\tconst d = grid[iy + 1][ix + 1];\n\t\t\t\tif (iy !== 0 || thetaStart > 0) indices.push(a, b, d);\n\t\t\t\tif (iy !== heightDivisions - 1 || thetaEnd < Math.PI) indices.push(b, c, d);\n\t\t\t}\n\t\t}\n\t\t// build geometry\n\t\tthis.size = indices.length;\n\t\t// Now create an array of positions for the cube.\n\t\tthis.positions = Geometry.fromIndices(indices, positions, 3);\n\t\tthis.texcoords = Geometry.fromIndices(indices, texcoords, 2);\n\t\tthis.normals = Geometry.fromIndices(indices, normals, 3);\n\t\t// Now set up the colors for the faces. We'll use solid colors\n\t\t// for each face.\n\t\tthis.colors = Geometry.fromIndices(indices, colors, 4);\n\t\t// this.unrapUvw(this.positions);\n\t\t// console.log('positions', this.positions.length);\n\t\t// console.log('normals', this.normals.length);\n\t\t// console.log('texcoords', this.texcoords.length);\n\t\t// console.log('colors', this.colors.length);\n\t}\n\n\t/*\n\tunrapUvw(positions: number[]): void {\n\t\tconst texcoords: number[] = this.texcoords = [];\n\t\tfor (let i = 0; i < positions.length; i += 3) {\n\t\t\tconst v = new Vector3(positions[i], positions[i + 1], positions[i + 2]);\n\t\t\tv.normalize();\n\t\t\tconst pitch = Math.asin(-v.y);\n\t\t\tconst yaw = Math.atan2(v.x, v.z);\n\t\t\tconst tx = 0.5 + pitch / Math.PI; // * 360;\n\t\t\tconst ty = 0.5 + yaw / (Math.PI * 2); // * 180;\n\t\t\ttexcoords.push(tx, ty);\n\t\t}\n\t}\n\t*/\n\n}\n","import Vector3 from '../math/vector3';\nimport Geometry from './geometry';\n\nexport default class TorusGeometry extends Geometry {\n\n\tprotected createData_() {\n\t\tconst radius: number = 1;\n\t\tconst tube: number = 0.25;\n\t\tconst tubularDivisions: number = 200;\n\t\tconst radialDivisions: number = 40;\n\t\tconst p: number = 2;\n\t\tconst q: number = 3;\n\t\tconst indices: number[] = [];\n\t\tconst positions: number[] = [];\n\t\tconst normals: number[] = [];\n\t\tconst texcoords: number[] = [];\n\t\tconst colors: number[] = [];\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst p1 = new Vector3();\n\t\tconst p2 = new Vector3();\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\t\tfor (let i: number = 0; i <= tubularDivisions; ++i) {\n\t\t\tconst u = i / tubularDivisions * p * Math.PI * 2;\n\t\t\tthis.calculatePositionOnCurve(u, p, q, radius, p1);\n\t\t\tthis.calculatePositionOnCurve(u + 0.01, p, q, radius, p2);\n\t\t\tT.subVectors(p2, p1);\n\t\t\tN.addVectors(p2, p1);\n\t\t\tB.crossVectors(T, N);\n\t\t\tN.crossVectors(B, T);\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\t\t\tfor (let j: number = 0; j <= radialDivisions; ++j) {\n\t\t\t\tconst v: number = j / radialDivisions * Math.PI * 2;\n\t\t\t\tconst cx: number = - tube * Math.cos(v);\n\t\t\t\tconst cy: number = tube * Math.sin(v);\n\t\t\t\tvertex.x = p1.x + (cx * N.x + cy * B.x);\n\t\t\t\tvertex.y = p1.y + (cx * N.y + cy * B.y);\n\t\t\t\tvertex.z = p1.z + (cx * N.z + cy * B.z);\n\t\t\t\tpositions.push(vertex.x, vertex.y, vertex.z);\n\t\t\t\tnormal.subVectors(vertex, p1).normalize();\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\t\t\t\ttexcoords.push(i / tubularDivisions * 2.0 * Math.round(q));\n\t\t\t\ttexcoords.push(j / radialDivisions);\n\t\t\t\tcolors.push(1.0, 1.0, 1.0, 1.0);\n\t\t\t}\n\t\t}\n\t\tfor (let j: number = 1; j <= tubularDivisions; j++) {\n\t\t\tfor (let i: number = 1; i <= radialDivisions; i++) {\n\t\t\t\tconst a: number = (radialDivisions + 1) * (j - 1) + (i - 1);\n\t\t\t\tconst b: number = (radialDivisions + 1) * j + (i - 1);\n\t\t\t\tconst c: number = (radialDivisions + 1) * j + i;\n\t\t\t\tconst d: number = (radialDivisions + 1) * (j - 1) + i;\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\t\tthis.size = indices.length;\n\t\tthis.positions = Geometry.fromIndices(indices, positions, 3);\n\t\tthis.texcoords = Geometry.fromIndices(indices, texcoords, 2);\n\t\tthis.normals = Geometry.fromIndices(indices, normals, 3);\n\t\tthis.colors = Geometry.fromIndices(indices, colors, 4);\n\t\t// console.log('positions', this.positions.length);\n\t\t// console.log('normals', this.normals.length);\n\t\t// console.log('texcoords', this.texcoords.length);\n\t\t// console.log('colors', this.colors.length);\n\t}\n\n\tprotected calculatePositionOnCurve(u: number, p: number, q: number, radius: number, position: Vector3): void {\n\t\tconst cu: number = Math.cos(u);\n\t\tconst su: number = Math.sin(u);\n\t\tconst quOverP: number = q / p * u;\n\t\tconst cs: number = Math.cos(quOverP);\n\t\tposition.x = radius * (2 + cs) * 0.5 * cu;\n\t\tposition.y = radius * (2 + cs) * su * 0.5;\n\t\tposition.z = radius * Math.sin(quOverP) * 0.5;\n\t}\n\n}\n","import Common from '../core/common';\nimport Geometry, { IGeometry } from '../geometry/geometry';\nimport Vector3 from '../math/vector3';\n\nconst COLORS = [\n\t[1, 1, 1],\n\t[1, 0, 0],\n\t[0, 1, 0],\n\t[0, 0, 1],\n\t[1, 1, 0],\n\t[0, 1, 1],\n];\n\nlet CI: number = 0;\n\nexport default class ObjLoader {\n\n\tload(url: string): Promise<Geometry> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tCommon.fetch(url)\n\t\t\t\t// .then((response) => response.text())\n\t\t\t\t.then((text) => {\n\t\t\t\t\t// console.log(text);\n\t\t\t\t\tconst data = this.parse(text);\n\t\t\t\t\tif (data.positions.length) {\n\t\t\t\t\t\tconst geometry = new Geometry(data as IGeometry);\n\t\t\t\t\t\tresolve(geometry);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(`ObjLoader error: empty positions ${url}`);\n\t\t\t\t\t}\n\t\t\t\t}, error => {\n\t\t\t\t\tconsole.log('ObjLoader error:', error, url);\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t});\n\t}\n\n\tparseIndices(faceIndices: number[][], k: number, l: number, source: number[][], output: number[], name: string) {\n\t\tlet i = 0;\n\t\twhile (i <= faceIndices.length - 3) {\n\t\t\tlet a, b, c;\n\t\t\tif (i === 0) {\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\t\t\t} else {\n\t\t\t\ta = i - 1;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\t\t\t}\n\t\t\ti++;\n\t\t\tconst indices = [a, b, c];\n\t\t\tfor (let j = 0; j < indices.length; j++) {\n\t\t\t\tconst index = faceIndices[indices[j]][k];\n\t\t\t\tlet values;\n\t\t\t\tif (index && index !== NaN) {\n\t\t\t\t\tvalues = source[index - 1];\n\t\t\t\t\tif (values) {\n\t\t\t\t\t\tvalues = values.slice(0, l);\n\t\t\t\t\t\toutput.push.apply(output, values);\n\t\t\t\t\t}\n\t\t\t\t\t/*\n\t\t\t\t\telse {\n\t\t\t\t\t\t// console.log('error', name, source.length, index - 1);\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t}\n\t\t\t\t/*\n\t\t\t\telse {\n\t\t\t\t\tvalues = new Array(l).fill(0);\n\t\t\t\t\toutput.push.apply(output, values);\n\t\t\t\t}\n\t\t\t\t*/\n\t\t\t}\n\t\t}\n\t}\n\n\tparseFaces(F: number[][][], V: number[][], VN: number[][], VT: number[][], positions: number[], normals: number[], texcoords: number[], colors: number[]) {\n\t\tconst si: number = positions.length;\n\t\tF.forEach(faceIndices => {\n\t\t\t// console.log(faceIndices);\n\t\t\tthis.parseIndices(faceIndices, 0, 3, V, positions, 'positions');\n\t\t\tthis.parseIndices(faceIndices, 2, 3, VN, normals, 'normals');\n\t\t\tthis.parseIndices(faceIndices, 1, 2, VT, texcoords, 'texcoords');\n\t\t});\n\t\tconst vl: number = positions.length - si;\n\t\tif (vl > 0) {\n\t\t\t// console.log(faceIndices.length - 2);\n\t\t\tconst c = new Array(vl / 3).fill(0);\n\t\t\tc.forEach(() => {\n\t\t\t\tconst rgb = COLORS[CI % COLORS.length];\n\t\t\t\tcolors.push(rgb[0], rgb[1], rgb[2], 1.0);\n\t\t\t});\n\t\t\tCI++;\n\t\t\t// console.log(positions.length, normals.length, texcoords.length, colors.length, positions.length / 3 * 2 === texcoords.length, positions.length / 3 * 4 === colors.length);\n\t\t}\n\t}\n\n\tparse(text: string): IGeometry {\n\t\tlet positions: number[] = [], normals: number[] = [], texcoords: number[] = [], colors: number[] = [];\n\t\tCI = 0;\n\t\tlet V: number[][] = [], VN: number[][] = [], VT: number[][] = [], F: number[][][] = [];\n\t\tif (text.indexOf('\\r\\n') !== - 1) {\n\t\t\ttext = text.replace(/\\r\\n/g, '\\n');\n\t\t}\n\t\t/*\n\t\tif (text.indexOf('\\\\\\n') !== - 1) {\n\t\t\ttext = text.replace(/\\\\\\n/g, '');\n\t\t}\n\t\t*/\n\t\ttext = text.replace(/ /g, ' ');\n\t\tconst lines = text.split('\\n');\n\t\tlines.forEach((line, i) => {\n\t\t\tif (line.indexOf('v ') === 0) {\n\t\t\t\tif (F.length) {\n\t\t\t\t\tthis.parseFaces(F, V, VN, VT, positions, normals, texcoords, colors);\n\t\t\t\t\tF = [];\n\t\t\t\t\t// V = [];\n\t\t\t\t\t// VN = [];\n\t\t\t\t\t// VT = [];\n\t\t\t\t}\n\t\t\t\t// v 0.0012 -0.0055 0.0090\n\t\t\t\tconst a = line.replace('v', '').trim().split(' ');\n\t\t\t\tconst v = a.map(x => parseFloat(x));\n\t\t\t\tV.push(v);\n\t\t\t} else if (line.indexOf('vn ') === 0) {\n\t\t\t\t// vn 0.0128 0.9896 0.1431\n\t\t\t\tconst a = line.replace('vn', '').trim().split(' ');\n\t\t\t\tconst v = a.map(x => parseFloat(x));\n\t\t\t\tconst n = new Vector3(v[0], v[1], v[2]).normalize();\n\t\t\t\tVN.push([n.x, n.y, n.z]);\n\t\t\t} else if (line.indexOf('vt ') === 0) {\n\t\t\t\t// vt 0.5955 0.0054 0.0000\n\t\t\t\tconst a = line.replace('vt', '').trim().split(' ');\n\t\t\t\tconst v = a.map(x => parseFloat(x));\n\t\t\t\tVT.push(v);\n\t\t\t} else if (line.indexOf('f ') === 0) {\n\t\t\t\t// f 1//1 2//2 3//3 4//4\n\t\t\t\tconst a = line.replace('f', '').trim().split(' ');\n\t\t\t\tconst f = a.map((x: string) => {\n\t\t\t\t\tconst indices = x.split('/').map(y => parseInt(y));\n\t\t\t\t\tif (indices.length === 2) {\n\t\t\t\t\t\tindices.push(null);\n\t\t\t\t\t}\n\t\t\t\t\treturn indices;\n\t\t\t\t});\n\t\t\t\tF[F.length] = f;\n\t\t\t}\n\t\t});\n\t\tif (F.length) {\n\t\t\tthis.parseFaces(F, V, VN, VT, positions, normals, texcoords, colors);\n\t\t}\n\t\tconst boundingBox = { min: new Vector3(Number.POSITIVE_INFINITY), max: new Vector3(Number.NEGATIVE_INFINITY) };\n\t\tfor (let i = 0; i < positions.length; i += 3) {\n\t\t\tboundingBox.min.x = Math.min(boundingBox.min.x, positions[i]);\n\t\t\tboundingBox.min.y = Math.min(boundingBox.min.y, positions[i + 1]);\n\t\t\tboundingBox.min.z = Math.min(boundingBox.min.z, positions[i + 2]);\n\t\t\tboundingBox.max.x = Math.max(boundingBox.max.x, positions[i]);\n\t\t\tboundingBox.max.y = Math.max(boundingBox.max.y, positions[i + 1]);\n\t\t\tboundingBox.max.z = Math.max(boundingBox.max.z, positions[i + 2]);\n\t\t}\n\t\tconst centerX = true, centerY = true, centerZ = true;\n\t\tconst dx = -(boundingBox.min.x + boundingBox.max.x) / 2;\n\t\tconst dy = -(boundingBox.min.y + boundingBox.max.y) / 2;\n\t\tconst dz = -(boundingBox.min.z + boundingBox.max.z) / 2;\n\t\t// console.log(dx, dy, dz);\n\t\tfor (let i = 0; i < positions.length; i += 3) {\n\t\t\tpositions[i] += centerX ? dx : 0;\n\t\t\tpositions[i + 1] += centerY ? dy : 0;\n\t\t\tpositions[i + 2] += centerZ ? dz : 0;\n\t\t}\n\t\tconst radius = positions.reduce((p: number, c: number) => {\n\t\t\treturn Math.max(p, c);\n\t\t}, 0);\n\t\tpositions.forEach((x: number, i: number) => positions[i] = x / radius * 2.0);\n\t\tif (!normals.length) {\n\t\t\tnormals = positions.slice();\n\t\t}\n\t\tif (!texcoords.length) {\n\t\t\ttexcoords = this.unrapUvw(positions);\n\t\t}\n\t\t/*\n\t\t// console.log(positions.length, normals.length, texcoords.length, colors.length,\n\t\t//\tpositions.length / 3 * 2 === texcoords.length,\n\t\t//\tpositions.length / 3 * 4 === colors.length);\n\t\t*/\n\t\treturn {\n\t\t\tpositions, normals, texcoords, colors\n\t\t};\n\t}\n\n\tunrapUvw(positions: number[]): number[] {\n\t\tconst texcoords: number[] = [];\n\t\tfor (let i = 0; i < positions.length; i += 3) {\n\t\t\tconst v = new Vector3(positions[i], positions[i + 1], positions[i + 2]);\n\t\t\tv.normalize();\n\t\t\tconst pitch = Math.asin(-v.y);\n\t\t\tconst yaw = Math.atan2(v.x, v.z);\n\t\t\tconst tx = 0.5 + pitch / Math.PI; // * 360;\n\t\t\tconst ty = 0.5 + yaw / (Math.PI * 2); // * 180;\n\t\t\ttexcoords.push(tx, ty);\n\t\t}\n\t\treturn texcoords;\n\t}\n}\n","\nimport IterableStringMap from '../core/iterable';\nimport Logger from '../logger/logger';\nimport { Texture } from '../textures/textures';\n\nexport enum UniformMethod {\n\tUnknown = 0,\n\tUniform1i = 'uniform1i', // (intUniformLoc, v); // for int\n\t// Uniform1i = 'uniform1i', // (boolUniformLoc, v); // for bool\n\t// Uniform1i = 'uniform1i', // (sampler2DUniformLoc, v); // for sampler2D\n\t// Uniform1i = 'uniform1i', // (samplerCubeUniformLoc, v); // for samplerCube\n\tUniform2i = 'uniform2i', // (ivec2UniformLoc, v0, v1); // for ivec2\n\tUniform3i = 'uniform3i', // (ivec3UniformLoc, v0, v1, v2); // for ivec3\n\tUniform4i = 'uniform4i', // (ivec4UniformLoc, v0, v1, v2, v4); // for ivec4\n\tUniform1f = 'uniform1f', // (floatUniformLoc, v); // for float\n\tUniform2f = 'uniform2f', // (vec2UniformLoc, v0, v1); // for vec2\n\tUniform3f = 'uniform3f', // (vec3UniformLoc, v0, v1, v2); // for vec3\n\tUniform4f = 'uniform4f', // (vec4UniformLoc, v0, v1, v2, v4); // for vec4\n\t//\n\tUniform1iv = 'uniform1iv', // (intUniformLoc, [v]); // for int or int array\n\t// Uniform1iv = 'uniform1iv', // (boolUniformLoc, [v]); // for bool or bool array\n\t// Uniform1iv = 'uniform1iv', // (sampler2DUniformLoc, [v]); // for sampler2D or sampler2D array\n\t// Uniform1iv = 'uniform1iv', // (samplerCubeUniformLoc, [v]); // for samplerCube or samplerCube array\n\tUniform2iv = 'uniform2iv', // (ivec2UniformLoc, [v0, v1]); // for ivec2 or ivec2 array\n\tUniform3iv = 'uniform3iv', // (ivec3UniformLoc, [v0, v1, v2]); // for ivec3 or ivec3 array\n\tUniform4iv = 'uniform4iv', // (ivec4UniformLoc, [v0, v1, v2, v4]); // for ivec4 or ivec4 array\n\t//\n\tUniform1fv = 'uniform1fv', // (floatUniformLoc, [v]); // for float or float array\n\tUniform2fv = 'uniform2fv', // (vec2UniformLoc, [v0, v1]); // for vec2 or vec2 array\n\tUniform3fv = 'uniform3fv', // (vec3UniformLoc, [v0, v1, v2]); // for vec3 or vec3 array\n\tUniform4fv = 'uniform4fv', // (vec4UniformLoc, [v0, v1, v2, v4]); // for vec4 or vec4 array\n\t//\n\tUniformMatrix2fv = 'uniformMatrix2fv', // (mat2UniformLoc, false, [ 4x element array ]) // for mat2 or mat2 array\n\tUniformMatrix3fv = 'uniformMatrix3fv', // (mat3UniformLoc, false, [ 9x element array ]) // for mat3 or mat3 array\n\tUniformMatrix4fv = 'uniformMatrix4fv', // (mat4UniformLoc, false, [ 16x element array ]) // for mat4 or mat4 array\n}\n\nexport enum UniformType {\n\tUnknown = 0,\n\tFloat,\n\tInt,\n\tBool,\n\tSampler2D,\n\tSamplerCube,\n\tMatrix2fv,\n\tMatrix3fv,\n\tMatrix4fv,\n}\n\nexport const METHODS_INT = [UniformMethod.Uniform1i, UniformMethod.Uniform2i, UniformMethod.Uniform3i, UniformMethod.Uniform4i];\nexport const METHODS_FLOAT = [UniformMethod.Uniform1f, UniformMethod.Uniform2f, UniformMethod.Uniform3f, UniformMethod.Uniform4f];\nexport const METHODS_INTV = [UniformMethod.Uniform1iv, UniformMethod.Uniform2iv, UniformMethod.Uniform3iv, UniformMethod.Uniform4iv];\nexport const METHODS_FLOATV = [UniformMethod.Uniform1fv, UniformMethod.Uniform2fv, UniformMethod.Uniform3fv, UniformMethod.Uniform4fv];\n\nexport interface IUniformOption { [key: string]: any[]; }\n\nexport class Uniform {\n\tmethod: UniformMethod;\n\ttype: UniformType;\n\tkey: string;\n\tvalues: any[];\n\tlocation?: WebGLUniformLocation;\n\tdirty?: boolean = true;\n\tapply?: Function;\n\n\tconstructor(options?: Uniform) {\n\t\tif (options) {\n\t\t\tObject.assign(this, options);\n\t\t}\n\t\tswitch (this.method) {\n\t\t\tcase UniformMethod.UniformMatrix2fv:\n\t\t\tcase UniformMethod.UniformMatrix3fv:\n\t\t\tcase UniformMethod.UniformMatrix4fv:\n\t\t\t\tthis.apply = (gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) => {\n\t\t\t\t\tif (this.dirty) {\n\t\t\t\t\t\tgl.useProgram(program);\n\t\t\t\t\t\tconst location = gl.getUniformLocation(program, this.key);\n\t\t\t\t\t\t// Logger.log(this.key, this.method, this.values);\n\t\t\t\t\t\t// (gl as any)[this.method].apply(gl, [location].concat(this.values));\n\t\t\t\t\t\t(gl as any)[this.method].apply(gl, [location, false].concat(this.values));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.apply = (gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) => {\n\t\t\t\t\tif (this.dirty) {\n\t\t\t\t\t\tgl.useProgram(program);\n\t\t\t\t\t\tconst location = gl.getUniformLocation(program, this.key);\n\t\t\t\t\t\t// Logger.log(this.key, this.method, this.values);\n\t\t\t\t\t\t// (gl as any)[this.method].apply(gl, [location].concat(this.values));\n\t\t\t\t\t\t(gl as any)[this.method].apply(gl, [location].concat(this.values));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\n}\n\nexport class UniformTexture extends Uniform {\n\n\ttexture: Texture;\n\n\tconstructor(options?: Uniform) {\n\t\tsuper(options);\n\t}\n\n}\n\nexport default class Uniforms extends IterableStringMap<Uniform> {\n\n\tdirty: boolean = false;\n\n\tstatic isArrayOfInteger(array: any[]): boolean {\n\t\treturn array.reduce((flag: boolean, value: any) => {\n\t\t\treturn flag && Number.isInteger(value);\n\t\t}, true);\n\t}\n\n\tstatic isArrayOfNumber(array: any[]): boolean {\n\t\treturn array.reduce((flag: boolean, value: any) => {\n\t\t\treturn flag && typeof value === 'number';\n\t\t}, true);\n\t}\n\n\tstatic isArrayOfBoolean(array: any[]): boolean {\n\t\treturn array.reduce((flag: boolean, value: any) => {\n\t\t\treturn flag && typeof value === 'boolean';\n\t\t}, true);\n\t}\n\n\tstatic isArrayOfTexture(array: any[]): boolean {\n\t\treturn array.reduce((flag: boolean, value: any) => {\n\t\t\treturn flag && Texture.isTexture(value);\n\t\t}, true);\n\t}\n\n\tstatic isArrayOfSampler2D(array: Uniform[]): boolean {\n\t\treturn array.reduce((flag: boolean, value: Uniform) => {\n\t\t\treturn flag && value.type === UniformType.Sampler2D;\n\t\t}, true);\n\t}\n\n\tprivate static getType_(\n\t\tvalues: any[],\n\t): UniformType {\n\t\tlet type = UniformType.Unknown;\n\t\tconst isVector = values.length === 1 && Array.isArray(values[0]);\n\t\tconst subject = isVector ? values[0] : values;\n\t\tif (Uniforms.isArrayOfNumber(subject)) {\n\t\t\ttype = UniformType.Float;\n\t\t} else if (Uniforms.isArrayOfBoolean(subject)) {\n\t\t\ttype = UniformType.Bool;\n\t\t} else if (Uniforms.isArrayOfTexture(subject)) {\n\t\t\ttype = UniformType.Sampler2D;\n\t\t}\n\t\treturn type;\n\t}\n\n\tprivate static getMethod_(\n\t\ttype: UniformType,\n\t\tvalues: any[],\n\t): UniformMethod {\n\t\tlet method = UniformMethod.Unknown;\n\t\tconst isVector = values.length === 1 && Array.isArray(values[0]);\n\t\tconst subject = isVector ? values[0] : values;\n\t\tconst length = subject.length;\n\t\tconst i = length - 1;\n\t\tswitch (type) {\n\t\t\tcase UniformType.Float:\n\t\t\t\tif (isVector) {\n\t\t\t\t\tmethod = i < METHODS_FLOATV.length ? METHODS_FLOATV[i] : UniformMethod.Unknown;\n\t\t\t\t} else {\n\t\t\t\t\tmethod = i < METHODS_FLOAT.length ? METHODS_FLOAT[i] : UniformMethod.Uniform1fv;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase UniformType.Int:\n\t\t\tcase UniformType.Bool:\n\t\t\t\tif (isVector) {\n\t\t\t\t\tmethod = i < METHODS_INTV.length ? METHODS_INTV[i] : UniformMethod.Unknown;\n\t\t\t\t} else {\n\t\t\t\t\tmethod = i < METHODS_INT.length ? METHODS_INT[i] : UniformMethod.Uniform1iv;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase UniformType.Sampler2D:\n\t\t\t\tif (isVector) {\n\t\t\t\t\tmethod = UniformMethod.Uniform1iv;\n\t\t\t\t} else {\n\t\t\t\t\tmethod = length === 1 ? UniformMethod.Uniform1i : UniformMethod.Uniform1iv;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\treturn method;\n\t}\n\n\tstatic parseUniform(\n\t\tkey: string,\n\t\tvalues: any[],\n\t\ttype: UniformType = null\n\t): Uniform | Uniform[] {\n\t\tlet uniform: Uniform;\n\t\ttype = type || Uniforms.getType_(values);\n\t\tconst method = Uniforms.getMethod_(type, values);\n\t\tif (type !== UniformType.Unknown && method !== UniformMethod.Unknown) {\n\t\t\t// Logger.log('Uniforms.parseUniform', key, UniformType[type], method, values);\n\t\t\tif (type === UniformType.Sampler2D && method === UniformMethod.Uniform1iv) {\n\t\t\t\treturn values[0].map((texture: any, index: number) => {\n\t\t\t\t\treturn new Uniform({\n\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tkey: `${key}[${index}]`, // `${key.split('[')[0]}[${index}]`,\n\t\t\t\t\t\tvalues: [texture]\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tuniform = new Uniform({\n\t\t\t\t\tmethod: method,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tkey: key,\n\t\t\t\t\tvalues: values\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tLogger.error('Uniforms.parseUniform.Unknown', key, values);\n\t\t}\n\t\t// return this.parseUniform__bak(key, values);\n\t\treturn uniform;\n\t}\n\n\tcreate(method: UniformMethod, type: UniformType, key: string, values: any[]): Uniform {\n\t\tconst uniform = new Uniform({\n\t\t\tmethod: method,\n\t\t\ttype: type,\n\t\t\tkey: key,\n\t\t\tvalues: values,\n\t\t});\n\t\tthis.set(key, uniform);\n\t\tthis.dirty = true;\n\t\treturn uniform;\n\t}\n\n\tcreateTexture(key: string, index: number): UniformTexture {\n\t\tlet uniform;\n\t\tif (key.indexOf(']') !== -1) {\n\t\t\tuniform = new UniformTexture({\n\t\t\t\tmethod: UniformMethod.Uniform1iv,\n\t\t\t\ttype: UniformType.Sampler2D,\n\t\t\t\tkey: key,\n\t\t\t\tvalues: [[index]],\n\t\t\t});\n\t\t} else {\n\t\t\tuniform = new UniformTexture({\n\t\t\t\tmethod: UniformMethod.Uniform1i,\n\t\t\t\ttype: UniformType.Sampler2D,\n\t\t\t\tkey: key,\n\t\t\t\tvalues: [index],\n\t\t\t});\n\t\t}\n\t\tthis.set(key, uniform);\n\t\tthis.dirty = true;\n\t\treturn uniform;\n\t}\n\n\tupdate(method: UniformMethod, type: UniformType, key: string, values: any[]) {\n\t\tconst uniform = this.get(key);\n\t\tif (uniform) {\n\t\t\t// !!! consider performance\n\t\t\t// && (uniform.method !== method || uniform.type !== type || Uniforms.isDifferent(uniform.values, values))) {\n\t\t\tuniform.method = method;\n\t\t\tuniform.type = type;\n\t\t\tuniform.values = values;\n\t\t\tuniform.dirty = true;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\n\tcreateOrUpdate(method: UniformMethod, type: UniformType, key: string, values: any[]) {\n\t\tif (this.has(key)) {\n\t\t\tthis.update(method, type, key, values);\n\t\t} else {\n\t\t\tthis.create(method, type, key, values);\n\t\t}\n\t}\n\n\tapply(gl: WebGLRenderingContext | WebGL2RenderingContext, program: WebGLProgram) {\n\t\tgl.useProgram(program);\n\t\tObject.keys(this.values).forEach((key) => {\n\t\t\t// if (typeof this.values[key].apply === 'function') {\n\t\t\tthis.values[key].apply(gl, program);\n\t\t\t// }\n\t\t});\n\t\t// this.forEach(uniform => uniform.apply(gl, program));\n\t}\n\n\tclean() {\n\t\tObject.keys(this.values).forEach((key) => {\n\t\t\tthis.values[key].dirty = false;\n\t\t});\n\t\tthis.dirty = false;\n\t}\n\n\t/*\n\t// slow\n\tstatic isDifferent(a: any, b: any): boolean {\n return JSON.stringify(a) !== JSON.stringify(b);\n }\n\t*/\n\n\tstatic isDifferent(a: any[], b: any[]) {\n\t\treturn a.length !== b.length || a.reduce((f: boolean, v: any, i: number) => {\n\t\t\treturn f || v !== b[i];\n\t\t}, false);\n\t}\n\n}\n","import { mat4 } from 'gl-matrix';\nimport Buffers, { IOBuffer } from '../buffers/buffers';\nimport OrbitCamera from '../camera/orbit-camera';\nimport CanvasTimer from '../canvas/canvas-timer';\nimport { ContextMode, ContextVertexBuffers } from '../context/context';\nimport Common from '../core/common';\nimport Subscriber from '../core/subscriber';\nimport BoxGeometry from '../geometry/box-geometry';\nimport FlatGeometry from '../geometry/flat-geometry';\nimport Geometry from '../geometry/geometry';\nimport SphereGeometry from '../geometry/sphere-geometry';\nimport TorusGeometry from '../geometry/torus-geometry';\nimport ObjLoader from '../loaders/obj-loader';\nimport Logger from '../logger/logger';\nimport Vector2 from '../math/vector2';\nimport Textures, { ITextureInput } from '../textures/textures';\nimport Uniforms, { UniformMethod, UniformType } from '../uniforms/uniforms';\n\nexport default class Renderer extends Subscriber {\n\n\tgl: WebGLRenderingContext | WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\ttimer: CanvasTimer;\n\tuniforms: Uniforms = new Uniforms();\n\tbuffers: Buffers = new Buffers();\n\ttextures: Textures = new Textures();\n\ttextureList: ITextureInput[] = [];\n\n\tW: number = 0;\n\tH: number = 0;\n\tmouse: Vector2 = new Vector2();\n\tradians: number = 0;\n\tdirty: boolean = true;\n\tanimated: boolean = false;\n\tdrawFunc_: (deltaTime: number) => void;\n\n\tvertexString: string;\n\tfragmentString: string;\n\n\tcamera: OrbitCamera = new OrbitCamera();\n\tgeometry: Geometry;\n\n\tvertexBuffers: ContextVertexBuffers;\n\n\tprojectionMatrix: mat4;\n\tmodelViewMatrix: mat4;\n\tnormalMatrix: mat4;\n\n\tmode: ContextMode;\n\tmesh: string;\n\tdefaultMesh: string;\n\tdoubleSided: boolean;\n\tcache: { [key: string]: Geometry } = {};\n\tworkpath: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.drawFunc_ = this.drawArrays_;\n\t}\n\n\tprotected render(): void {\n\t\tconst gl = this.gl;\n\t\tif (!gl) {\n\t\t\treturn;\n\t\t}\n\t\tconst BW = gl.drawingBufferWidth;\n\t\tconst BH = gl.drawingBufferHeight;\n\t\tthis.update_();\n\t\tgl.viewport(0, 0, BW, BH);\n\t\tconst uniforms = this.uniforms;\n\t\tObject.keys(this.buffers.values).forEach((key) => {\n\t\t\tconst buffer: IOBuffer = this.buffers.values[key];\n\t\t\tbuffer.geometry.attachAttributes_(gl, buffer.program);\n\t\t\t// uniforms.get('u_resolution').values = [1024, 1024];\n\t\t\tuniforms.apply(gl, buffer.program);\n\t\t\t/*\n\t\t\t// console.log('uniforms');\n\t\t\tObject.keys(uniforms.values).forEach((key) => {\n\t\t\t\tif (key.indexOf('u_buff') === 0) {\n\t\t\t\t\t// console.log(key);\n\t\t\t\t}\n\t\t\t});\n\t\t\t*/\n\t\t\tbuffer.render(gl, BW, BH);\n\t\t});\n\t\t// uniforms.get('u_resolution').values = [BW, BH];\n\t\tthis.geometry.attachAttributes_(gl, this.program);\n\t\tuniforms.apply(gl, this.program);\n\t\t// gl.viewport(0, 0, BW, BH);\n\t\tthis.drawFunc_(this.timer.delta);\n\t\tuniforms.clean();\n\t\tthis.textures.clean();\n\t\tthis.dirty = false;\n\t\tthis.trigger('render', this);\n\t}\n\n\tprotected drawArrays_(deltaTime: number) {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t// Clear\n\t\tgl.viewport(0, 0, this.W, this.H);\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clearDepth(1.0);\n\t\t// Clear the canvas before we start drawing on it.\n\t\t// gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\t\tgl.enable(gl.DEPTH_TEST);\n\t\tgl.depthFunc(gl.LEQUAL);\n\t\tgl.enable(gl.CULL_FACE);\n\t\tif (this.doubleSided && this.mode !== ContextMode.Flat) {\n\t\t\t// back\n\t\t\t// gl.frontFace(gl.CW);\n\t\t\tgl.cullFace(gl.FRONT);\n\t\t\tgl.drawArrays(gl.TRIANGLES, 0, this.geometry.size);\n\t\t\t// front\n\t\t\tgl.enable(gl.BLEND);\n\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\t// gl.frontFace(gl.CCW);\n\t\tgl.cullFace(gl.BACK);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, this.geometry.size);\n\t\t// gl.drawElements(gl.TRIANGLES, this.geometry.size, gl.UNSIGNED_SHORT, 0);\n\t}\n\n\tprotected create_(): void {\n\t\tthis.createGeometry_();\n\t\tthis.createUniforms_();\n\t}\n\n\tprotected createGeometry_() {\n\t\t// console.log('Geometry', Geometry);\n\t\t// console.log('FlatGeometry', FlatGeometry);\n\t\t// console.log('BoxGeometry', BoxGeometry);\n\t\tthis.parseGeometry_();\n\t\tthis.setMode(this.mode);\n\t}\n\n\tprotected parseGeometry_() {\n\t\tconst regexp = /^attribute\\s+vec4\\s+a_position\\s*;\\s*\\/\\/\\s*([\\w|\\:\\/\\/|\\.|\\-|\\_|\\?|\\&|\\=]+)/gm;\n\t\tconst match = regexp.exec(this.vertexString);\n\t\tif (match && match.length > 1) {\n\t\t\tthis.mesh = match[1];\n\t\t} else {\n\t\t\tthis.mesh = this.defaultMesh;\n\t\t}\n\t}\n\n\tprotected createUniforms_(): void {\n\t\tconst gl = this.gl;\n\t\tconst fragmentString = this.fragmentString;\n\t\tconst BW = gl.drawingBufferWidth;\n\t\tconst BH = gl.drawingBufferHeight;\n\t\tconst timer = this.timer = new CanvasTimer();\n\t\tconst hasDelta = (fragmentString.match(/u_delta/g) || []).length > 1;\n\t\tconst hasTime = (fragmentString.match(/u_time/g) || []).length > 1;\n\t\tconst hasDate = (fragmentString.match(/u_date/g) || []).length > 1;\n\t\tconst hasMouse = (fragmentString.match(/u_mouse/g) || []).length > 1;\n\t\tconst hasCamera = (fragmentString.match(/u_camera/g) || []).length > 1;\n\t\t// this.animated = hasTime || hasDate || hasMouse;\n\t\tthis.animated = true; // !!!\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.create(UniformMethod.Uniform2f, UniformType.Float, 'u_resolution', [BW, BH]);\n\t\tif (hasDelta) {\n\t\t\tuniforms.create(UniformMethod.Uniform1f, UniformType.Float, 'u_delta', [timer.delta / 1000.0]);\n\t\t\tthis.updateUniformDelta_ = this.updateUniformDelta__;\n\t\t} else {\n\t\t\tthis.updateUniformDelta_ = this.updateUniformNoop_;\n\t\t}\n\t\tif (hasTime) {\n\t\t\tuniforms.create(UniformMethod.Uniform1f, UniformType.Float, 'u_time', [timer.current / 1000.0]);\n\t\t\tthis.updateUniformTime_ = this.updateUniformTime__;\n\t\t} else {\n\t\t\tthis.updateUniformTime_ = this.updateUniformNoop_;\n\t\t}\n\t\tif (hasDate) {\n\t\t\tconst date = new Date();\n\t\t\tuniforms.create(UniformMethod.Uniform4f, UniformType.Float, 'u_date', [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds() + date.getMilliseconds() * 0.001]);\n\t\t\tthis.updateUniformDate_ = this.updateUniformDate__;\n\t\t} else {\n\t\t\tthis.updateUniformDate_ = this.updateUniformNoop_;\n\t\t}\n\t\tif (hasMouse) {\n\t\t\tuniforms.create(UniformMethod.Uniform2f, UniformType.Float, 'u_mouse', [0, 0]);\n\t\t\tthis.updateUniformMouse_ = this.updateUniformMouse__;\n\t\t} else {\n\t\t\tthis.updateUniformMouse_ = this.updateUniformNoop_;\n\t\t}\n\t\tif (hasCamera) {\n\t\t\tuniforms.create(UniformMethod.Uniform3f, UniformType.Float, 'u_camera', [0, 0, 0]);\n\t\t\tthis.updateUniformCamera_ = this.updateUniformCamera__;\n\t\t} else {\n\t\t\tthis.updateUniformCamera_ = this.updateUniformNoop_;\n\t\t}\n\t\t// if (this.mode !== ContextMode.Flat) {\n\t\tthis.projectionMatrix = mat4.create();\n\t\tuniforms.create(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_projectionMatrix', this.projectionMatrix as number[]);\n\t\tthis.modelViewMatrix = mat4.create();\n\t\tuniforms.create(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_modelViewMatrix', this.modelViewMatrix as number[]);\n\t\tthis.normalMatrix = mat4.create();\n\t\tuniforms.create(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_normalMatrix', this.normalMatrix as number[]);\n\t\t// }\n\t}\n\n\tprotected update_(): void {\n\t\tconst gl = this.gl;\n\t\tconst BW = gl.drawingBufferWidth;\n\t\tconst BH = gl.drawingBufferHeight;\n\t\tif (!this.timer) {\n\t\t\treturn;\n\t\t}\n\t\tconst timer = this.timer.next();\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.update(UniformMethod.Uniform2f, UniformType.Float, 'u_resolution', [BW, BH]);\n\t\tthis.updateUniformDelta_(timer);\n\t\tthis.updateUniformTime_(timer);\n\t\tthis.updateUniformDate_();\n\t\tthis.updateUniformMouse_();\n\t\tthis.updateUniformCamera_();\n\t\tthis.updateUniformMesh_();\n\t}\n\n\tupdateUniformNoop_(): void {};\n\tupdateUniformDelta_: (timer:CanvasTimer) => void;\n\tupdateUniformTime_: (timer:CanvasTimer) => void;\n\tupdateUniformDate_: () => void;\n\tupdateUniformMouse_: () => void;\n\tupdateUniformCamera_: () => void;\n\tupdateUniformMesh_: () => void;\n\n\tprotected updateUniformDelta__(timer:CanvasTimer):void {\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.update(UniformMethod.Uniform1f, UniformType.Float, 'u_delta', [timer.delta / 1000.0]);\n\t};\n\tprotected updateUniformTime__(timer:CanvasTimer):void {\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.update(UniformMethod.Uniform1f, UniformType.Float, 'u_time', [timer.current / 1000.0]);\n\t};\n\tprotected updateUniformDate__():void {\n\t\tconst uniforms = this.uniforms;\n\t\tconst date = new Date();\n\t\tuniforms.update(UniformMethod.Uniform4f, UniformType.Float, 'u_date', [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds() + date.getMilliseconds() * 0.001]);\n\t};\n\tprotected updateUniformMouse__():void {\n\t\tconst uniforms = this.uniforms;\n\t\tconst mouse = this.mouse;\n\t\tuniforms.update(UniformMethod.Uniform2f, UniformType.Float, 'u_mouse', [mouse.x, mouse.y]);\n\t\t/*\n\t\tconst rect = this.rect;\n\t\tif (mouse.x >= rect.left && mouse.x <= rect.right &&\n\t\t\tmouse.y >= rect.top && mouse.y <= rect.bottom) {\n\t\t\tconst MX = (mouse.x - rect.left) * this.devicePixelRatio;\n\t\t\tconst MY = (this.canvas.height - (mouse.y - rect.top) * this.devicePixelRatio);\n\t\t\tuniforms.update(UniformMethod.Uniform2f, UniformType.Float, 'u_mouse', [MX, MY]);\n\t\t}\n\t\t*/\n\t};\n\tprotected updateUniformCamera__():void {\n\t\tconst uniforms = this.uniforms;\n\t\tconst array = OrbitCamera.toArray(this.camera);\n\t\tuniforms.update(UniformMethod.Uniform3f, UniformType.Float, 'u_camera', array);\n\t};\n\tprotected updateUniformMesh__():void {\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_projectionMatrix', this.updateProjectionMatrix_() as number[]);\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_modelViewMatrix', this.updateModelViewMatrix_(this.timer.delta) as number[]);\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_normalMatrix', this.updateNormalMatrix_(this.modelViewMatrix) as number[]);\n\t};\n\tprotected updateUniformFlat__():void {\n\t\tconst uniforms = this.uniforms;\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_projectionMatrix', mat4.create() as number[]);\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_modelViewMatrix', mat4.create() as number[]);\n\t\tuniforms.update(UniformMethod.UniformMatrix4fv, UniformType.Float, 'u_normalMatrix', mat4.create() as number[]);\n\t}\n\n\tprotected updateProjectionMatrix_(): mat4 {\n\t\tconst gl = this.gl;\n\t\tconst fieldOfView = 45 * Math.PI / 180;\n\t\tconst aspect = gl.drawingBufferWidth / gl.drawingBufferHeight;\n\t\tconst zNear = 0.1;\n\t\tconst zFar = 100.0;\n\t\tmat4.perspective(this.projectionMatrix, fieldOfView, aspect, zNear, zFar);\n\t\treturn this.projectionMatrix;\n\t}\n\n\tprotected updateModelViewMatrix_(deltaTime: number): mat4 {\n\t\tconst camera = this.camera;\n\t\tlet modelViewMatrix = this.modelViewMatrix;\n\t\tmodelViewMatrix = mat4.identity(modelViewMatrix);\n\t\tmat4.translate(modelViewMatrix, modelViewMatrix, [0.0, 0.0, -camera.radius]); // amount to translate\n\t\tmat4.rotate(modelViewMatrix, modelViewMatrix, camera.theta + this.radians, [0, 1, 0]); // axis to rotate around (Y)\n\t\tmat4.rotate(modelViewMatrix, modelViewMatrix, camera.phi, [1, 0, 0]); // axis to rotate around (X)\n\t\tif (!camera.mouse) {\n\t\t\tcamera.theta += (0 - camera.theta) / 20;\n\t\t\tcamera.phi += (0 - camera.phi) / 20;\n\t\t\tthis.radians += deltaTime * 0.0005;\n\t\t}\n\t\treturn modelViewMatrix;\n\t}\n\n\tprotected updateNormalMatrix_(modelViewMatrix: mat4): mat4 {\n\t\t// this.normalMatrix = mat4.create();\n\t\tlet normalMatrix = this.normalMatrix;\n\t\tnormalMatrix = mat4.identity(normalMatrix);\n\t\tmat4.invert(normalMatrix, modelViewMatrix);\n\t\tmat4.transpose(normalMatrix, normalMatrix);\n\t\treturn normalMatrix;\n\t}\n\n\tpublic setMode(mode: ContextMode) {\n\t\tlet geometry: Geometry;\n\t\tif (mode === ContextMode.Mesh) {\n\t\t\tgeometry = this.cache[this.mesh];\n\t\t\tif (geometry) {\n\t\t\t\tthis.geometry = geometry;\n\t\t\t\tthis.mode = ContextMode.Mesh;\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformMesh__;\n\t\t\t\tthis.dirty = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tlet loader: ObjLoader;\n\t\tswitch (mode) {\n\t\t\tcase ContextMode.Flat:\n\t\t\t\tgeometry = new FlatGeometry();\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformNoop_;\n\t\t\t\tthis.updateUniformFlat__();\n\t\t\t\tbreak;\n\t\t\tcase ContextMode.Box:\n\t\t\t\tgeometry = new BoxGeometry();\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformMesh__;\n\t\t\t\tbreak;\n\t\t\tcase ContextMode.Sphere:\n\t\t\t\tgeometry = new SphereGeometry();\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformMesh__;\n\t\t\t\tbreak;\n\t\t\tcase ContextMode.Torus:\n\t\t\t\tgeometry = new TorusGeometry();\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformMesh__;\n\t\t\t\tbreak;\n\t\t\tcase ContextMode.Mesh:\n\t\t\t\tgeometry = new FlatGeometry();\n\t\t\t\tif (this.mesh) {\n\t\t\t\t\tloader = new ObjLoader();\n\t\t\t\t\tloader.load(Common.getResource(this.mesh, this.workpath)).then(geometry => {\n\t\t\t\t\t\tgeometry.createAttributes_(this.gl, this.program);\n\t\t\t\t\t\tconst cache: { [key: string]: Geometry } = {};\n\t\t\t\t\t\tcache[this.mesh] = geometry;\n\t\t\t\t\t\tthis.cache = cache;\n\t\t\t\t\t\tthis.geometry = geometry;\n\t\t\t\t\t\tthis.dirty = true;\n\t\t\t\t\t}, error => {\n\t\t\t\t\t\tLogger.warn('GlslCanvas', error);\n\t\t\t\t\t\tthis.mode = ContextMode.Flat;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tmode = ContextMode.Flat;\n\t\t\t\t}\n\t\t\t\tthis.updateUniformMesh_ = this.updateUniformMesh__;\n\t\t\t\tbreak;\n\t\t}\n\t\tgeometry.create(this.gl, this.program);\n\t\tthis.geometry = geometry;\n\t\tthis.mode = mode;\n\t\tthis.dirty = true;\n\t}\n\n\tpublic setMesh(mesh: string) {\n\t\tthis.mesh = mesh;\n\t}\n}\n","import 'promise-polyfill';\nimport Buffers, { IOBuffer } from '../buffers/buffers';\nimport Context, { ContextMode } from '../context/context';\nimport Common from '../core/common';\nimport Logger from '../logger/logger';\nimport Vector2 from '../math/vector2';\nimport Renderer from '../renderer/renderer';\nimport Textures, { ITextureData, ITextureOptions, Texture } from '../textures/textures';\nimport Uniforms, { IUniformOption, Uniform, UniformMethod, UniformType } from '../uniforms/uniforms';\n\nexport interface ICanvasOptions extends WebGLContextAttributes {\n\tvertexString?: string;\n\tfragmentString?: string;\n\tbackgroundColor?: string;\n\tworkpath?: string;\n\tonError?: Function;\n\textensions?: string[];\n\tmode?: ContextMode;\n\tmesh?: string;\n\tdoubleSided?: boolean;\n}\n\nexport default class Canvas extends Renderer {\n\n\toptions: ICanvasOptions;\n\tcanvas: HTMLCanvasElement;\n\trect: ClientRect | DOMRect;\n\twidth: number;\n\theight: number;\n\tdevicePixelRatio: number;\n\tvalid: boolean = false;\n\tvisible: boolean = false;\n\tcontrols: boolean = false;\n\trafId: number;\n\tvertexPath: string = '';\n\tfragmentPath: string = '';\n\n\tstatic items: Canvas[] = [];\n\n\tconstructor(\n\t\tcanvas: HTMLCanvasElement,\n\t\toptions: ICanvasOptions = {\n\t\t\t// alpha: true,\n\t\t\t// antialias: true,\n\t\t\t// premultipliedAlpha: true\n\t\t}\n\t) {\n\t\tsuper();\n\t\tif (!canvas) {\n\t\t\treturn;\n\t\t}\n\t\tthis.options = options;\n\t\tthis.canvas = canvas;\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.rect = canvas.getBoundingClientRect();\n\t\tthis.devicePixelRatio = window.devicePixelRatio || 1;\n\t\tthis.mode = options.mode || ContextMode.Flat;\n\t\tthis.mesh = options.mesh || undefined;\n\t\tthis.doubleSided = options.doubleSided || false;\n\t\tthis.defaultMesh = this.mesh;\n\t\tthis.workpath = options.workpath;\n\t\tcanvas.style.backgroundColor = options.backgroundColor || 'rgba(0,0,0,0)';\n\t\tthis.getShaders_().then((_) => {\n\t\t\tthis.load().then(_ => {\n\t\t\t\tif (!this.program) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.addListeners_();\n\t\t\t\tthis.onLoop();\n\t\t\t});\n\t\t}, (error) => {\n\t\t\tLogger.error('GlslCanvas.getShaders_.error', error);\n\t\t});\n\t\tCanvas.items.push(this);\n\t}\n\n\tprivate getShaders_(): Promise<string[]> {\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.vertexString = this.options.vertexString || this.vertexString;\n\t\t\tthis.fragmentString = this.options.fragmentString || this.fragmentString;\n\t\t\tconst canvas = this.canvas;\n\t\t\tconst urls: any = {};\n\t\t\tif (canvas.hasAttribute('data-vertex-url')) {\n\t\t\t\turls.vertex = canvas.getAttribute('data-vertex-url');\n\t\t\t}\n\t\t\tif (canvas.hasAttribute('data-fragment-url')) {\n\t\t\t\turls.fragment = canvas.getAttribute('data-fragment-url');\n\t\t\t}\n\t\t\tif (canvas.hasAttribute('data-vertex')) {\n\t\t\t\tthis.vertexString = canvas.getAttribute('data-vertex');\n\t\t\t}\n\t\t\tif (canvas.hasAttribute('data-fragment')) {\n\t\t\t\tthis.fragmentString = canvas.getAttribute('data-fragment');\n\t\t\t}\n\t\t\tif (Object.keys(urls).length) {\n\t\t\t\tPromise.all(Object.keys(urls).map((key) => {\n\t\t\t\t\tconst url = Common.getResource(urls[key], this.workpath);\n\t\t\t\t\treturn Common.fetch(url)\n\t\t\t\t\t\t// .then((response) => response.text())\n\t\t\t\t\t\t.then((body) => {\n\t\t\t\t\t\t\tconst path = Common.dirname(urls[key]);\n\t\t\t\t\t\t\tif (key === 'vertex') {\n\t\t\t\t\t\t\t\tthis.vertexPath = path;\n\t\t\t\t\t\t\t\treturn this.vertexString = body;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.fragmentPath = path;\n\t\t\t\t\t\t\t\treturn this.fragmentString = body;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t})).then(_ => {\n\t\t\t\t\tresolve([this.vertexString, this.fragmentString]);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresolve([this.vertexString, this.fragmentString]);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate addListeners_(): void {\n\t\t/*\n\t\tconst resize = (e: Event) => {\n\t\t\tthis.rect = this.canvas.getBoundingClientRect();\n\t\t\tthis.trigger('resize', e);\n\t\t};\n\t\t*/\n\t\tthis.onScroll = this.onScroll.bind(this);\n\t\tthis.onWheel = this.onWheel.bind(this);\n\t\tthis.onClick = this.onClick.bind(this);\n\t\tthis.onMove = this.onMove.bind(this);\n\t\tthis.onMouseDown = this.onMouseDown.bind(this);\n\t\tthis.onMouseMove = this.onMouseMove.bind(this);\n\t\tthis.onMouseOver = this.onMouseOver.bind(this);\n\t\tthis.onMouseOut = this.onMouseOut.bind(this);\n\t\tthis.onMouseUp = this.onMouseUp.bind(this);\n\t\tthis.onTouchMove = this.onTouchMove.bind(this);\n\t\tthis.onTouchEnd = this.onTouchEnd.bind(this);\n\t\tthis.onTouchStart = this.onTouchStart.bind(this);\n\t\tthis.onLoop = this.onLoop.bind(this);\n\t\t// window.addEventListener('resize', this.onResize);\n\t\twindow.addEventListener('scroll', this.onScroll);\n\t\tdocument.addEventListener('mousemove', this.onMouseMove, false);\n\t\tdocument.addEventListener('touchmove', this.onTouchMove);\n\t\tthis.addCanvasListeners_();\n\t}\n\n\tprivate addCanvasListeners_() {\n\t\tthis.controls = this.canvas.hasAttribute('controls');\n\t\tthis.canvas.addEventListener('wheel', this.onWheel);\n\t\tthis.canvas.addEventListener('click', this.onClick);\n\t\tthis.canvas.addEventListener('mousedown', this.onMouseDown);\n\t\tthis.canvas.addEventListener('touchstart', this.onTouchStart);\n\t\tif (this.controls) {\n\t\t\tthis.canvas.addEventListener('mouseover', this.onMouseOver);\n\t\t\tthis.canvas.addEventListener('mouseout', this.onMouseOut);\n\t\t\tif (!this.canvas.hasAttribute('data-autoplay')) {\n\t\t\t\tthis.pause();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate removeCanvasListeners_() {\n\t\tthis.canvas.removeEventListener('wheel', this.onWheel);\n\t\tthis.canvas.removeEventListener('click', this.onClick);\n\t\tthis.canvas.removeEventListener('mousedown', this.onMouseDown);\n\t\tthis.canvas.removeEventListener('mouseup', this.onMouseUp);\n\t\tthis.canvas.removeEventListener('touchstart', this.onTouchStart);\n\t\tthis.canvas.removeEventListener('touchend', this.onTouchEnd);\n\t\tif (this.controls) {\n\t\t\tthis.canvas.removeEventListener('mouseover', this.onMouseOver);\n\t\t\tthis.canvas.removeEventListener('mouseout', this.onMouseOut);\n\t\t}\n\t}\n\n\tprivate removeListeners_() {\n\t\twindow.cancelAnimationFrame(this.rafId);\n\t\t// window.removeEventListener('resize', this.onResize);\n\t\twindow.removeEventListener('scroll', this.onScroll);\n\t\tdocument.removeEventListener('mousemove', this.onMouseMove);\n\t\tdocument.removeEventListener('touchmove', this.onTouchMove);\n\t\tthis.removeCanvasListeners_();\n\t}\n\n\tprivate onScroll(_: Event) {\n\t\tthis.rect = this.canvas.getBoundingClientRect();\n\t}\n\n\tprivate onWheel(e: WheelEvent) {\n\t\tthis.camera.wheel(e.deltaY);\n\t\tthis.dirty = this.mode !== ContextMode.Flat;\n\t\tthis.trigger('wheel', e);\n\t}\n\n\tprivate onClick(e: MouseEvent) {\n\t\tif (this.controls) {\n\t\t\tthis.toggle();\n\t\t}\n\t\tthis.trigger('click', e);\n\t}\n\n\tprivate onDown(mx: number, my: number) {\n\t\tconst rect = this.rect;\n\t\tmx = (mx - rect.left);\n\t\tmy = (rect.height - (my - rect.top));\n\t\tconst x = mx * this.devicePixelRatio;\n\t\tconst y = my * this.devicePixelRatio;\n\t\tthis.mouse.x = x;\n\t\tthis.mouse.y = y;\n\t\tconst min = Math.min(rect.width, rect.height);\n\t\tthis.camera.down(mx / min, my / min);\n\t\tthis.trigger('down', this.mouse);\n\t}\n\n\tprivate onMove(mx: number, my: number) {\n\t\tconst rect = this.rect;\n\t\tmx = (mx - rect.left);\n\t\tmy = (rect.height - (my - rect.top));\n\t\tconst x = mx * this.devicePixelRatio;\n\t\tconst y = my * this.devicePixelRatio;\n\t\tif (x !== this.mouse.x ||\n\t\t\ty !== this.mouse.y) {\n\t\t\tthis.mouse.x = x;\n\t\t\tthis.mouse.y = y;\n\t\t\tconst min = Math.min(rect.width, rect.height);\n\t\t\tthis.camera.move(mx / min, my / min);\n\t\t\tthis.dirty = this.mode !== ContextMode.Flat && this.camera.mouse !== null;\n\t\t\tthis.trigger('move', this.mouse);\n\t\t}\n\t}\n\n\tprivate onUp(e: Event) {\n\t\tthis.camera.up();\n\t\tif (this.controls) {\n\t\t\tthis.pause();\n\t\t}\n\t\tthis.trigger('out', e);\n\t}\n\n\tprivate onMouseDown(e: MouseEvent) {\n\t\tthis.onDown(e.clientX, e.clientY);\n\t\tdocument.addEventListener('mouseup', this.onMouseUp);\n\t\tdocument.removeEventListener('touchstart', this.onTouchStart);\n\t\tdocument.removeEventListener('touchmove', this.onTouchMove);\n\t}\n\n\tprivate onMouseMove(e: MouseEvent) {\n\t\tthis.onMove(e.clientX, e.clientY);\n\t}\n\n\tprivate onMouseUp(e: MouseEvent) {\n\t\tthis.onUp(e);\n\t}\n\n\tprivate onMouseOver(e: MouseEvent) {\n\t\tthis.play();\n\t\tthis.trigger('over', e);\n\t}\n\n\tprivate onMouseOut(e: MouseEvent) {\n\t\tthis.pause();\n\t\tthis.trigger('out', e);\n\t}\n\n\tprivate onTouchStart(e: TouchEvent) {\n\t\tconst touch = [].slice.call(e.touches).reduce((p: Vector2, touch: Touch) => {\n\t\t\tp = p || new Vector2();\n\t\t\tp.x += touch.clientX;\n\t\t\tp.y += touch.clientY;\n\t\t\treturn p;\n\t\t}, null);\n\t\tif (touch) {\n\t\t\tthis.onDown(touch.x / e.touches.length, touch.y / e.touches.length);\n\t\t}\n\t\tif (this.controls) {\n\t\t\tthis.play();\n\t\t}\n\t\tthis.trigger('over', e);\n\t\tdocument.addEventListener('touchend', this.onTouchEnd);\n\t\tdocument.removeEventListener('mousedown', this.onMouseDown);\n\t\tdocument.removeEventListener('mousemove', this.onMouseMove);\n\t\tif (this.controls) {\n\t\t\tthis.canvas.removeEventListener('mouseover', this.onMouseOver);\n\t\t\tthis.canvas.removeEventListener('mouseout', this.onMouseOut);\n\t\t}\n\t}\n\n\tprivate onTouchMove(e: TouchEvent) {\n\t\tconst touch = [].slice.call(e.touches).reduce((p: Vector2, touch: Touch) => {\n\t\t\tp = p || new Vector2();\n\t\t\tp.x += touch.clientX;\n\t\t\tp.y += touch.clientY;\n\t\t\treturn p;\n\t\t}, null);\n\t\tif (touch) {\n\t\t\tthis.onMove(touch.x / e.touches.length, touch.y / e.touches.length);\n\t\t}\n\t}\n\n\tprivate onTouchEnd(e: TouchEvent) {\n\t\tthis.onUp(e);\n\t\tdocument.removeEventListener('touchend', this.onTouchEnd);\n\t}\n\n\tprivate onLoop(_?: number) {\n\t\tthis.checkRender();\n\t\tthis.rafId = window.requestAnimationFrame(this.onLoop);\n\t}\n\n\tprivate setUniform_(\n\t\tkey: string,\n\t\tvalues: any[],\n\t\toptions: ITextureOptions = {},\n\t\ttype: UniformType = null\n\t): void {\n\t\tconst uniform: Uniform | Uniform[] = Uniforms.parseUniform(key, values, type);\n\t\tif (Array.isArray(uniform)) {\n\t\t\tif (Uniforms.isArrayOfSampler2D(uniform)) {\n\t\t\t\tuniform.forEach((x) => this.loadTexture(x.key, x.values[0], options));\n\t\t\t} else {\n\t\t\t\tuniform.forEach((x) => this.uniforms.set(x.key, x.values[0]));\n\t\t\t}\n\t\t} else if (uniform) {\n\t\t\tswitch (uniform.type) {\n\t\t\t\tcase UniformType.Sampler2D:\n\t\t\t\t\tthis.loadTexture(key, values[0], options);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.uniforms.set(key, uniform);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isVisible_(): boolean {\n\t\tconst rect = this.rect;\n\t\treturn (rect.top + rect.height) > 0 && rect.top < (window.innerHeight || document.documentElement.clientHeight);\n\t}\n\n\tprivate isAnimated_(): boolean {\n\t\treturn (this.animated || this.textures.animated || this.mode !== ContextMode.Flat) && !this.timer.paused;\n\t}\n\n\tprivate isDirty_(): boolean {\n\t\treturn this.dirty || this.uniforms.dirty || this.textures.dirty;\n\t}\n\n\t// check size change at start of requestFrame\n\tprivate sizeDidChanged_(): boolean {\n\t\tconst gl = this.gl;\n\t\tconst CW = Math.ceil(this.canvas.clientWidth),\n\t\t\tCH = Math.ceil(this.canvas.clientHeight);\n\t\tif (this.width !== CW ||\n\t\t\tthis.height !== CH) {\n\t\t\tthis.width = CW;\n\t\t\tthis.height = CH;\n\t\t\t// Lookup the size the browser is displaying the canvas in CSS pixels\n\t\t\t// and compute a size needed to make our drawingbuffer match it in\n\t\t\t// device pixels.\n\t\t\tconst W = Math.ceil(CW * this.devicePixelRatio);\n\t\t\tconst H = Math.ceil(CH * this.devicePixelRatio);\n\t\t\tthis.W = W;\n\t\t\tthis.H = H;\n\t\t\tthis.canvas.width = W;\n\t\t\tthis.canvas.height = H;\n\t\t\t/*\n\t\t\tif (gl.canvas.width !== W ||\n\t\t\t\tgl.canvas.height !== H) {\n\t\t\t\tgl.canvas.width = W;\n\t\t\t\tgl.canvas.height = H;\n\t\t\t\t// Set the viewport to match\n\t\t\t\t// gl.viewport(0, 0, W, H);\n\t\t\t}\n\t\t\t*/\n\t\t\tObject.keys(this.buffers.values).forEach((key) => {\n\t\t\t\tconst buffer: IOBuffer = this.buffers.values[key];\n\t\t\t\tbuffer.resize(gl, W, H);\n\t\t\t});\n\t\t\tthis.rect = this.canvas.getBoundingClientRect();\n\t\t\tthis.trigger('resize');\n\t\t\t// gl.useProgram(this.program);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate parseTextures_(fragmentString: string): boolean {\n\t\tconst regexp = /uniform\\s*sampler2D\\s*([\\w]*);(\\s*\\/\\/\\s*([\\w|\\:\\/\\/|\\.|\\-|\\_|\\?|\\&|\\=]*)|\\s*)/gm;\n\t\tlet matches;\n\t\twhile ((matches = regexp.exec(fragmentString)) !== null) {\n\t\t\tconst key = matches[1];\n\t\t\tconst url = matches[3];\n\t\t\tif (Texture.isTextureUrl(url)) {\n\t\t\t\tthis.textureList.push({ key, url });\n\t\t\t} else if (!this.buffers.has(key)) {\n\t\t\t\t// create empty texture\n\t\t\t\tthis.textureList.push({ key, url: null });\n\t\t\t}\n\t\t}\n\t\tif (this.canvas.hasAttribute('data-textures')) {\n\t\t\tconst urls = this.canvas.getAttribute('data-textures').split(',');\n\t\t\turls.forEach((url: string, i: number) => {\n\t\t\t\tconst key = 'u_texture' + i;\n\t\t\t\tthis.textureList.push({ key, url });\n\t\t\t});\n\t\t}\n\t\treturn this.textureList.length > 0;\n\t}\n\n\tload(\n\t\tfragmentString?: string,\n\t\tvertexString?: string\n\t): Promise<boolean> {\n\t\tconst fragmentVertexString: string = Context.getFragmentVertex(this.gl, fragmentString || this.fragmentString);\n\t\treturn Promise.all([\n\t\t\tContext.getIncludes(fragmentString || this.fragmentString, this.fragmentPath === '' ? this.workpath : this.fragmentPath),\n\t\t\tContext.getIncludes(fragmentVertexString || vertexString || this.vertexString, this.vertexPath === '' ? this.workpath : this.vertexPath)\n\t\t]).then(array => {\n\t\t\tthis.fragmentString = array[0];\n\t\t\tthis.vertexString = array[1];\n\t\t\treturn this.createContext_();\n\t\t});\n\t}\n\n\tprivate getContext_(): WebGLRenderingContext | WebGL2RenderingContext {\n\t\tconst vertexString = this.vertexString;\n\t\tconst fragmentString = this.fragmentString;\n\t\tthis.vertexString = Context.getVertex(vertexString, fragmentString, this.mode);\n\t\tthis.fragmentString = Context.getFragment(vertexString, fragmentString, this.mode);\n\t\tif (Context.versionDiffers(this.gl, vertexString, fragmentString)) {\n\t\t\tthis.destroyContext_();\n\t\t\tthis.swapCanvas_();\n\t\t\tthis.uniforms = new Uniforms();\n\t\t\tthis.buffers = new Buffers();\n\t\t\tthis.textures = new Textures();\n\t\t\tthis.textureList = [];\n\t\t}\n\t\tif (!this.gl) {\n\t\t\tconst gl = Context.tryInferContext(vertexString, fragmentString, this.canvas, this.options, this.options.extensions, this.options.onError);\n\t\t\tif (!gl) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthis.gl = gl;\n\t\t}\n\t\treturn this.gl;\n\t}\n\n\tprivate createContext_(): boolean {\n\t\tconst gl = this.getContext_();\n\t\tif (!gl) {\n\t\t\treturn false;\n\t\t}\n\t\tlet vertexShader, fragmentShader;\n\t\ttry {\n\t\t\tContext.inferPrecision(this.fragmentString);\n\t\t\tvertexShader = Context.createShader(gl, this.vertexString, gl.VERTEX_SHADER);\n\t\t\tfragmentShader = Context.createShader(gl, this.fragmentString, gl.FRAGMENT_SHADER);\n\t\t\t// If Fragment shader fails load a empty one to sign the error\n\t\t\tif (!fragmentShader) {\n\t\t\t\tconst defaultFragment = Context.getFragment(null, null, this.mode);\n\t\t\t\tfragmentShader = Context.createShader(gl, defaultFragment, gl.FRAGMENT_SHADER);\n\t\t\t\tthis.valid = false;\n\t\t\t} else {\n\t\t\t\tthis.valid = true;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// !!!\n\t\t\t// console.error(e);\n\t\t\tthis.trigger('error', e);\n\t\t\treturn false;\n\t\t}\n\t\t// Create and use program\n\t\tconst program = Context.createProgram(gl, [vertexShader, fragmentShader]); //, [0,1],['a_texcoord','a_position']);\n\t\tif (!program) {\n\t\t\tthis.trigger('error', Context.lastError);\n\t\t\treturn false;\n\t\t}\n\t\t// console.log(this.vertexString, this.fragmentString, program);\n\t\t// Delete shaders\n\t\t// gl.detachShader(program, vertexShader);\n\t\t// gl.detachShader(program, fragmentShader);\n\t\tgl.deleteShader(vertexShader);\n\t\tgl.deleteShader(fragmentShader);\n\t\tthis.program = program;\n\t\tif (this.valid) {\n\t\t\ttry {\n\t\t\t\tthis.buffers = Buffers.getBuffers(gl, this.fragmentString, Context.getBufferVertex(gl));\n\t\t\t} catch (e) {\n\t\t\t\t// console.error('load', e);\n\t\t\t\tthis.valid = false;\n\t\t\t\tthis.trigger('error', e);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.create_();\n\t\t\tif (this.animated) {\n\t\t\t\tthis.canvas.classList.add('animated');\n\t\t\t} else {\n\t\t\t\tthis.canvas.classList.remove('animated');\n\t\t\t}\n\t\t}\n\t\t// Trigger event\n\t\tthis.trigger('load', this);\n\t\treturn this.valid;\n\t}\n\n\tprotected create_(): void {\n\t\tthis.parseMode_();\n\t\tthis.parseMesh_();\n\t\tsuper.create_();\n\t\tthis.createBuffers_();\n\t\tthis.createTextures_();\n\t}\n\n\tprotected parseMode_() {\n\t\tif (this.canvas.hasAttribute('data-mode')) {\n\t\t\tconst data = this.canvas.getAttribute('data-mode');\n\t\t\tif (['flat', 'box', 'sphere', 'torus', 'mesh'].indexOf(data) !== -1) {\n\t\t\t\tthis.mode = data as ContextMode;\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected parseMesh_() {\n\t\tif (this.canvas.hasAttribute('data-mesh')) {\n\t\t\tconst data = this.canvas.getAttribute('data-mesh');\n\t\t\tif (data.indexOf('.obj') !== -1) {\n\t\t\t\tthis.mesh = this.defaultMesh = data;\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected createBuffers_() {\n\t\tObject.keys(this.buffers.values).forEach((key) => {\n\t\t\tconst buffer: IOBuffer = this.buffers.values[key];\n\t\t\tthis.uniforms.create(UniformMethod.Uniform1i, UniformType.Sampler2D, buffer.key, [buffer.input.index]);\n\t\t});\n\t}\n\n\tprotected createTextures_() {\n\t\tconst hasTextures = this.parseTextures_(this.fragmentString);\n\t\tif (hasTextures) {\n\t\t\tthis.textureList.filter(x => x.url).forEach(x => {\n\t\t\t\tthis.setTexture(x.key, x.url, x.options);\n\t\t\t});\n\t\t\tthis.textureList = [];\n\t\t}\n\t}\n\n\tprotected update_(): void {\n\t\tsuper.update_();\n\t\tthis.updateBuffers_();\n\t\tthis.updateTextures_();\n\t}\n\n\tprotected updateBuffers_(): void {\n\t\tObject.keys(this.buffers.values).forEach((key) => {\n\t\t\tconst buffer: IOBuffer = this.buffers.values[key];\n\t\t\tthis.uniforms.update(UniformMethod.Uniform1i, UniformType.Sampler2D, buffer.key, [buffer.input.index]);\n\t\t});\n\t}\n\n\tprotected updateTextures_(): void {\n\t\tconst gl = this.gl;\n\t\tObject.keys(this.textures.values).forEach((key) => {\n\t\t\tconst texture: Texture = this.textures.values[key];\n\t\t\ttexture.tryUpdate(gl);\n\t\t\tthis.uniforms.update(UniformMethod.Uniform1i, UniformType.Sampler2D, texture.key, [texture.index]);\n\t\t});\n\t}\n\n\tprivate destroyContext_(): void {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(null);\n\t\tif (this.program) {\n\t\t\tgl.deleteProgram(this.program);\n\t\t}\n\t\tObject.keys(this.buffers.values).forEach((key) => {\n\t\t\tconst buffer: IOBuffer = this.buffers.values[key];\n\t\t\tbuffer.destroy(gl);\n\t\t});\n\t\tObject.keys(this.textures.values).forEach((key) => {\n\t\t\tconst texture: Texture = this.textures.values[key];\n\t\t\ttexture.destroy(gl);\n\t\t});\n\t\tthis.buffers = null;\n\t\tthis.textures = null;\n\t\tthis.uniforms = null;\n\t\tthis.program = null;\n\t\tthis.gl = null;\n\t}\n\n\tprivate swapCanvas_(): void {\n\t\tconst canvas = this.canvas;\n\t\tconst canvas_ = canvas.cloneNode() as HTMLCanvasElement;\n\t\tcanvas.parentNode.replaceChild(canvas_, canvas);\n\t\tthis.canvas = canvas_;\n\t\tthis.addCanvasListeners_();\n\t}\n\n\tdestroy(): void {\n\t\tthis.removeListeners_();\n\t\tthis.destroyContext_();\n\t\tthis.animated = false;\n\t\tthis.valid = false;\n\t\tconst index = Canvas.items.indexOf(this);\n\t\tif (index !== -1) {\n\t\t\tCanvas.items.splice(index, 1);\n\t\t}\n\t}\n\n\tloadTexture(\n\t\tkey: string,\n\t\turlElementOrData: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData,\n\t\toptions: ITextureOptions = {}\n\t) {\n\t\tif (this.valid) {\n\t\t\t// Logger.log('GlslCanvas.loadTexture', key, urlElementOrData);\n\t\t\tthis.textures.createOrUpdate(this.gl, key, urlElementOrData, this.buffers.count, options, this.options.workpath).then(\n\t\t\t\ttexture => {\n\t\t\t\t\tconst index = texture.index;\n\t\t\t\t\tconst uniform = this.uniforms.createTexture(key, index);\n\t\t\t\t\tuniform.texture = texture;\n\t\t\t\t\tconst keyResolution = key.indexOf('[') !== -1 ? key.replace('[', 'Resolution[') : key + 'Resolution';\n\t\t\t\t\t// const uniformResolution = ;\n\t\t\t\t\tthis.uniforms.create(UniformMethod.Uniform2f, UniformType.Float, keyResolution, [texture.width, texture.height]);\n\t\t\t\t\t// Logger.log('loadTexture', key, url, index, texture.width, texture.height);\n\t\t\t\t\treturn texture;\n\t\t\t\t},\n\t\t\t\terror => {\n\t\t\t\t\tconst message = Array.isArray(error.path) ? error.path.map((x: any) => x.error ? x.error.message : '').join(', ') : error.message;\n\t\t\t\t\tLogger.error('GlslCanvas.loadTexture.error', key, urlElementOrData, message);\n\t\t\t\t\tthis.trigger('textureError', { key, urlElementOrData, message });\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.textureList.push({ key, url: urlElementOrData, options });\n\t\t}\n\t}\n\n\tsetTexture(\n\t\tkey: string,\n\t\turlElementOrData: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | Element | ITextureData,\n\t\toptions: ITextureOptions = {}\n\t): void {\n\t\treturn this.setUniform_(key, [urlElementOrData], options);\n\t}\n\n\tsetUniform(key: string, ...values: any[]): void {\n\t\treturn this.setUniform_(key, values);\n\t}\n\n\tsetUniformOfInt(key: string, values: any[]): void {\n\t\treturn this.setUniform_(key, values, null, UniformType.Int);\n\t}\n\n\tsetUniforms(values: IUniformOption): void {\n\t\tObject.keys(values).forEach((key) => {\n\t\t\tthis.setUniform(key, values[key]);\n\t\t});\n\t}\n\n\tpause(): void {\n\t\tif (this.valid) {\n\t\t\tthis.timer.pause();\n\t\t\tthis.canvas.classList.add('paused');\n\t\t\tthis.trigger('pause');\n\t\t}\n\t}\n\n\tplay(): void {\n\t\tif (this.valid) {\n\t\t\tthis.timer.play();\n\t\t\tthis.canvas.classList.remove('paused');\n\t\t\tthis.trigger('play');\n\t\t}\n\t}\n\n\ttoggle(): void {\n\t\tif (this.valid) {\n\t\t\tif (this.timer.paused) {\n\t\t\t\tthis.play();\n\t\t\t} else {\n\t\t\t\tthis.pause();\n\t\t\t}\n\t\t}\n\t}\n\n\tcheckRender(): void {\n\t\tif (this.isVisible_() && (this.sizeDidChanged_() || this.isDirty_() || this.isAnimated_())) {\n\t\t\tthis.render();\n\t\t\tthis.canvas.classList.add('playing');\n\t\t} else {\n\t\t\tthis.canvas.classList.remove('playing');\n\t\t}\n\t}\n\n\t/*\n\ttest(\n\t\tfragmentString?: string,\n\t\tvertexString?: string\n\t): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst vertex = this.vertexString;\n\t\t\tconst fragment = this.fragmentString;\n\t\t\tconst paused = this.timer.paused;\n\t\t\t// Thanks to @thespite for the help here\n\t\t\t// https://www.khronos.org/registry/webgl/extensions/EXT_disjoint_timer_query/\n\t\t\tconst extension = this.gl.getExtension('EXT_disjoint_timer_query');\n\t\t\tconst query = extension.createQueryEXT();\n\t\t\tlet wasValid = this.valid;\n\t\t\tif (fragmentString || vertexString) {\n\t\t\t\tthis.load(fragmentString, vertexString);\n\t\t\t\twasValid = this.valid;\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.timer.paused = true;\n\t\t\textension.beginQueryEXT(extension.TIME_ELAPSED_EXT, query);\n\t\t\tthis.render();\n\t\t\textension.endQueryEXT(extension.TIME_ELAPSED_EXT);\n\t\t\tconst waitForTest = () => {\n\t\t\t\tthis.render();\n\t\t\t\tconst available = extension.getQueryObjectEXT(query, extension.QUERY_RESULT_AVAILABLE_EXT);\n\t\t\t\tconst disjoint = this.gl.getParameter(extension.GPU_DISJOINT_EXT);\n\t\t\t\tif (available && !disjoint) {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\twasValid: wasValid,\n\t\t\t\t\t\tfragment: fragmentString || this.fragmentString,\n\t\t\t\t\t\tvertex: vertexString || this.vertexString,\n\t\t\t\t\t\ttimeElapsedMs: extension.getQueryObjectEXT(query, extension.QUERY_RESULT_EXT) / 1000000.0\n\t\t\t\t\t};\n\t\t\t\t\tthis.timer.paused = paused;\n\t\t\t\t\tif (fragmentString || vertexString) {\n\t\t\t\t\t\tthis.load(fragment, vertex);\n\t\t\t\t\t}\n\t\t\t\t\tresolve(result);\n\t\t\t\t} else {\n\t\t\t\t\twindow.requestAnimationFrame(waitForTest);\n\t\t\t\t}\n\t\t\t}\n\t\t\twaitForTest();\n\t\t});\n\t}\n\t*/\n\n}\n\n","export { Buffer, BufferFloatType, default as Buffers, IOBuffer } from './buffers/buffers';\nexport { default as OrbitCamera } from './camera/orbit-camera';\nexport { default as Canvas, ICanvasOptions } from './canvas/canvas';\nexport { default as CanvasTimer } from './canvas/canvas-timer';\nexport { DefaultWebGL2BufferFragment, DefaultWebGL2BufferVertex, DefaultWebGL2FlatFragment, DefaultWebGL2MeshFragment, DefaultWebGL2MeshVertex, DefaultWebGLBufferFragment, DefaultWebGLBufferVertex, DefaultWebGLFlatFragment, DefaultWebGLMeshFragment, DefaultWebGLMeshVertex } from './context/chunks';\nexport { ContextError, ContextVersion, ContextVertexBuffers, default as Context } from './context/context';\nexport { default as Common } from './core/common';\nexport { default as IterableStringMap } from './core/iterable';\nexport { default as Subscriber, Listener } from './core/subscriber';\nexport { default as BoxGeometry } from './geometry/box-geometry';\nexport { default as FlatGeometry } from './geometry/flat-geometry';\nexport { default as Geometry } from './geometry/geometry';\nexport { default as SphereGeometry } from './geometry/sphere-geometry';\nexport { default as TorusGeometry } from './geometry/torus-geometry';\nexport { default as ObjLoader } from './loaders/obj-loader';\nexport { default as Logger } from './logger/logger';\nexport { default as Vector2 } from './math/vector2';\nexport { default as Vector3 } from './math/vector3';\nexport { default as Renderer } from './renderer/renderer';\nexport { default as Textures, isTextureData, ITextureData, ITextureInput, ITextureOptions, Texture, TextureExtensions, TextureFilteringType, TextureImageExtensions, TextureSourceType, TextureVideoExtensions } from './textures/textures';\nexport { default as Uniforms, IUniformOption, METHODS_FLOAT, METHODS_FLOATV, METHODS_INT, METHODS_INTV, Uniform, UniformMethod, UniformTexture, UniformType } from './uniforms/uniforms';\n\nimport Canvas, { ICanvasOptions } from './canvas/canvas';\n\nexport function of(canvas: HTMLCanvasElement, options?: ICanvasOptions): Canvas {\n\treturn Canvas.items.find(x => x.canvas === canvas) || new Canvas(canvas, options);\n}\n\nexport function loadAll(): Canvas[] {\n\tconst canvases: HTMLCanvasElement[] = <HTMLCanvasElement[]>[].slice.call(document.getElementsByClassName('glsl-canvas')).filter((x: HTMLElement) => x instanceof HTMLCanvasElement);\n\treturn canvases.map(x => of(x));\n}\n\nif (document) {\n\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\tloadAll();\n\t});\n}\n"]}