UNPKG

scratch-render

Version:
1,305 lines (1,209 loc) • 847 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 31); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { /*! * @license twgl.js 3.0.2 Copyright (c) 2015, Gregg Tavares All Rights Reserved. * Available via the MIT license. * see: http://github.com/greggman/twgl.js for details */ (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["twgl"] = factory(); else root["twgl"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(10), __webpack_require__(11), __webpack_require__(12)], __WEBPACK_AMD_DEFINE_RESULT__ = function (twgl, m4, v3, primitives) { "use strict"; twgl.m4 = m4; twgl.v3 = v3; twgl.primitives = primitives; return twgl; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; /* * Copyright 2015, Gregg Tavares. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Gregg Tavares. nor the names of his * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2), __webpack_require__(5), __webpack_require__(7), __webpack_require__(6), __webpack_require__(8), __webpack_require__(3), __webpack_require__(9), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function (attributes, draw, framebuffers, programs, textures, typedArrays, vertexArrays, utils) { "use strict"; /** * The main TWGL module. * * For most use cases you shouldn't need anything outside this module. * Exceptions between the stuff added to twgl-full (v3, m4, primitives) * * @module twgl * @borrows module:twgl/attributes.setAttribInfoBufferFromArray as setAttribInfoBufferFromArray * @borrows module:twgl/attributes.createBufferInfoFromArrays as createBufferInfoFromArrays * @borrows module:twgl/attributes.createVertexArrayInfo as createVertexArrayInfo * @borrows module:twgl/draw.drawBufferInfo as drawBufferInfo * @borrows module:twgl/draw.drawObjectList as drawObjectList * @borrows module:twgl/framebuffers.createFramebufferInfo as createFramebufferInfo * @borrows module:twgl/framebuffers.resizeFramebufferInfo as resizeFramebufferInfo * @borrows module:twgl/framebuffers.bindFramebufferInfo as bindFramebufferInfo * @borrows module:twgl/programs.createProgramInfo as createProgramInfo * @borrows module:twgl/programs.createUniformBlockInfo as createUniformBlockInfo * @borrows module:twgl/programs.bindUniformBlock as bindUniformBlock * @borrows module:twgl/programs.setUniformBlock as setUniformBlock * @borrows module:twgl/programs.setBlockUniforms as setBlockUniforms * @borrows module:twgl/programs.setUniforms as setUniforms * @borrows module:twgl/programs.setBuffersAndAttributes as setBuffersAndAttributes * @borrows module:twgl/textures.setTextureFromArray as setTextureFromArray * @borrows module:twgl/textures.createTexture as createTexture * @borrows module:twgl/textures.resizeTexture as resizeTexture * @borrows module:twgl/textures.createTextures as createTextures */ // make sure we don't see a global gl var gl = undefined; // eslint-disable-line var defaults = { enableVertexArrayObjects: true }; /** * Various default settings for twgl. * * Note: You can call this any number of times. Example: * * twgl.setDefaults({ textureColor: [1, 0, 0, 1] }); * twgl.setDefaults({ attribPrefix: 'a_' }); * * is equivalent to * * twgl.setDefaults({ * textureColor: [1, 0, 0, 1], * attribPrefix: 'a_', * }); * * @typedef {Object} Defaults * @property {string} attribPrefix The prefix to stick on attributes * * When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_` * as it makes it clear where they came from. But, when building geometry I prefer using unprefixed names. * * In otherwords I'll create arrays of geometry like this * * var arrays = { * position: ... * normal: ... * texcoord: ... * }; * * But need those mapped to attributes and my attributes start with `a_`. * * Default: `""` * * @property {number[]} textureColor Array of 4 values in the range 0 to 1 * * The default texture color is used when loading textures from * urls. Because the URL will be loaded async we'd like to be * able to use the texture immediately. By putting a 1x1 pixel * color in the texture we can start using the texture before * the URL has loaded. * * Default: `[0.5, 0.75, 1, 1]` * * @property {string} crossOrigin * * If not undefined sets the crossOrigin attribute on images * that twgl creates when downloading images for textures. * * Also see {@link module:twgl.TextureOptions}. * * @property {bool} enableVertexArrayObjects * * If true then in WebGL 1.0 will attempt to get the `OES_vertex_array_object` extension. * If successful it will copy create/bind/delete/isVertexArrayOES from the extension to * the WebGLRenderingContext removing the OES at the end which is the standard entry point * for WebGL 2. * * Note: According to webglstats.com 90% of devices support `OES_vertex_array_object`. * If you just want to count on support I suggest using [this polyfill](https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/resources/OESVertexArrayObject.js) * or ignoring devices that don't support them. * * Default: `true` * * @memberOf module:twgl */ /** * Sets various defaults for twgl. * * In the interest of terseness which is kind of the point * of twgl I've integrated a few of the older functions here * * @param {module:twgl.Defaults} newDefaults The default settings. * @memberOf module:twgl */ function setDefaults(newDefaults) { utils.copyExistingProperties(newDefaults, defaults); attributes.setDefaults_(newDefaults); // eslint-disable-line textures.setDefaults_(newDefaults); // eslint-disable-line } /** * Adds Vertex Array Objects to WebGL 1 GL contexts if available * @param {WebGLRenderingContext} gl A WebGLRenderingContext */ function addVertexArrayObjectSupport(gl) { if (!gl || !defaults.enableVertexArrayObjects) { return; } if (utils.isWebGL1(gl)) { var ext = gl.getExtension("OES_vertex_array_object"); if (ext) { gl.createVertexArray = function () { return ext.createVertexArrayOES(); }; gl.deleteVertexArray = function (v) { ext.deleteVertexArrayOES(v); }; gl.isVertexArray = function (v) { return ext.isVertexArrayOES(v); }; gl.bindVertexArray = function (v) { ext.bindVertexArrayOES(v); }; gl.VERTEX_ARRAY_BINDING = ext.VERTEX_ARRAY_BINDING_OES; } } } /** * Creates a webgl context. * @param {HTMLCanvasElement} canvas The canvas tag to get * context from. If one is not passed in one will be * created. * @return {WebGLRenderingContext} The created context. */ function create3DContext(canvas, opt_attribs) { var names = ["webgl", "experimental-webgl"]; var context = null; for (var ii = 0; ii < names.length; ++ii) { context = canvas.getContext(names[ii], opt_attribs); if (context) { break; } } return context; } /** * Gets a WebGL context. * @param {HTMLCanvasElement} canvas a canvas element. * @param {WebGLContextCreationAttirbutes} [opt_attribs] optional webgl context creation attributes * @memberOf module:twgl */ function getWebGLContext(canvas, opt_attribs) { var gl = create3DContext(canvas, opt_attribs); addVertexArrayObjectSupport(gl); return gl; } /** * Creates a webgl context. * * Will return a WebGL2 context if possible. * * You can check if it's WebGL2 with * * twgl.isWebGL2(gl); * * @param {HTMLCanvasElement} canvas The canvas tag to get * context from. If one is not passed in one will be * created. * @return {WebGLRenderingContext} The created context. */ function createContext(canvas, opt_attribs) { var names = ["webgl2", "webgl", "experimental-webgl"]; var context = null; for (var ii = 0; ii < names.length; ++ii) { context = canvas.getContext(names[ii], opt_attribs); if (context) { break; } } return context; } /** * Gets a WebGL context. Will create a WebGL2 context if possible. * * You can check if it's WebGL2 with * * function isWebGL2(gl) { * return gl.getParameter(gl.VERSION).indexOf("WebGL 2.0 ") == 0; * } * * @param {HTMLCanvasElement} canvas a canvas element. * @param {WebGLContextCreationAttirbutes} [opt_attribs] optional webgl context creation attributes * @return {WebGLRenderingContext} The created context. * @memberOf module:twgl */ function getContext(canvas, opt_attribs) { var gl = createContext(canvas, opt_attribs); addVertexArrayObjectSupport(gl); return gl; } /** * Resize a canvas to match the size it's displayed. * @param {HTMLCanvasElement} canvas The canvas to resize. * @param {number} [multiplier] So you can pass in `window.devicePixelRatio` if you want to. * @return {boolean} true if the canvas was resized. * @memberOf module:twgl */ function resizeCanvasToDisplaySize(canvas, multiplier) { multiplier = multiplier || 1; multiplier = Math.max(1, multiplier); var width = canvas.clientWidth * multiplier | 0; var height = canvas.clientHeight * multiplier | 0; if (canvas.width !== width || canvas.height !== height) { canvas.width = width; canvas.height = height; return true; } return false; } // Using quotes prevents Uglify from changing the names. // No speed diff AFAICT. var api = { "getContext": getContext, "getWebGLContext": getWebGLContext, "isWebGL1": utils.isWebGL1, "isWebGL2": utils.isWebGL2, "resizeCanvasToDisplaySize": resizeCanvasToDisplaySize, "setDefaults": setDefaults }; function notPrivate(name) { return name[name.length - 1] !== '_'; } function copyPublicProperties(src, dst) { Object.keys(src).filter(notPrivate).forEach(function (key) { dst[key] = src[key]; }); return dst; } var apis = { attributes: attributes, draw: draw, framebuffers: framebuffers, programs: programs, textures: textures, typedArrays: typedArrays, vertexArrays: vertexArrays }; Object.keys(apis).forEach(function (name) { var srcApi = apis[name]; copyPublicProperties(srcApi, api); api[name] = copyPublicProperties(srcApi, {}); }); return api; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); /***/ }, /* 2 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; /* * Copyright 2015, Gregg Tavares. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Gregg Tavares. nor the names of his * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function (typedArrays, utils) { "use strict"; /** * Low level attribute and buffer related functions * * You should generally not need to use these functions. They are provided * for those cases where you're doing something out of the ordinary * and you need lower level access. * * For backward compatibily they are available at both `twgl.attributes` and `twgl` * itself * * See {@link module:twgl} for core functions * * @module twgl/attributes */ // make sure we don't see a global gl var gl = undefined; // eslint-disable-line var defaults = { attribPrefix: "" }; /** * Sets the default attrib prefix * * When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_` * as it makes it clear where they came from. But, when building geometry I prefer using unprefixed names. * * In otherwords I'll create arrays of geometry like this * * var arrays = { * position: ... * normal: ... * texcoord: ... * }; * * But need those mapped to attributes and my attributes start with `a_`. * * @deprecated see {@link module:twgl.setDefaults} * @param {string} prefix prefix for attribs * @memberOf module:twgl/attributes */ function setAttributePrefix(prefix) { defaults.attribPrefix = prefix; } function setDefaults(newDefaults) { utils.copyExistingProperties(newDefaults, defaults); } function setBufferFromTypedArray(gl, type, buffer, array, drawType) { gl.bindBuffer(type, buffer); gl.bufferData(type, array, drawType || gl.STATIC_DRAW); } /** * Given typed array creates a WebGLBuffer and copies the typed array * into it. * * @param {WebGLRenderingContext} gl A WebGLRenderingContext * @param {ArrayBuffer|ArrayBufferView|WebGLBuffer} typedArray the typed array. Note: If a WebGLBuffer is passed in it will just be returned. No action will be taken * @param {number} [type] the GL bind type for the buffer. Default = `gl.ARRAY_BUFFER`. * @param {number} [drawType] the GL draw type for the buffer. Default = 'gl.STATIC_DRAW`. * @return {WebGLBuffer} the created WebGLBuffer * @memberOf module:twgl/attributes */ function createBufferFromTypedArray(gl, typedArray, type, drawType) { if (typedArray instanceof WebGLBuffer) { return typedArray; } type = type || gl.ARRAY_BUFFER; var buffer = gl.createBuffer(); setBufferFromTypedArray(gl, type, buffer, typedArray, drawType); return buffer; } function isIndices(name) { return name === "indices"; } // This is really just a guess. Though I can't really imagine using // anything else? Maybe for some compression? function getNormalizationForTypedArray(typedArray) { if (typedArray instanceof Int8Array) { return true; } // eslint-disable-line if (typedArray instanceof Uint8Array) { return true; } // eslint-disable-line return false; } function getArray(array) { return array.length ? array : array.data; } var texcoordRE = /coord|texture/i; var colorRE = /color|colour/i; function guessNumComponentsFromName(name, length) { var numComponents; if (texcoordRE.test(name)) { numComponents = 2; } else if (colorRE.test(name)) { numComponents = 4; } else { numComponents = 3; // position, normals, indices ... } if (length % numComponents > 0) { throw "Can not guess numComponents for attribute '" + name + "'. Tried " + numComponents + " but " + length + " values is not evenly divisible by " + numComponents + ". You should specify it."; } return numComponents; } function getNumComponents(array, arrayName) { return array.numComponents || array.size || guessNumComponentsFromName(arrayName, getArray(array).length); } function makeTypedArray(array, name) { if (typedArrays.isArrayBuffer(array)) { return array; } if (typedArrays.isArrayBuffer(array.data)) { return array.data; } if (Array.isArray(array)) { array = { data: array }; } var Type = array.type; if (!Type) { if (isIndices(name)) { Type = Uint16Array; } else { Type = Float32Array; } } return new Type(array.data); } /** * The info for an attribute. This is effectively just the arguments to `gl.vertexAttribPointer` plus the WebGLBuffer * for the attribute. * * @typedef {Object} AttribInfo * @property {number} [numComponents] the number of components for this attribute. * @property {number} [size] synonym for `numComponents`. * @property {number} [type] the type of the attribute (eg. `gl.FLOAT`, `gl.UNSIGNED_BYTE`, etc...) Default = `gl.FLOAT` * @property {boolean} [normalized] whether or not to normalize the data. Default = false * @property {number} [offset] offset into buffer in bytes. Default = 0 * @property {number} [stride] the stride in bytes per element. Default = 0 * @property {WebGLBuffer} buffer the buffer that contains the data for this attribute * @property {number} [drawType] the draw type passed to gl.bufferData. Default = gl.STATIC_DRAW * @memberOf module:twgl */ /** * Use this type of array spec when TWGL can't guess the type or number of compoments of an array * @typedef {Object} FullArraySpec * @property {(number[]|ArrayBuffer)} data The data of the array. * @property {number} [numComponents] number of components for `vertexAttribPointer`. Default is based on the name of the array. * If `coord` is in the name assumes `numComponents = 2`. * If `color` is in the name assumes `numComponents = 4`. * otherwise assumes `numComponents = 3` * @property {constructor} type The type. This is only used if `data` is a JavaScript array. It is the constructor for the typedarray. (eg. `Uint8Array`). * For example if you want colors in a `Uint8Array` you might have a `FullArraySpec` like `{ type: Uint8Array, data: [255,0,255,255, ...], }`. * @property {number} [size] synonym for `numComponents`. * @property {boolean} [normalize] normalize for `vertexAttribPointer`. Default is true if type is `Int8Array` or `Uint8Array` otherwise false. * @property {number} [stride] stride for `vertexAttribPointer`. Default = 0 * @property {number} [offset] offset for `vertexAttribPointer`. Default = 0 * @property {string} [attrib] name of attribute this array maps to. Defaults to same name as array prefixed by the default attribPrefix. * @property {string} [name] synonym for `attrib`. * @property {string} [attribName] synonym for `attrib`. * @memberOf module:twgl */ /** * An individual array in {@link module:twgl.Arrays} * * When passed to {@link module:twgl.createBufferInfoFromArrays} if an ArraySpec is `number[]` or `ArrayBuffer` * the types will be guessed based on the name. `indices` will be `Uint16Array`, everything else will * be `Float32Array` * * @typedef {(number[]|ArrayBuffer|module:twgl.FullArraySpec)} ArraySpec * @memberOf module:twgl */ /** * This is a JavaScript object of arrays by name. The names should match your shader's attributes. If your * attributes have a common prefix you can specify it by calling {@link module:twgl.setAttributePrefix}. * * Bare JavaScript Arrays * * var arrays = { * position: [-1, 1, 0], * normal: [0, 1, 0], * ... * } * * Bare TypedArrays * * var arrays = { * position: new Float32Array([-1, 1, 0]), * color: new Uint8Array([255, 128, 64, 255]), * ... * } * * * Will guess at `numComponents` if not specified based on name. * * If `coord` is in the name assumes `numComponents = 2` * * If `color` is in the name assumes `numComponents = 4` * * otherwise assumes `numComponents = 3` * * Objects with various fields. See {@link module:twgl.FullArraySpec}. * * var arrays = { * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, * }; * * @typedef {Object.<string, module:twgl.ArraySpec>} Arrays * @memberOf module:twgl */ /** * Creates a set of attribute data and WebGLBuffers from set of arrays * * Given * * var arrays = { * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, * color: { numComponents: 4, data: [255, 255, 255, 255, 255, 0, 0, 255, 0, 0, 255, 255], type: Uint8Array, }, * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, * }; * * returns something like * * var attribs = { * position: { numComponents: 3, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, * texcoord: { numComponents: 2, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, * normal: { numComponents: 3, type: gl.FLOAT, normalize: false, buffer: WebGLBuffer, }, * color: { numComponents: 4, type: gl.UNSIGNED_BYTE, normalize: true, buffer: WebGLBuffer, }, * }; * * notes: * * * Arrays can take various forms * * Bare JavaScript Arrays * * var arrays = { * position: [-1, 1, 0], * normal: [0, 1, 0], * ... * } * * Bare TypedArrays * * var arrays = { * position: new Float32Array([-1, 1, 0]), * color: new Uint8Array([255, 128, 64, 255]), * ... * } * * * Will guess at `numComponents` if not specified based on name. * * If `coord` is in the name assumes `numComponents = 2` * * If `color` is in the name assumes `numComponents = 4` * * otherwise assumes `numComponents = 3` * * @param {WebGLRenderingContext} gl The webgl rendering context. * @param {module:twgl.Arrays} arrays The arrays * @return {Object.<string, module:twgl.AttribInfo>} the attribs * @memberOf module:twgl/attributes */ function createAttribsFromArrays(gl, arrays) { var attribs = {}; Object.keys(arrays).forEach(function (arrayName) { if (!isIndices(arrayName)) { var array = arrays[arrayName]; var attribName = array.attrib || array.name || array.attribName || defaults.attribPrefix + arrayName; var typedArray = makeTypedArray(array, arrayName); attribs[attribName] = { buffer: createBufferFromTypedArray(gl, typedArray, undefined, array.drawType), numComponents: getNumComponents(array, arrayName), type: typedArrays.getGLTypeForTypedArray(typedArray), normalize: array.normalize !== undefined ? array.normalize : getNormalizationForTypedArray(typedArray), stride: array.stride || 0, offset: array.offset || 0, drawType: array.drawType }; } }); return attribs; } /** * Sets the contents of a buffer attached to an attribInfo * * This is helper function to dynamically update a buffer. * * Let's say you make a bufferInfo * * var arrays = { * position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]), * texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]), * normal: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), * indices: new Uint16Array([0, 1, 2, 1, 2, 3]), * }; * var bufferInfo = twgl.createBufferInfoFromArrays(gl, arrays); * * And you want to dynamically upate the positions. You could do this * * // assuming arrays.position has already been updated with new data. * twgl.setAttribInfoBufferFromArray(gl, bufferInfo.attribs.position, arrays.position); * * @param {WebGLRenderingContext} gl * @param {AttribInfo} attribInfo The attribInfo who's buffer contents to set. NOTE: If you have an attribute prefix * the name of the attribute will include the prefix. * @param {ArraySpec} array Note: it is arguably ineffient to pass in anything but a typed array because anything * else will have to be converted to a typed array before it can be used by WebGL. During init time that * inefficiency is usually not important but if you're updating data dynamically best to be efficient. * @param {number} [offset] an optional offset into the buffer. This is only an offset into the WebGL buffer * not the array. To pass in an offset into the array itself use a typed array and create an `ArrayBufferView` * for the portion of the array you want to use. * * var someArray = new Float32Array(1000); // an array with 1000 floats * var someSubArray = new Float32Array(someArray.buffer, offsetInBytes, sizeInUnits); // a view into someArray * * Now you can pass `someSubArray` into setAttribInfoBufferFromArray` * @memberOf module:twgl/attributes */ function setAttribInfoBufferFromArray(gl, attribInfo, array, offset) { array = makeTypedArray(array); if (offset !== undefined) { gl.bindBuffer(gl.ARRAY_BUFFER, attribInfo.buffer); gl.bufferSubData(gl.ARRAY_BUFFER, offset, array); } else { setBufferFromTypedArray(gl, gl.ARRAY_BUFFER, attribInfo.buffer, array, attribInfo.drawType); } } /** * tries to get the number of elements from a set of arrays. */ var getNumElementsFromNonIndexedArrays = function () { var positionKeys = ['position', 'positions', 'a_position']; return function getNumElementsFromNonIndexedArrays(arrays) { var key; for (var ii = 0; ii < positionKeys.length; ++ii) { key = positionKeys[ii]; if (key in arrays) { break; } } if (ii === positionKeys.length) { key = Object.keys(arrays)[0]; } var array = arrays[key]; var length = getArray(array).length; var numComponents = getNumComponents(array, key); var numElements = length / numComponents; if (length % numComponents > 0) { throw "numComponents " + numComponents + " not correct for length " + length; } return numElements; }; }(); /** * @typedef {Object} BufferInfo * @property {number} numElements The number of elements to pass to `gl.drawArrays` or `gl.drawElements`. * @property {number} [elementType] The type of indices `UNSIGNED_BYTE`, `UNSIGNED_SHORT` etc.. * @property {WebGLBuffer} [indices] The indices `ELEMENT_ARRAY_BUFFER` if any indices exist. * @property {Object.<string, module:twgl.AttribInfo>} [attribs] The attribs approriate to call `setAttributes` * @memberOf module:twgl */ /** * Creates a BufferInfo from an object of arrays. * * This can be passed to {@link module:twgl.setBuffersAndAttributes} and to * {@link module:twgl:drawBufferInfo}. * * Given an object like * * var arrays = { * position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], }, * texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1], }, * normal: { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], }, * indices: { numComponents: 3, data: [0, 1, 2, 1, 2, 3], }, * }; * * Creates an BufferInfo like this * * bufferInfo = { * numElements: 4, // or whatever the number of elements is * indices: WebGLBuffer, // this property will not exist if there are no indices * attribs: { * a_position: { buffer: WebGLBuffer, numComponents: 3, }, * a_normal: { buffer: WebGLBuffer, numComponents: 3, }, * a_texcoord: { buffer: WebGLBuffer, numComponents: 2, }, * }, * }; * * The properties of arrays can be JavaScript arrays in which case the number of components * will be guessed. * * var arrays = { * position: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], * texcoord: [0, 0, 0, 1, 1, 0, 1, 1], * normal: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], * indices: [0, 1, 2, 1, 2, 3], * }; * * They can also by TypedArrays * * var arrays = { * position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]), * texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]), * normal: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), * indices: new Uint16Array([0, 1, 2, 1, 2, 3]), * }; * * Or augmentedTypedArrays * * var positions = createAugmentedTypedArray(3, 4); * var texcoords = createAugmentedTypedArray(2, 4); * var normals = createAugmentedTypedArray(3, 4); * var indices = createAugmentedTypedArray(3, 2, Uint16Array); * * positions.push([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]); * texcoords.push([0, 0, 0, 1, 1, 0, 1, 1]); * normals.push([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]); * indices.push([0, 1, 2, 1, 2, 3]); * * var arrays = { * position: positions, * texcoord: texcoords, * normal: normals, * indices: indices, * }; * * For the last example it is equivalent to * * var bufferInfo = { * attribs: { * a_position: { numComponents: 3, buffer: gl.createBuffer(), }, * a_texcoods: { numComponents: 2, buffer: gl.createBuffer(), }, * a_normals: { numComponents: 3, buffer: gl.createBuffer(), }, * }, * indices: gl.createBuffer(), * numElements: 6, * }; * * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.a_position.buffer); * gl.bufferData(gl.ARRAY_BUFFER, arrays.position, gl.STATIC_DRAW); * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.a_texcoord.buffer); * gl.bufferData(gl.ARRAY_BUFFER, arrays.texcoord, gl.STATIC_DRAW); * gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.a_normal.buffer); * gl.bufferData(gl.ARRAY_BUFFER, arrays.normal, gl.STATIC_DRAW); * gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferInfo.indices); * gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, arrays.indices, gl.STATIC_DRAW); * * @param {WebGLRenderingContext} gl A WebGLRenderingContext * @param {module:twgl.Arrays} arrays Your data * @return {module:twgl.BufferInfo} A BufferInfo * @memberOf module:twgl/attributes */ function createBufferInfoFromArrays(gl, arrays) { var bufferInfo = { attribs: createAttribsFromArrays(gl, arrays) }; var indices = arrays.indices; if (indices) { indices = makeTypedArray(indices, "indices"); bufferInfo.indices = createBufferFromTypedArray(gl, indices, gl.ELEMENT_ARRAY_BUFFER); bufferInfo.numElements = indices.length; bufferInfo.elementType = typedArrays.getGLTypeForTypedArray(indices); } else { bufferInfo.numElements = getNumElementsFromNonIndexedArrays(arrays); } return bufferInfo; } /** * Creates a buffer from an array, typed array, or array spec * * Given something like this * * [1, 2, 3], * * or * * new Uint16Array([1,2,3]); * * or * * { * data: [1, 2, 3], * type: Uint8Array, * } * * returns a WebGLBuffer that constains the given data. * * @param {WebGLRenderingContext} gl A WebGLRenderingContext. * @param {module:twgl.ArraySpec} array an array, typed array, or array spec. * @param {string} arrayName name of array. Used to guess the type if type can not be dervied other wise. * @return {WebGLBuffer} a WebGLBuffer containing the data in array. * @memberOf module:twgl/attributes */ function createBufferFromArray(gl, array, arrayName) { var type = arrayName === "indices" ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER; var typedArray = makeTypedArray(array, arrayName); return createBufferFromTypedArray(gl, typedArray, type); } /** * Creates buffers from arrays or typed arrays * * Given something like this * * var arrays = { * positions: [1, 2, 3], * normals: [0, 0, 1], * } * * returns something like * * buffers = { * positions: WebGLBuffer, * normals: WebGLBuffer, * } * * If the buffer is named 'indices' it will be made an ELEMENT_ARRAY_BUFFER. * * @param {WebGLRenderingContext} gl A WebGLRenderingContext. * @param {module:twgl.Arrays} arrays * @return {Object<string, WebGLBuffer>} returns an object with one WebGLBuffer per array * @memberOf module:twgl/attributes */ function createBuffersFromArrays(gl, arrays) { var buffers = {}; Object.keys(arrays).forEach(function (key) { buffers[key] = createBufferFromArray(gl, arrays[key], key); }); // Ugh! if (arrays.indices) { buffers.numElements = arrays.indices.length; buffers.elementType = typedArrays.getGLTypeForTypedArray(makeTypedArray(arrays.indices), 'indices'); } else { buffers.numElements = getNumElementsFromNonIndexedArrays(arrays); } return buffers; } // Using quotes prevents Uglify from changing the names. // No speed diff AFAICT. return { "createAttribsFromArrays": createAttribsFromArrays, "createBuffersFromArrays": createBuffersFromArrays, "createBufferFromArray": createBufferFromArray, "createBufferFromTypedArray": createBufferFromTypedArray, "createBufferInfoFromArrays": createBufferInfoFromArrays, "setAttribInfoBufferFromArray": setAttribInfoBufferFromArray, "setAttributePrefix": setAttributePrefix, "setDefaults_": setDefaults, "getNumComponents_": getNumComponents, "getArray_": getArray }; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict"; /* * Copyright 2015, Gregg Tavares. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Gregg Tavares. nor the names of his * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { "use strict"; /** * Low level shader typed array related functions * * You should generally not need to use these functions. They are provided * for those cases where you're doing something out of the ordinary * and you need lower level access. * * For backward compatibily they are available at both `twgl.typedArray` and `twgl` * itself * * See {@link module:twgl} for core functions * * @module twgl/typedArray */ // make sure we don't see a global gl var gl = undefined; // eslint-disable-line /* DataType */ var BYTE = 0x1400; var UNSIGNED_BYTE = 0x1401; var SHORT = 0x1402; var UNSIGNED_SHORT = 0x1403; var INT = 0x1404; var UNSIGNED_INT = 0x1405; var FLOAT = 0x1406; var UNSIGNED_SHORT_4_4_4_4 = 0x8033; var UNSIGNED_SHORT_5_5_5_1 = 0x8034; var UNSIGNED_SHORT_5_6_5 = 0x8363; var HALF_FLOAT = 0x140B; var UNSIGNED_INT_2_10_10_10_REV = 0x8368; var UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; var UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; var FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; var UNSIGNED_INT_24_8 = 0x84FA; var glTypeToTypedArray = {}; { var tt = glTypeToTypedArray; tt[BYTE] = Int8Array; tt[UNSIGNED_BYTE] = Uint8Array; tt[SHORT] = Int16Array; tt[UNSIGNED_SHORT] = Uint16Array; tt[INT] = Int32Array; tt[UNSIGNED_INT] = Uint32Array; tt[FLOAT] = Float32Array; tt[UNSIGNED_SHORT_4_4_4_4] = Uint16Array; tt[UNSIGNED_SHORT_5_5_5_1] = Uint16Array; tt[UNSIGNED_SHORT_5_6_5] = Uint16Array; tt[HALF_FLOAT] = Uint16Array; tt[UNSIGNED_INT_2_10_10_10_REV] = Uint32Array; tt[UNSIGNED_INT_10F_11F_11F_REV] = Uint32Array; tt[UNSIGNED_INT_5_9_9_9_REV] = Uint32Array; tt[FLOAT_32_UNSIGNED_INT_24_8_REV] = Uint32Array; tt[UNSIGNED_INT_24_8] = Uint32Array; } /** * Get the GL type for a typedArray * @param {ArrayBuffer|ArrayBufferView} typedArray a typedArray * @return {number} the GL type for array. For example pass in an `Int8Array` and `gl.BYTE` will * be returned. Pass in a `Uint32Array` and `gl.UNSIGNED_INT` will be returned * @memberOf module:twgl/typedArray */ function getGLTypeForTypedArray(typedArray) { if (typedArray instanceof Int8Array) { return BYTE; } // eslint-disable-line if (typedArray instanceof Uint8Array) { return UNSIGNED_BYTE; } // eslint-disable-line if (typedArray instanceof Uint8ClampedArray) { return UNSIGNED_BYTE; } // eslint-disable-line if (typedArray instanceof Int16Array) { return SHORT; } // eslint-disable-line if (typedArray instanceof Uint16Array) { return UNSIGNED_SHORT; } // eslint-disable-line if (typedArray instanceof Int32Array) { return INT; } // eslint-disable-line if (typedArray instanceof Uint32Array) { return UNSIGNED_INT; } // eslint-disable-line if (typedArray instanceof Float32Array) { return FLOAT; } // eslint-disable-line throw "unsupported typed array type"; } /** * Get the typed array constructor for a given GL type * @param {number} type the GL type. (eg: `gl.UNSIGNED_INT`) * @return {function} the constructor for a the corresponding typed array. (eg. `Uint32Array`). * @memberOf module:twgl/typedArray */ function getTypedArrayTypeForGLType(type) { var CTOR = glTypeToTypedArray[type]; if (!CTOR) { throw "unknown gl type"; } return CTOR; } function isArrayBuffer(a) { return a && a.buffer && a.buffer instanceof ArrayBuffer; } // Using quotes prevents Uglify from changing the names. return { "getGLTypeForTypedArray": getGLTypeForTypedArray, "getTypedArrayTypeForGLType": getTypedArrayTypeForGLType, "isArrayBuffer": isArrayBuffer }; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict"; /* * Copyright 2015, Gregg Tavares. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Gregg Tavares. nor the names of his * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { "use strict"; /** * Copy an object 1 level deep * @param {object} src object to copy * @return {object} the copy */ function shallowCopy(src) {