From 7baf0f82989bf3425f5677a7c76f913e23195125 Mon Sep 17 00:00:00 2001 From: Alexander Buzin Date: Wed, 15 Aug 2018 16:09:11 +0300 Subject: [PATCH] WIP. Scene (Higher) API --- .babelrc.js | 9 + build/nextgl.js | 995 +++++++-- examples/build/scene.bundle.js | 2 +- examples/src/scene.js | 42 +- gulpfile.babel.js | 33 + package-lock.json | 1958 ++++++++++++++++- package.json | 15 +- src/core/Mesh.js | 6 +- src/core/Object3D.js | 34 +- src/core/Program.js | 14 +- src/core/Renderer.js | 20 +- src/index.js | 4 + src/materials/FlatMaterial.js | 7 + src/materials/LambertMaterial.js | 7 + src/materials/index.js | 2 + src/primitives/Plane.js | 25 + src/primitives/index.js | 1 + src/shaders/Material.js | 26 + src/shaders/Shader.js | 56 +- src/shaders/chunks.js | 14 + src/shaders/initializeShaderCollection.js | 8 + src/shaders/lib/chunks/color.frag | 0 src/shaders/lib/chunks/init.frag | 5 + src/shaders/lib/chunks/init_pars.frag | 3 + src/shaders/lib/chunks/init_pars.vert | 5 + src/shaders/lib/chunks/lambert_light.frag | 4 + .../lib/chunks/lambert_light_pars.frag | 1 + src/shaders/lib/chunks/normal.frag | 1 + src/shaders/lib/chunks/normal.vert | 1 + src/shaders/lib/chunks/normal_pars.frag | 1 + src/shaders/lib/chunks/normal_pars.vert | 2 + src/shaders/lib/flat.frag | 10 + src/shaders/lib/flat.vert | 5 + src/shaders/lib/lambert.frag | 14 + src/shaders/lib/lambert.vert | 8 + src/shaders/shaders.js | 27 +- 36 files changed, 3072 insertions(+), 293 deletions(-) create mode 100644 .babelrc.js create mode 100644 gulpfile.babel.js create mode 100644 src/materials/FlatMaterial.js create mode 100644 src/materials/LambertMaterial.js create mode 100644 src/materials/index.js create mode 100644 src/primitives/Plane.js create mode 100644 src/shaders/Material.js create mode 100644 src/shaders/chunks.js create mode 100644 src/shaders/initializeShaderCollection.js create mode 100644 src/shaders/lib/chunks/color.frag create mode 100644 src/shaders/lib/chunks/init.frag create mode 100644 src/shaders/lib/chunks/init_pars.frag create mode 100644 src/shaders/lib/chunks/init_pars.vert create mode 100644 src/shaders/lib/chunks/lambert_light.frag create mode 100644 src/shaders/lib/chunks/lambert_light_pars.frag create mode 100644 src/shaders/lib/chunks/normal.frag create mode 100644 src/shaders/lib/chunks/normal.vert create mode 100644 src/shaders/lib/chunks/normal_pars.frag create mode 100644 src/shaders/lib/chunks/normal_pars.vert create mode 100644 src/shaders/lib/flat.frag create mode 100644 src/shaders/lib/flat.vert create mode 100644 src/shaders/lib/lambert.frag create mode 100644 src/shaders/lib/lambert.vert diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 0000000..0ca68ce --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,9 @@ +module.exports = { + presets: [ + ['@babel/preset-env', { + targets: { + node: 'current' + } + }] + ] +} diff --git a/build/nextgl.js b/build/nextgl.js index 2877f91..a7f7856 100644 --- a/build/nextgl.js +++ b/build/nextgl.js @@ -4,6 +4,109 @@ (factory((global.NEXT = {}))); }(this, (function (exports) { 'use strict'; + var init_pars = "precision mediump float;\n#define GLSLIFY 1\nin vec4 position;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\n"; // eslint-disable-line + + var init_pars$1 = /*#__PURE__*/Object.freeze({ + default: init_pars + }); + + var normal_pars = "#define GLSLIFY 1\nin vec3 normal;\nout vec3 v_normal;\n"; // eslint-disable-line + + var normal_pars$1 = /*#__PURE__*/Object.freeze({ + default: normal_pars + }); + + var normal = "#define GLSLIFY 1\nv_normal = normal;\n"; // eslint-disable-line + + var normal$1 = /*#__PURE__*/Object.freeze({ + default: normal + }); + + var color = "#define GLSLIFY 1\n"; // eslint-disable-line + + var color$1 = /*#__PURE__*/Object.freeze({ + default: color + }); + + var init_pars$2 = "#define GLSLIFY 1\n#ifdef USE_COLOR\n uniform vec3 u_diffuse;\n#endif\n"; // eslint-disable-line + + var init_pars$3 = /*#__PURE__*/Object.freeze({ + default: init_pars$2 + }); + + var init = "#define GLSLIFY 1\nvec3 color;\n\n#ifdef USE_COLOR\n color = u_diffuse;\n#endif\n"; // eslint-disable-line + + var init$1 = /*#__PURE__*/Object.freeze({ + default: init + }); + + var lambert_light_pars = "#define GLSLIFY 1\nuniform vec3 u_lightDir;\n"; // eslint-disable-line + + var lambert_light_pars$1 = /*#__PURE__*/Object.freeze({ + default: lambert_light_pars + }); + + var lambert_light = "#define GLSLIFY 1\n// requires [f normal]\nfloat lightness = dot(u_lightDir, normal);\n\ncolor = color * lightness;\n"; // eslint-disable-line + + var lambert_light$1 = /*#__PURE__*/Object.freeze({ + default: lambert_light + }); + + var lights = "#define GLSLIFY 1\nfloat lightness = dot(dirLight.xyz, normal);\n\noutColor = vec4(color * lightness, 1);\n"; // eslint-disable-line + + var lights$1 = /*#__PURE__*/Object.freeze({ + default: lights + }); + + var normal_pars$2 = "#define GLSLIFY 1\nin vec3 v_normal;\n"; // eslint-disable-line + + var normal_pars$3 = /*#__PURE__*/Object.freeze({ + default: normal_pars$2 + }); + + var normal$2 = "#define GLSLIFY 1\nvec3 normal = normalize(v_normal);\n"; // eslint-disable-line + + var normal$3 = /*#__PURE__*/Object.freeze({ + default: normal$2 + }); + + var require$$0 = ( init_pars$1 && init_pars ) || init_pars$1; + + var require$$1 = ( normal_pars$1 && normal_pars ) || normal_pars$1; + + var require$$2 = ( normal$1 && normal ) || normal$1; + + var require$$3 = ( color$1 && color ) || color$1; + + var require$$4 = ( init_pars$3 && init_pars$2 ) || init_pars$3; + + var require$$5 = ( init$1 && init ) || init$1; + + var require$$6 = ( lambert_light_pars$1 && lambert_light_pars ) || lambert_light_pars$1; + + var require$$7 = ( lambert_light$1 && lambert_light ) || lambert_light$1; + + var require$$8 = ( lights$1 && lights ) || lights$1; + + var require$$9 = ( normal_pars$3 && normal_pars$2 ) || normal_pars$3; + + var require$$10 = ( normal$3 && normal$2 ) || normal$3; + + // This file is autogenerated. + var chunks = { + v_init_pars: require$$0, + v_normal_pars: require$$1, + v_normal: require$$2, + f_color: require$$3, + f_init_pars: require$$4, + f_init: require$$5, + f_lambert_light_pars: require$$6, + f_lambert_light: require$$7, + f_lights: require$$8, + f_normal_pars: require$$9, + f_normal: require$$10 + }; + var vertDefault = "#version 300 es\n\nprecision mediump float;\n#define GLSLIFY 1\nin vec4 position;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\n\nvoid main() {\n gl_Position = projectionMatrix * modelMatrix * position; // projectionMatrix *\n // gl_Position = vec4(position, 1.0);\n}\n"; // eslint-disable-line var _default = /*#__PURE__*/Object.freeze({ @@ -28,34 +131,77 @@ default: test$2 }); - var lights = "#define GLSLIFY 1\nfloat lightness = dot(dirLight.xyz, normal);\n\noutColor = vec4(color * lightness, 1);\n"; // eslint-disable-line + var flat = "#define GLSLIFY 1\n[v init_pars]\n\nvoid main() {\n gl_Position = projectionMatrix * modelMatrix * position;\n}\n"; // eslint-disable-line - var lights$1 = /*#__PURE__*/Object.freeze({ - default: lights + var flat$1 = /*#__PURE__*/Object.freeze({ + default: flat + }); + + var flat$2 = "precision mediump float;\n#define GLSLIFY 1\nout vec4 outColor;\n\n[f init_pars]\n\nvoid main() {\n [f init]\n\n outColor = vec4(color, 1.0);\n}\n"; // eslint-disable-line + + var flat$3 = /*#__PURE__*/Object.freeze({ + default: flat$2 }); - var require$$0 = ( _default && vertDefault ) || _default; + var lambert = "#define GLSLIFY 1\n[v init_pars]\n[v normal_pars]\n\nvoid main() {\n [v normal]\n \n gl_Position = projectionMatrix * modelMatrix * position;\n}\n"; // eslint-disable-line + + var lambert$1 = /*#__PURE__*/Object.freeze({ + default: lambert + }); + + var lambert$2 = "precision mediump float;\n#define GLSLIFY 1\nout vec4 outColor;\n\n[f init_pars]\n[f normal_pars]\n[f lambert_light_pars]\n\nvoid main() {\n [f init]\n [f normal]\n [f lambert_light]\n\n outColor = vec4(color, 1.0);\n}\n"; // eslint-disable-line + + var lambert$3 = /*#__PURE__*/Object.freeze({ + default: lambert$2 + }); + + var require$$0$1 = ( _default && vertDefault ) || _default; + + var require$$1$1 = ( _default$1 && fragDefault ) || _default$1; - var require$$1 = ( _default$1 && fragDefault ) || _default$1; + var require$$2$1 = ( test$1 && test ) || test$1; - var require$$2 = ( test$1 && test ) || test$1; + var require$$3$1 = ( test$3 && test$2 ) || test$3; - var require$$3 = ( test$3 && test$2 ) || test$3; + var require$$4$1 = ( flat$1 && flat ) || flat$1; - var require$$4 = ( lights$1 && lights ) || lights$1; + var require$$5$1 = ( flat$3 && flat$2 ) || flat$3; + + var require$$6$1 = ( lambert$1 && lambert ) || lambert$1; + + var require$$7$1 = ( lambert$3 && lambert$2 ) || lambert$3; var shaders = { default: { - vert: require$$0, - frag: require$$1 + vert: require$$0$1, + frag: require$$1$1 }, test: { - vert: require$$2, - frag: require$$3 + vert: require$$2$1, + frag: require$$3$1 }, - chunks: { - f_lights: require$$4 - } + flat: { + vert: require$$4$1, + frag: require$$5$1, + uniforms: { + u_diffuse: [1, 0, 0] + }, + defines: { + USE_COLOR: true + } + }, + lambert: { + vert: require$$6$1, + frag: require$$7$1, + uniforms: { + u_diffuse: [1, 0, 0], + u_lightDir: [0, 0, 1] + }, + defines: { + USE_COLOR: true + } + }, + chunks: chunks }; var _isObject = function (it) { @@ -279,6 +425,95 @@ } }; + var toString = {}.toString; + + var _cof = function (it) { + return toString.call(it).slice(8, -1); + }; + + // 7.2.8 IsRegExp(argument) + + + + + var MATCH = _wks('match'); + + var _isRegexp = function (it) { + var isRegExp; + return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp'); + }; + + // @@split logic + _fixReWks('split', 2, function (defined, SPLIT, $split) { + + var isRegExp = _isRegexp; + + var _split = $split; + var $push = [].push; + var $SPLIT = 'split'; + var LENGTH = 'length'; + var LAST_INDEX = 'lastIndex'; + + if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) { + var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group + // based on es5-shim implementation, need to rework it + + $split = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split + + if (!isRegExp(separator)) return _split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? 4294967295 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy + + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var separator2, match, lastIndex, lastLength, i; // Doesn't need flags gy, but they don't hurt + + if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); + + while (match = separatorCopy.exec(string)) { + // `separatorCopy.lastIndex` is not reliable cross-browser + lastIndex = match.index + match[0][LENGTH]; + + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG + // eslint-disable-next-line no-loop-func + + if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () { + for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined; + }); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + + if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop + } + + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; // Chakra, V8 + + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + $split = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit); + }; + } // 21.1.3.17 String.prototype.split(separator, limit) + + + return [function split(separator, limit) { + var O = defined(this); + var fn = separator == undefined ? undefined : separator[SPLIT]; + return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit); + }, $split]; + }); + // @@replace logic _fixReWks('replace', 2, function (defined, REPLACE, $replace) { // 21.1.3.14 String.prototype.replace(searchValue, replaceValue) @@ -432,28 +667,6 @@ throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - var Shader = - /*#__PURE__*/ - function () { - function Shader(raw) { - _classCallCheck(this, Shader); - - this.raw = raw; - } - - _createClass(Shader, [{ - key: "assemble", - value: function assemble() { - return this.raw.replace(/\[([fv])\s([aA-zZ]*)\]/g, function (match, shaderType, chunkName) { - console.log(shaderType); - return shaders.chunks[shaderType + '_' + chunkName]; - }); - } - }]); - - return Shader; - }(); - var _aFunction = function (it) { if (typeof it != 'function') throw TypeError(it + ' is not a function!'); return it; @@ -539,12 +752,6 @@ var _export = $export; - var toString = {}.toString; - - var _cof = function (it) { - return toString.call(it).slice(8, -1); - }; - // fallback for non-array-like ES3 and non-enumerable old V8 strings // eslint-disable-next-line no-prototype-builtins @@ -690,6 +897,60 @@ } }); + var f$2 = Object.getOwnPropertySymbols; + + var _objectGops = { + f: f$2 + }; + + // 7.1.13 ToObject(argument) + + + var _toObject = function (it) { + return Object(_defined(it)); + }; + + var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) + + var _objectAssign = !$assign || _fails(function () { + var A = {}; + var B = {}; // eslint-disable-next-line no-undef + + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { + B[k] = k; + }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; + }) ? function assign(target, source) { + // eslint-disable-line no-unused-vars + var T = _toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = _objectGops.f; + var isEnum = _objectPie.f; + + while (aLen > index) { + var S = _iobject(arguments[index++]); + var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S); + var length = keys.length; + var j = 0; + var key; + + while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + } + + return T; + } : $assign; + + // 19.1.3.1 Object.assign(target, source) + + + _export(_export.S + _export.F, 'Object', { + assign: _objectAssign + }); + // 22.1.3.31 Array.prototype[@@unscopables] var UNSCOPABLES = _wks('unscopables'); @@ -807,13 +1068,6 @@ _setToStringTag(Constructor, NAME + ' Iterator'); }; - // 7.1.13 ToObject(argument) - - - var _toObject = function (it) { - return Object(_defined(it)); - }; - // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) @@ -886,7 +1140,7 @@ // Set @@toStringTag to native iterators _setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines - if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); + if (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); } } // fix Array#{values, @@iterator}.name in V8 / FF @@ -900,7 +1154,7 @@ } // Define iterator - if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + if (BUGGY || VALUES_BUG || !proto[ITERATOR]) { _hide(proto, ITERATOR, $default); } // Plug for library @@ -1186,46 +1440,6 @@ var _meta_4 = _meta.getWeak; var _meta_5 = _meta.onFreeze; - var f$2 = Object.getOwnPropertySymbols; - - var _objectGops = { - f: f$2 - }; - - var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug) - - var _objectAssign = !$assign || _fails(function () { - var A = {}; - var B = {}; // eslint-disable-next-line no-undef - - var S = Symbol(); - var K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function (k) { - B[k] = k; - }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; - }) ? function assign(target, source) { - // eslint-disable-line no-unused-vars - var T = _toObject(target); - var aLen = arguments.length; - var index = 1; - var getSymbols = _objectGops.f; - var isEnum = _objectPie.f; - - while (aLen > index) { - var S = _iobject(arguments[index++]); - var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S); - var length = keys.length; - var j = 0; - var key; - - while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; - } - - return T; - } : $assign; - var _redefineAll = function (target, src, safe) { for (var key in src) _redefine(target, key, src[key], safe); @@ -1682,6 +1896,310 @@ } }); + // import shaders from './shaders'; + var _cache = new WeakMap(); // TODO: Assemble shader correct way. + + + var Shader = + /*#__PURE__*/ + function () { + function Shader(raw) { + var modifiers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Shader); + + if (Shader.collection === null) throw new Error('Shader.collection should be specified.'); + this.raw = raw; + this.modifiers = modifiers; + this.defines = {}; + } + + _createClass(Shader, [{ + key: "define", + value: function define(defines) { + Object.assign(this.defines, defines); + return this; + } + }, { + key: "assemble", + value: function assemble() { + var _this = this; + + var useCached = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var HEAD = '#version 300 es\n\n'; + var defines = Object.entries(this.defines).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + name = _ref2[0], + value = _ref2[1]; + + return "#define ".concat(name, " ").concat(value); + }).join('\n'); + + if (!useCached || !cache.get(this)) { + var staticPart = this.raw.replace(/(\s*)\[([fv])\s([aA-zZ]*)\]/g, function (match, spaces, shaderType, chunkName) { + chunkName = shaderType + '_' + chunkName; + var chunk = Shader.collection.chunks[chunkName].split('\n').slice(1).join('\n'); + chunk = chunkName in _this.modifiers ? _this.modifiers[chunkName](chunk, function (start, end) { + return chunk.split('\n').slice(start, end).join('\n'); + }) : chunk; + return "\n".concat(spaces, "// [").concat(chunkName, "] \n") + chunk.split('\n').map(function (str) { + return spaces.slice(1) + str; + }).join('\n'); + }); + + _cache.set(this, staticPart); + + return HEAD + defines + '\n\n' + staticPart; + } + + return HEAD + defines + '\n\n' + cache.get(this); + } + }]); + + return Shader; + }(); + + _defineProperty(Shader, "collection", null); + + Shader.collection = shaders; // For browser + + var Material = + /*#__PURE__*/ + function () { + function Material() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Material); + + options = Object.assign({ + type: 'flat' + }, options); + var shader = Shader.collection[options.type]; + this.type = options.type; + this._vertexShader = new Shader(shader.vert).define(shader.defines); + this._fragmentShader = new Shader(shader.frag).define(shader.defines); // TODO: Make uniforms clone tool + + this.uniforms = Object.assign({}, shader.uniforms); + } + + _createClass(Material, [{ + key: "frag", + get: function get() { + return this._fragmentShader.assemble(); + } + }, { + key: "vert", + get: function get() { + return this._vertexShader.assemble(); + } + }]); + + return Material; + }(); + + var SPECIES$1 = _wks('species'); + + var _setSpecies = function (KEY) { + var C = _global[KEY]; + if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, { + configurable: true, + get: function () { + return this; + } + }); + }; + + var dP$1 = _objectDp.f; + + + + + + + + + + + + + + + + + + + + var fastKey = _meta.fastKey; + + + + var SIZE = _descriptors ? '_s' : 'size'; + + var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; // frozen object case + + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } + }; + + var _collectionStrong = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + _anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + + that._i = _objectCreate(null); // index + + that._f = undefined; // first entry + + that._l = undefined; // last entry + + that[SIZE] = 0; // size + + if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that); + }); + _redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = _validateCollection(this, NAME); + var entry = getEntry(that, key); + + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } + + return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn + /* , that = undefined */ + ) { + _validateCollection(this, NAME); + var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); // revert to the last existing entry + + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(_validateCollection(this, NAME), key); + } + }); + if (_descriptors) dP$1(C.prototype, 'size', { + get: function () { + return _validateCollection(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; // change existing entry + + if (entry) { + entry.v = value; // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), + // <- index + k: key, + // <- key + v: value, + // <- value + p: prev = that._l, + // <- previous entry + n: undefined, + // <- next entry + r: false // <- removed + + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; // add to index + + if (index !== 'F') that._i[index] = entry; + } + + return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + _iterDefine(C, NAME, function (iterated, kind) { + this._t = _validateCollection(iterated, NAME); // target + + this._k = kind; // kind + + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; // revert to the last existing entry + + while (entry && entry.r) entry = entry.p; // get next entry + + + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return _iterStep(1); + } // return step by kind + + + if (kind == 'keys') return _iterStep(0, entry.k); + if (kind == 'values') return _iterStep(0, entry.v); + return _iterStep(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2 + + _setSpecies(NAME); + } + }; + + var SET = 'Set'; // 23.2 Set Objects + + var es6_set = _collection(SET, function (get) { + return function Set() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; + }, { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return _collectionStrong.def(_validateCollection(this, SET), value = value === 0 ? 0 : value, value); + } + }, _collectionStrong); + var _locals = new WeakMap(); var Renderer = @@ -1698,6 +2216,7 @@ this.clearColor = options.clearColor || [0, 0, 0, 0]; this._programs = []; + this._root_objects = new Set(); gl.clearColor.apply(gl, this.clearColor); // eslint-disable-line gl.clear(gl.COLOR_BUFFER_BIT); @@ -1731,14 +2250,23 @@ value: function setScene(scene) { var _this = this; + this._root_objects.add(scene); + scene.traverse(function (child) { if (!child.isMesh) return; - child.updateMatrix(); _this.attach(child.program); child.program.__scene = scene; }); + scene.on('hierarchy-update', function (_ref) { + var object = _ref.object; + if (!object.isMesh) return; + + _this.attach(object.program); + + object.program.__scene = scene; + }); } }, { key: "render", @@ -1747,7 +2275,15 @@ var gl = this.context; var _locals$get = _locals.get(this), - DRAW_CONSTANTS = _locals$get.DRAW_CONSTANTS; // Clear the canvas + DRAW_CONSTANTS = _locals$get.DRAW_CONSTANTS; // TODO: add optimization feature to avoid iterating + + + this._root_objects.forEach(function (root) { + root.traverse(function (object) { + if (object.matrixAutoUpdate) object.updateMatrix(); + if (object.matrixWorldAutoUpdate) object.updateMatrixWorld(); + }); + }); // Clear the canvas gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); @@ -1758,6 +2294,8 @@ gl.useProgram(program._compiledProgram); + program._bind(gl); + for (var k = 0, kl = uniforms.length; k < kl; k++) { var _uniforms$k = _slicedToArray(uniforms[k], 2), uniformName = _uniforms$k[0], @@ -1781,13 +2319,6 @@ return Renderer; }(); - // 19.1.3.1 Object.assign(target, source) - - - _export(_export.S + _export.F, 'Object', { - assign: _objectAssign - }); - var Geometry = /*#__PURE__*/ function () { @@ -1855,7 +2386,7 @@ if (!vao._compiledVAO) vao._compile(gl); - _geometryRefs.get(_this)._bind(gl); // // index attribute + vao._bind(gl); // // index attribute if (_this.index) { @@ -1884,6 +2415,10 @@ gl.deleteProgram(program); }); + _defineProperty(this, "_bind", function (gl) { + _geometryRefs.get(_this)._bind(gl); + }); + var _Object$assign = Object.assign({ vert: vertDefault, frag: fragDefault, @@ -1956,7 +2491,10 @@ var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if (success) return shader; // TODO: Cleanup error logging + add troubleshooting - console.log(gl.getShaderInfoLog(shader)); + console.warn(gl.getShaderInfoLog(shader)); + console.warn(source.split('\n').map(function (line, i) { + return "".concat(i < 9 ? '0' : '').concat(i + 1, ": ").concat(line); + }).join('\n')); gl.deleteShader(shader); }); @@ -3335,32 +3873,107 @@ str: str_1 }; var glMat4_4 = glMat4.identity; - var glMat4_10 = glMat4.translate; + var glMat4_9 = glMat4.multiply; + var glMat4_17 = glMat4.fromRotationTranslation; var glMat4_18 = glMat4.fromScaling; var glMat4_25 = glMat4.perspective; + var minivents_commonjs = function Events(target) { + var events = {}, + empty = []; + target = target || this; + /** + * On: listen to events + */ + + target.on = function (type, func, ctx) { + (events[type] = events[type] || []).push([func, ctx]); + return target; + }; + /** + * Off: stop listening to event / specific callback + */ + + + target.off = function (type, func) { + type || (events = {}); + var list = events[type] || empty, + i = list.length = func ? list.length : 0; + + while (i--) func == list[i][0] && list.splice(i, 1); + + return target; + }; + /** + * Emit: send event, callbacks will be triggered + */ + + + target.emit = function (type) { + var e = events[type] || empty, + list = e.length > 0 ? e.slice(0, e.length) : e, + i = 0, + j; + + while (j = list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1)); + + return target; + }; + }; + var Object3D = /*#__PURE__*/ - function () { + function (_Events) { + _inherits(Object3D, _Events); + function Object3D() { + var _this; + _classCallCheck(this, Object3D); - this.matrix = glMat4_4([]); - this.position = [0, 0, 0]; - this.scale = [1, 1, 1]; - this.quaternion = [0, 0, 0, 1]; - this.children = []; + _this = _possibleConstructorReturn(this, _getPrototypeOf(Object3D).call(this)); // FIXME: replace identity() with create() + + _this.matrix = glMat4_4([]); + _this.matrixWorld = glMat4_4([]); + _this.position = [0, 0, 0]; + _this.scale = [1, 1, 1]; + _this.quaternion = [0, 0, 0, 1]; + _this.children = []; + _this.matrixAutoUpdate = true; + _this.matrixWorldAutoUpdate = true; + return _this; } _createClass(Object3D, [{ key: "updateMatrix", value: function updateMatrix() { - glMat4_10(this.matrix, glMat4_18(this.matrix, this.scale), this.position); + glMat4_17(glMat4_18(this.matrix, this.scale), this.quaternion, this.position); + } + }, { + key: "updateMatrixWorld", + value: function updateMatrixWorld() { + // Consider to be called after updateMatrix() + if (!this.parent) return; + glMat4_9(this.matrixWorld, this.matrix, this.parent.matrix); } }, { key: "add", value: function add(child) { + child.parent = this; this.children.push(child); + var eventObject = { + parent: this, + object: child + }; + child.emit('hierarchy-update', eventObject); + this.emit('hierarchy-update', eventObject); + var _parent = this.parent; + + while (_parent) { + _parent.emit('hierarchy-update', eventObject); + + _parent = _parent.parent; + } } }, { key: "traverse", @@ -3375,7 +3988,7 @@ }]); return Object3D; - }(); + }(minivents_commonjs); var Mesh = /*#__PURE__*/ @@ -3400,9 +4013,9 @@ vert: options.shader.vert, frag: options.shader.frag }, geometry); - _this.program.uniforms = { - $modelMatrix: _this.matrix - }; + _this.program.uniforms = Object.assign({}, options.shader.uniforms, { + $modelMatrix: _this.matrixWorld + }); return _this; } @@ -3839,7 +4452,7 @@ if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]); } - if (!_library) ArrayBufferProto.constructor = $ArrayBuffer; + ArrayBufferProto.constructor = $ArrayBuffer; } // iOS Safari 7.x bug @@ -3869,24 +4482,12 @@ - var SPECIES$1 = _wks('species'); + var SPECIES$2 = _wks('species'); var _speciesConstructor = function (O, D) { var C = _anObject(O).constructor; var S; - return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S); - }; - - var SPECIES$2 = _wks('species'); - - var _setSpecies = function (KEY) { - var C = _global[KEY]; - if (_descriptors && C && !C[SPECIES$2]) _objectDp.f(C, SPECIES$2, { - configurable: true, - get: function () { - return this; - } - }); + return C === undefined || (S = _anObject(C)[SPECIES$2]) == undefined ? D : _aFunction(S); }; var _arrayCopyWithin = [].copyWithin || function copyWithin(target @@ -3920,7 +4521,6 @@ var _typedArray = createCommonjsModule(function (module) { if (_descriptors) { - var LIBRARY = _library; var global = _global; @@ -4438,7 +5038,7 @@ if (!(key in TypedArray)) hide(TypedArray, key, Base[key]); }); TypedArray[PROTOTYPE] = TypedArrayPrototype; - if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray; + TypedArrayPrototype.constructor = TypedArray; } var $nativeIterator = TypedArrayPrototype[ITERATOR]; @@ -4475,7 +5075,7 @@ set: $set }); $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators); - if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; + if (TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; $export($export.P + $export.F * fails(function () { new TypedArray(1).slice(); }), NAME, { @@ -4489,7 +5089,7 @@ toLocaleString: $toLocaleString }); Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator; - if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); + if (!CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); }; } else module.exports = function () { /* empty */ @@ -4667,8 +5267,132 @@ return Sphere; }(Mesh); + // 3x3 plane: + // + // 0 1 2 3 + // 4 5 6 7 + // 8 9 10 11 + // 12 13 14 15 + function createPlane(sx, sy, nx, ny, options) { + sx = sx || 1; + sy = sy || 1; + nx = nx || 1; + ny = ny || 1; + var quads = options && options.quads ? options.quads : false; + var positions = []; + var uvs = []; + var normals = []; + var cells = []; + + for (var iy = 0; iy <= ny; iy++) { + for (var ix = 0; ix <= nx; ix++) { + var u = ix / nx; + var v = iy / ny; + var x = -sx / 2 + u * sx; // starts on the left + + var y = sy / 2 - v * sy; // starts at the top + + positions.push([x, y, 0]); + uvs.push([u, 1.0 - v]); + normals.push([0, 0, 1]); + + if (iy < ny && ix < nx) { + if (quads) { + cells.push([iy * (nx + 1) + ix, (iy + 1) * (nx + 1) + ix, (iy + 1) * (nx + 1) + ix + 1, iy * (nx + 1) + ix + 1]); + } else { + cells.push([iy * (nx + 1) + ix, (iy + 1) * (nx + 1) + ix + 1, iy * (nx + 1) + ix + 1]); + cells.push([(iy + 1) * (nx + 1) + ix + 1, iy * (nx + 1) + ix, (iy + 1) * (nx + 1) + ix]); + } + } + } + } + + return { + positions: positions, + normals: normals, + uvs: uvs, + cells: cells + }; + } + + var primitivePlane = createPlane; + + var Plane = + /*#__PURE__*/ + function (_Mesh) { + _inherits(Plane, _Mesh); + + _createClass(Plane, null, [{ + key: "Geometry", + value: function Geometry$$1(_ref) { + var _ref$width = _ref.width, + width = _ref$width === void 0 ? 1 : _ref$width, + _ref$height = _ref.height, + height = _ref$height === void 0 ? 1 : _ref$height, + _ref$widthSegments = _ref.widthSegments, + widthSegments = _ref$widthSegments === void 0 ? 1 : _ref$widthSegments, + _ref$heightSegments = _ref.heightSegments, + heightSegments = _ref$heightSegments === void 0 ? 1 : _ref$heightSegments; + var data = primitivePlane(width, height, widthSegments, heightSegments); + var geometry = new Geometry(); + geometry.setIndex(new Attribute(new Uint16Array(Attribute.inlineArray(data.cells)), 1)); + geometry.setAttribute('position', new Attribute(new Float32Array(Attribute.inlineArray(data.positions)), 3)); + geometry.setAttribute('normal', new Attribute(new Float32Array(Attribute.inlineArray(data.normals)), 3)); + geometry.setAttribute('uv', new Attribute(new Float32Array(Attribute.inlineArray(data.uvs)), 3)); + return geometry; + } + }]); + + function Plane() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Plane); + + return _possibleConstructorReturn(this, _getPrototypeOf(Plane).call(this, Plane.Geometry(options), { + shader: options.shader + })); + } + + return Plane; + }(Mesh); + + var FlatMaterial = + /*#__PURE__*/ + function (_Material) { + _inherits(FlatMaterial, _Material); + + function FlatMaterial() { + + _classCallCheck(this, FlatMaterial); + + return _possibleConstructorReturn(this, _getPrototypeOf(FlatMaterial).call(this, { + type: 'flat' + })); + } + + return FlatMaterial; + }(Material); + + var LambertMaterial = + /*#__PURE__*/ + function (_Material) { + _inherits(LambertMaterial, _Material); + + function LambertMaterial() { + + _classCallCheck(this, LambertMaterial); + + return _possibleConstructorReturn(this, _getPrototypeOf(LambertMaterial).call(this, { + type: 'lambert' + })); + } + + return LambertMaterial; + }(Material); + exports.shaders = shaders; exports.Shader = Shader; + exports.Material = Material; exports.Renderer = Renderer; exports.Program = Program; exports.Attribute = Attribute; @@ -4677,6 +5401,9 @@ exports.Scene = Scene; exports.Camera = Camera; exports.Sphere = Sphere; + exports.Plane = Plane; + exports.FlatMaterial = FlatMaterial; + exports.LambertMaterial = LambertMaterial; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/examples/build/scene.bundle.js b/examples/build/scene.bundle.js index 03828ef..bd0e153 100644 --- a/examples/build/scene.bundle.js +++ b/examples/build/scene.bundle.js @@ -93,7 +93,7 @@ /*! no static exports found */ /***/ (function(module, exports) { -eval("const renderer = new NEXT.Renderer();\nrenderer.setSize(window.innerWidth, window.innerHeight);\ndocument.body.appendChild(renderer.canvas);\n\nconst scene = new NEXT.Scene();\n\nconst camera = new NEXT.Camera({\n type: 'perspective',\n aspect: window.innerWidth / window.innerHeight\n});\n\nconst sphereGeo = NEXT.Sphere.Geometry({radius: 1});\n\nconst sphere1 = new NEXT.Mesh(sphereGeo, {\n shader: NEXT.shaders.default\n});\n\nvec3.set(sphere1.position, -4, 0, -10);\nsphere1.updateMatrix();\nscene.add(sphere1);\n\nconst sphere2 = new NEXT.Mesh(sphereGeo, {\n shader: NEXT.shaders.default\n});\n\nvec3.set(sphere2.position, 4, 0, -10);\nsphere2.updateMatrix();\nscene.add(sphere2);\n\n\n// renderer.attach(sphere.program);\nrenderer.setScene(scene);\nrenderer.render(camera);\n\nwindow.renderer = renderer;\n\nconst shader = new NEXT.Shader(`\n out vec3 color;\n\n void main() {\n [f lights]\n }\n`);\n\nwindow.shader = shader;\n\nconsole.log(shader.assemble());\n\n// const sphereGeo = NEXT.Sphere.Geometry({\n// radius: 1\n// });\n//\n// const mesh = new NEXT.Mesh(sphereGeo, {\n// shader: NEXT.shaders.default\n// });\n\n// scene.add(mesh);\n\n\n//# sourceURL=webpack:///./examples/src/scene.js?"); +eval("const renderer = new NEXT.Renderer();\nrenderer.setSize(window.innerWidth, window.innerHeight);\ndocument.body.appendChild(renderer.canvas);\n\nNEXT.Shader.collection = NEXT.shaders;\n\nconst scene = new NEXT.Scene();\n\nconst camera = new NEXT.Camera({\n type: 'perspective',\n aspect: window.innerWidth / window.innerHeight\n});\n\nconst material = new NEXT.LambertMaterial();\n\nconst sphere1 = new NEXT.Sphere({\n radius: 1,\n shader: material\n});\n\nvec3.set(sphere1.position, -4, 0, -10);\nscene.add(sphere1);\n\nconst sphere2 = new NEXT.Sphere({\n radius: 1,\n shader: material\n});\n\nvec3.set(sphere2.position, 0, 10, -10);\nsphere1.add(sphere2);\n\n// const plane = new NEXT.Plane({\n// width: 10,\n// height: 10,\n// shader: material\n// });\n// scene.add(plane);\n//\n// vec3.set(plane.position, -4, -4, -10);\n// quat.rotateX(plane.quaternion, plane.quaternion, -Math.PI / 2);\n\nrenderer.setScene(scene);\nrenderer.render(camera);\n\nwindow.renderer = renderer;\n\n// const sphereGeo = NEXT.Sphere.Geometry({\n// radius: 1\n// });\n//\n// const mesh = new NEXT.Mesh(sphereGeo, {\n// shader: NEXT.shaders.default\n// });\n\n// scene.add(mesh);\n\n\n//# sourceURL=webpack:///./examples/src/scene.js?"); /***/ }) diff --git a/examples/src/scene.js b/examples/src/scene.js index 7839daf..4943e71 100644 --- a/examples/src/scene.js +++ b/examples/src/scene.js @@ -2,6 +2,8 @@ const renderer = new NEXT.Renderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.canvas); +NEXT.Shader.collection = NEXT.shaders; + const scene = new NEXT.Scene(); const camera = new NEXT.Camera({ @@ -9,43 +11,39 @@ const camera = new NEXT.Camera({ aspect: window.innerWidth / window.innerHeight }); -const sphereGeo = NEXT.Sphere.Geometry({radius: 1}); +const material = new NEXT.LambertMaterial(); -const sphere1 = new NEXT.Mesh(sphereGeo, { - shader: NEXT.shaders.default +const sphere1 = new NEXT.Sphere({ + radius: 1, + shader: material }); vec3.set(sphere1.position, -4, 0, -10); -sphere1.updateMatrix(); scene.add(sphere1); -const sphere2 = new NEXT.Mesh(sphereGeo, { - shader: NEXT.shaders.default +const sphere2 = new NEXT.Sphere({ + radius: 1, + shader: material }); -vec3.set(sphere2.position, 4, 0, -10); -sphere2.updateMatrix(); -scene.add(sphere2); +vec3.set(sphere2.position, 0, 10, -10); +sphere1.add(sphere2); +// const plane = new NEXT.Plane({ +// width: 10, +// height: 10, +// shader: material +// }); +// scene.add(plane); +// +// vec3.set(plane.position, -4, -4, -10); +// quat.rotateX(plane.quaternion, plane.quaternion, -Math.PI / 2); -// renderer.attach(sphere.program); renderer.setScene(scene); renderer.render(camera); window.renderer = renderer; -const shader = new NEXT.Shader(` - out vec3 color; - - void main() { - [f lights] - } -`); - -window.shader = shader; - -console.log(shader.assemble()); - // const sphereGeo = NEXT.Sphere.Geometry({ // radius: 1 // }); diff --git a/gulpfile.babel.js b/gulpfile.babel.js new file mode 100644 index 0000000..6f9b8b0 --- /dev/null +++ b/gulpfile.babel.js @@ -0,0 +1,33 @@ +import fs from 'fs'; +import gulp from 'gulp'; +import glob from 'glob'; +import watch from 'gulp-watch'; + +gulp.task('build-shader-chunks', () => { + fs.writeFile('./src/shaders/chunks.js', + `// This file is autogenerated. +module.exports = { +${ + glob.sync('./src/shaders/lib/chunks/*.vert') + .map(filename => filename.replace(/.*(lib\/chunks\/([aA-zZ]*)\..*)/, ' v_$2: require(\'./$1\'),')) + .join('\n') +} +${ + glob.sync('./src/shaders/lib/chunks/*.frag') + .map(filename => filename.replace(/.*(lib\/chunks\/([aA-zZ]*)\..*)/, ' f_$2: require(\'./$1\'),')) + .join('\n').slice(0, -1) +} +}; +`, + () => { + console.log('build-shader-chunks: done!'); + } + ); +}); + +gulp.task('watch-shader-chunks', () => { + const watcher = watch('./src/shaders/lib/chunks/**/*.{frag,vert}'); + + watcher.on('add', () => gulp.start('build-shader-chunks')); + watcher.on('unlink', () => gulp.start('build-shader-chunks')); +}); diff --git a/package-lock.json b/package-lock.json index 2ff5fbf..a44de4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1136,12 +1136,30 @@ "string-width": "2.1.1" } }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -1157,6 +1175,12 @@ "color-convert": "1.9.2" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -1173,6 +1197,12 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1206,12 +1236,43 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "1.0.0", + "get-value": "2.0.6", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1558,6 +1619,12 @@ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -2007,6 +2074,35 @@ "wrap-ansi": "2.1.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -2038,6 +2134,12 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", @@ -2135,6 +2237,16 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "1.3.2", + "is-plain-object": "2.0.4" + } + }, "core-assert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", @@ -2266,12 +2378,27 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.46" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2347,6 +2474,32 @@ "core-assert": "0.2.1" } }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.4" + } + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -2441,6 +2594,12 @@ } } }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -2451,6 +2610,12 @@ "minimalistic-assert": "1.0.1" } }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", @@ -2513,6 +2678,41 @@ "is-obj": "1.0.1" } }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -2531,6 +2731,16 @@ "stream-shift": "1.0.0" } }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0" + } + }, "electron-to-chromium": { "version": "1.3.57", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.57.tgz", @@ -2635,6 +2845,38 @@ "is-symbol": "1.0.1" } }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.46" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3207,6 +3449,21 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -3324,6 +3581,17 @@ } } }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "time-stamp": "1.1.0" + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -3421,6 +3689,12 @@ "pkg-dir": "2.0.0" } }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -3430,6 +3704,54 @@ "locate-path": "2.0.0" } }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -4066,6 +4388,15 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -4177,19 +4508,119 @@ } } }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, "glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "ini": "1.3.5" + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-modules-path": { @@ -4198,6 +4629,19 @@ "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", "dev": true }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.1" + } + }, "globals": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", @@ -4227,6 +4671,73 @@ } } }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, "glsl-inject-defines": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", @@ -4340,127 +4851,669 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glslify": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-6.2.1.tgz", + "integrity": "sha512-rII1HbHc/Mr03kCOSsTIo5QN16lsi8w/frQjwRrIYifgyCLhnJp12fBVMzEW66bJoEd8YBys0+O2aRVXwxasLA==", + "dev": true, + "requires": { + "bl": "1.2.2", + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "falafel": "2.1.0", + "from2": "2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "1.0.0", + "glslify-bundle": "5.0.0", + "glslify-deps": "1.3.1", + "minimist": "1.2.0", + "resolve": "1.8.1", + "stack-trace": "0.0.9", + "static-eval": "2.0.0", + "tape": "4.9.1", + "through2": "2.0.3", + "xtend": "4.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "glslify-bundle": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.0.0.tgz", + "integrity": "sha1-AlKtoe+d8wtmAAbguyH9EwtIbkI=", + "dev": true, + "requires": { + "glsl-inject-defines": "1.0.3", + "glsl-token-defines": "1.0.0", + "glsl-token-depth": "1.1.2", + "glsl-token-descope": "1.0.2", + "glsl-token-scope": "1.1.2", + "glsl-token-string": "1.0.1", + "glsl-token-whitespace-trim": "1.0.0", + "glsl-tokenizer": "2.1.2", + "murmurhash-js": "1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz", + "integrity": "sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg==", + "dev": true, + "requires": { + "@choojs/findup": "0.2.1", + "events": "1.1.1", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "2.1.2", + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "map-limit": "0.0.1", + "resolve": "1.8.1" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.1.0", + "liftoff": "2.5.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-cli": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", + "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "archy": "1.0.0", + "array-sort": "1.0.0", + "color-support": "1.1.3", + "concat-stream": "1.6.2", + "copy-props": "2.0.4", + "fancy-log": "1.3.2", + "gulplog": "1.0.0", + "interpret": "1.1.0", + "isobject": "3.0.1", + "liftoff": "2.5.0", + "matchdep": "2.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.3", + "replace-homedir": "1.0.0", + "semver-greatest-satisfied-range": "1.1.0", + "v8flags": "3.1.1", + "yargs": "7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "v8flags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", + "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.2", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-watch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz", + "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "anymatch": "1.3.2", + "chokidar": "2.0.4", + "fancy-log": "1.3.2", + "glob-parent": "3.1.0", + "object-assign": "4.1.1", + "path-is-absolute": "1.0.1", + "plugin-error": "1.0.1", + "readable-stream": "2.3.6", + "slash": "1.0.0", + "vinyl": "2.2.0", + "vinyl-file": "2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "is-buffer": "1.1.6" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "clone": "2.1.2", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" } } } }, - "glslify": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/glslify/-/glslify-6.2.1.tgz", - "integrity": "sha512-rII1HbHc/Mr03kCOSsTIo5QN16lsi8w/frQjwRrIYifgyCLhnJp12fBVMzEW66bJoEd8YBys0+O2aRVXwxasLA==", - "dev": true, - "requires": { - "bl": "1.2.2", - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "falafel": "2.1.0", - "from2": "2.3.0", - "glsl-resolve": "0.0.1", - "glsl-token-whitespace-trim": "1.0.0", - "glslify-bundle": "5.0.0", - "glslify-deps": "1.3.1", - "minimist": "1.2.0", - "resolve": "1.8.1", - "stack-trace": "0.0.9", - "static-eval": "2.0.0", - "tape": "4.9.1", - "through2": "2.0.3", - "xtend": "4.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "glslify-bundle": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.0.0.tgz", - "integrity": "sha1-AlKtoe+d8wtmAAbguyH9EwtIbkI=", - "dev": true, - "requires": { - "glsl-inject-defines": "1.0.3", - "glsl-token-defines": "1.0.0", - "glsl-token-depth": "1.1.2", - "glsl-token-descope": "1.0.2", - "glsl-token-scope": "1.1.2", - "glsl-token-string": "1.0.1", - "glsl-token-whitespace-trim": "1.0.0", - "glsl-tokenizer": "2.1.2", - "murmurhash-js": "1.0.0", - "shallow-copy": "0.0.1" - } - }, - "glslify-deps": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz", - "integrity": "sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg==", - "dev": true, - "requires": { - "@choojs/findup": "0.2.1", - "events": "1.1.1", - "glsl-resolve": "0.0.1", - "glsl-tokenizer": "2.1.2", - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "map-limit": "0.0.1", - "resolve": "1.8.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "glogg": "1.0.1" } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4493,6 +5546,15 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -4574,6 +5636,15 @@ "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=", "dev": true }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -4723,6 +5794,16 @@ "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", "dev": true }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -5048,6 +6129,15 @@ "has": "1.0.3" } }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -5072,6 +6162,21 @@ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5208,6 +6313,22 @@ "type-check": "0.3.2" } }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "3.0.2", + "findup-sync": "2.0.0", + "fined": "1.1.0", + "flagged-respawn": "1.0.0", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.8.1" + } + }, "line-column-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-1.0.0.tgz", @@ -5267,6 +6388,60 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -5279,12 +6454,33 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5297,18 +6493,62 @@ "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", "dev": true }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", "dev": true }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, "lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", "dev": true }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, "lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", @@ -5389,6 +6629,15 @@ "pify": "3.0.0" } }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, "mamacro": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", @@ -5436,6 +6685,26 @@ "object-visit": "1.0.1" } }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "2.0.0", + "micromatch": "3.1.10", + "resolve": "1.8.1", + "stack-trace": "0.0.10" + }, + "dependencies": { + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + } + } + }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", @@ -5628,6 +6897,11 @@ "is-plain-obj": "1.1.0" } }, + "minivents": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/minivents/-/minivents-2.2.0.tgz", + "integrity": "sha1-VZSS7cBLwAtiFohQr1uMoG1eCIs=" + }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", @@ -5708,10 +6982,25 @@ "minimatch": "3.0.4" } }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, "murmurhash-js": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=", + "dev": true + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", "dev": true }, "mute-stream": { @@ -5746,6 +7035,12 @@ "to-regex": "3.0.2" } }, + "natives": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", + "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5758,6 +7053,12 @@ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nice-try": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", @@ -5915,6 +7216,50 @@ "isobject": "3.0.1" } }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "make-iterator": "1.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -5992,12 +7337,55 @@ "wordwrap": "1.0.0" } }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.1" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -6098,6 +7486,17 @@ "pbkdf2": "3.0.16" } }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -6136,6 +7535,12 @@ "error-ex": "1.3.2" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -6184,6 +7589,21 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -6296,6 +7716,18 @@ "find-up": "2.1.0" } }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "arr-diff": "4.0.0", + "arr-union": "3.1.0", + "extend-shallow": "3.0.2" + } + }, "plur": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", @@ -6341,6 +7773,17 @@ "integrity": "sha512-McHPg0n1pIke+A/4VcaS2en+pTNjy4xF+Uuq86u/5dyDO59/TtFZtQ708QIRkEZ3qwKz3GVkVa6mpxK/CpB8Rg==", "dev": true }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "primitive-plane": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/primitive-plane/-/primitive-plane-2.0.0.tgz", + "integrity": "sha1-hdwqhYMV0XNdXehxB8iKRAibyd0=" + }, "primitive-sphere": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/primitive-sphere/-/primitive-sphere-3.0.0.tgz", @@ -6562,6 +8005,15 @@ "set-immediate-shim": "1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.8.1" + } + }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -6704,6 +8156,23 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "is-absolute": "1.0.0", + "remove-trailing-separator": "1.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6758,6 +8227,16 @@ "resolve-from": "3.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -7319,6 +8798,21 @@ "semver": "5.5.0" } }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "1.5.0" + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, "serialize-javascript": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", @@ -7397,6 +8891,12 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7574,6 +9074,12 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -7676,6 +9182,12 @@ "readable-stream": "2.3.6" } }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -7763,6 +9275,36 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -7790,6 +9332,16 @@ "has-flag": "3.0.0" } }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -7891,6 +9443,21 @@ "xtend": "4.0.1" } }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -8056,6 +9623,12 @@ } } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -8137,6 +9710,12 @@ "imurmurhash": "0.1.4" } }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -8264,6 +9843,12 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -8285,6 +9870,15 @@ "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", "dev": true }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -8295,6 +9889,146 @@ "spdx-expression-parse": "3.0.0" } }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.4" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", diff --git a/package.json b/package.json index 3fe3d1e..44192d4 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "npm run examples & cross-env FXGL_SERVE=true rollup -w -c --experimentalDynamicImport", + "start": "gulp watch-shader-chunks --silent & npm run examples & cross-env FXGL_SERVE=true rollup -w -c --experimentalDynamicImport", "build": "rollup -c --experimentalDynamicImport", "examples": "webpack --config ./examples/webpack.config.babel.js -w --display minimal" }, @@ -18,9 +18,15 @@ "@babel/plugin-syntax-dynamic-import": "^7.0.0-rc.1", "@babel/preset-env": "^7.0.0-rc.1", "@babel/register": "^7.0.0-rc.1", + "angle-normals": "^1.0.0", "babel-eslint": "^8.2.6", + "bunny": "^1.0.1", "cross-env": "^5.2.0", "glob": "^7.1.2", + "gulp": "^3.9.1", + "gulp-cli": "^2.0.1", + "gulp-watch": "^5.0.1", + "normals": "^1.1.0", "rollup": "^0.64.1", "rollup-plugin-babel": "^4.0.0-beta.8", "rollup-plugin-commonjs": "^9.1.5", @@ -30,13 +36,12 @@ "rollup-watch": "^4.3.1", "webpack": "^4.16.5", "webpack-cli": "^3.1.0", - "xo": "^0.22.0", - "angle-normals": "^1.0.0", - "bunny": "^1.0.1", - "normals": "^1.1.0" + "xo": "^0.22.0" }, "dependencies": { "gl-mat4": "^1.2.0", + "minivents": "^2.2.0", + "primitive-plane": "^2.0.0", "primitive-sphere": "^3.0.0" }, "xo": { diff --git a/src/core/Mesh.js b/src/core/Mesh.js index 4377d57..b41e713 100644 --- a/src/core/Mesh.js +++ b/src/core/Mesh.js @@ -16,8 +16,8 @@ export class Mesh extends Object3D { frag: options.shader.frag }, geometry); - this.program.uniforms = { - $modelMatrix: this.matrix - }; + this.program.uniforms = Object.assign({}, options.shader.uniforms, { + $modelMatrix: this.matrixWorld + }); } } diff --git a/src/core/Object3D.js b/src/core/Object3D.js index da1968c..e4226e4 100644 --- a/src/core/Object3D.js +++ b/src/core/Object3D.js @@ -1,20 +1,48 @@ -import {identity, fromScaling, translate} from 'gl-mat4'; +import {identity, fromScaling, multiply, fromRotationTranslation} from 'gl-mat4'; +import Events from 'minivents'; -export class Object3D { +export class Object3D extends Events { constructor() { + super(); + + // FIXME: replace identity() with create() this.matrix = identity([]); + this.matrixWorld = identity([]); this.position = [0, 0, 0]; this.scale = [1, 1, 1]; this.quaternion = [0, 0, 0, 1]; this.children = []; + this.matrixAutoUpdate = true; + this.matrixWorldAutoUpdate = true; } updateMatrix() { - translate(this.matrix, fromScaling(this.matrix, this.scale), this.position); + fromRotationTranslation(fromScaling(this.matrix, this.scale), this.quaternion, this.position); + } + + updateMatrixWorld() { // Consider to be called after updateMatrix() + if (!this.parent) return; + multiply(this.matrixWorld, this.matrix, this.parent.matrix); } add(child) { + child.parent = this; this.children.push(child); + + const eventObject = { + parent: this, + object: child + }; + + child.emit('hierarchy-update', eventObject); + this.emit('hierarchy-update', eventObject); + + let _parent = this.parent; + + while (_parent) { + _parent.emit('hierarchy-update', eventObject); + _parent = _parent.parent; + } } traverse(cb) { diff --git a/src/core/Program.js b/src/core/Program.js index c8d4046..af82ece 100644 --- a/src/core/Program.js +++ b/src/core/Program.js @@ -19,7 +19,13 @@ export class Program { return shader; // TODO: Cleanup error logging + add troubleshooting - console.log(gl.getShaderInfoLog(shader)); + console.warn(gl.getShaderInfoLog(shader)); + console.warn( + source.split('\n') + .map((line, i) => `${i < 9 ? '0' : ''}${i+1}: ${line}`) + .join('\n') + ); + gl.deleteShader(shader); } @@ -93,7 +99,7 @@ export class Program { const vao = _geometryRefs.get(this); if (!vao._compiledVAO) vao._compile(gl); - _geometryRefs.get(this)._bind(gl); + vao._bind(gl); // // index attribute if (this.index) { @@ -114,4 +120,8 @@ export class Program { console.log(gl.getProgramInfoLog(program)); gl.deleteProgram(program); } + + _bind = gl => { + _geometryRefs.get(this)._bind(gl); + } } diff --git a/src/core/Renderer.js b/src/core/Renderer.js index de1b66f..638141c 100644 --- a/src/core/Renderer.js +++ b/src/core/Renderer.js @@ -7,6 +7,7 @@ export class Renderer { // TODO: Add webgl2 support check this.clearColor = options.clearColor || [0, 0, 0, 0]; this._programs = []; + this._root_objects = new Set(); gl.clearColor.apply(gl, this.clearColor); // eslint-disable-line gl.clear(gl.COLOR_BUFFER_BIT); @@ -36,19 +37,35 @@ export class Renderer { } setScene(scene) { + this._root_objects.add(scene); + scene.traverse(child => { if (!child.isMesh) return; - child.updateMatrix(); this.attach(child.program); child.program.__scene = scene; }); + + scene.on('hierarchy-update', ({object}) => { + if (!object.isMesh) return; + + this.attach(object.program); + object.program.__scene = scene; + }); } render(camera = null) { const gl = this.context; const {DRAW_CONSTANTS} = _locals.get(this); + // TODO: add optimization feature to avoid iterating + this._root_objects.forEach(root => { + root.traverse(object => { + if (object.matrixAutoUpdate) object.updateMatrix(); + if (object.matrixWorldAutoUpdate) object.updateMatrixWorld(); + }); + }); + // Clear the canvas gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); @@ -58,6 +75,7 @@ export class Renderer { // Tell it to use our program (pair of shaders) gl.useProgram(program._compiledProgram); + program._bind(gl); for (let k = 0, kl = uniforms.length; k < kl; k++) { const [uniformName, value] = uniforms[k]; diff --git a/src/index.js b/src/index.js index 017b47f..a8f7f24 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,8 @@ +import './shaders/initializeShaderCollection'; + export {default as shaders} from './shaders/shaders'; export * from './shaders/Shader'; +export * from './shaders/Material'; export * from './core/index'; export * from './primitives/index'; +export * from './materials/index'; diff --git a/src/materials/FlatMaterial.js b/src/materials/FlatMaterial.js new file mode 100644 index 0000000..56b2980 --- /dev/null +++ b/src/materials/FlatMaterial.js @@ -0,0 +1,7 @@ +import {Material} from '../shaders/Material'; + +export class FlatMaterial extends Material { + constructor(options = {}) { + super({type: 'flat'}); + } +} diff --git a/src/materials/LambertMaterial.js b/src/materials/LambertMaterial.js new file mode 100644 index 0000000..aeed070 --- /dev/null +++ b/src/materials/LambertMaterial.js @@ -0,0 +1,7 @@ +import {Material} from '../shaders/Material'; + +export class LambertMaterial extends Material { + constructor(options = {}) { + super({type: 'lambert'}); + } +} diff --git a/src/materials/index.js b/src/materials/index.js new file mode 100644 index 0000000..ffc4b49 --- /dev/null +++ b/src/materials/index.js @@ -0,0 +1,2 @@ +export * from './FlatMaterial'; +export * from './LambertMaterial'; diff --git a/src/primitives/Plane.js b/src/primitives/Plane.js new file mode 100644 index 0000000..b42ddd7 --- /dev/null +++ b/src/primitives/Plane.js @@ -0,0 +1,25 @@ +import generate from 'primitive-plane'; + +import {Mesh} from '../core/Mesh'; +import {Geometry} from '../core/Geometry'; +import {Attribute} from '../core/Attribute'; + +export class Plane extends Mesh { + static Geometry({width = 1, height = 1, widthSegments = 1, heightSegments = 1}) { + const data = generate(width, height, widthSegments, heightSegments); + const geometry = new Geometry(); + + geometry.setIndex(new Attribute(new Uint16Array(Attribute.inlineArray(data.cells)), 1)); + geometry.setAttribute('position', new Attribute(new Float32Array(Attribute.inlineArray(data.positions)), 3)); + geometry.setAttribute('normal', new Attribute(new Float32Array(Attribute.inlineArray(data.normals)), 3)); + geometry.setAttribute('uv', new Attribute(new Float32Array(Attribute.inlineArray(data.uvs)), 3)); + + return geometry; + } + + constructor(options = {}) { + super(Plane.Geometry(options), { + shader: options.shader + }); + } +} diff --git a/src/primitives/index.js b/src/primitives/index.js index a656d28..b82d0ed 100644 --- a/src/primitives/index.js +++ b/src/primitives/index.js @@ -1 +1,2 @@ export * from './Sphere'; +export * from './Plane'; diff --git a/src/shaders/Material.js b/src/shaders/Material.js new file mode 100644 index 0000000..bf230d9 --- /dev/null +++ b/src/shaders/Material.js @@ -0,0 +1,26 @@ +import {Shader} from './Shader'; + +export class Material { + constructor(options = {}) { + options = Object.assign({ + type: 'flat' + }, options); + + const shader = Shader.collection[options.type]; + + this.type = options.type; + this._vertexShader = new Shader(shader.vert).define(shader.defines); + this._fragmentShader = new Shader(shader.frag).define(shader.defines); + + // TODO: Make uniforms clone tool + this.uniforms = Object.assign({}, shader.uniforms); + } + + get frag() { + return this._fragmentShader.assemble(); + } + + get vert() { + return this._vertexShader.assemble(); + } +} diff --git a/src/shaders/Shader.js b/src/shaders/Shader.js index a8f3471..34ce32a 100644 --- a/src/shaders/Shader.js +++ b/src/shaders/Shader.js @@ -1,14 +1,56 @@ -import shaders from './shaders'; +// import shaders from './shaders'; +const _cache = new WeakMap(); + +// TODO: Assemble shader correct way. export class Shader { - constructor(raw) { + static collection = null; + + constructor(raw, modifiers = {}) { + if (Shader.collection === null) + throw new Error('Shader.collection should be specified.'); + this.raw = raw; + this.modifiers = modifiers; + this.defines = {}; } - assemble() { - return this.raw.replace(/\[([fv])\s([aA-zZ]*)\]/g, (match, shaderType, chunkName) => { - console.log(shaderType); - return shaders.chunks[shaderType + '_' + chunkName]; - }); + define(defines) { + Object.assign(this.defines, defines); + return this; + } + + assemble(useCached = false) { + const HEAD = '#version 300 es\n\n'; + + const defines = Object.entries(this.defines) + .map(([name, value]) => `#define ${name} ${value}`) + .join('\n'); + + if (!useCached || !cache.get(this)) { + const staticPart = this.raw.replace(/(\s*)\[([fv])\s([aA-zZ]*)\]/g, (match, spaces, shaderType, chunkName) => { + chunkName = shaderType + '_' + chunkName; + let chunk = Shader.collection.chunks[chunkName] + .split('\n') + .slice(1) + .join('\n'); + + chunk = chunkName in this.modifiers ? this.modifiers[chunkName]( + chunk, + (start, end) => chunk.split('\n').slice(start, end).join('\n') + ) : chunk; + + return `\n${spaces}// [${chunkName}] \n` + chunk + .split('\n') + .map(str => spaces.slice(1) + str) + .join('\n'); + }); + + _cache.set(this, staticPart); + + return HEAD + defines + '\n\n' + staticPart; + } + + return HEAD + defines + '\n\n' + cache.get(this); } } diff --git a/src/shaders/chunks.js b/src/shaders/chunks.js new file mode 100644 index 0000000..ebff1af --- /dev/null +++ b/src/shaders/chunks.js @@ -0,0 +1,14 @@ +// This file is autogenerated. +module.exports = { + v_init_pars: require('./lib/chunks/init_pars.vert'), + v_normal_pars: require('./lib/chunks/normal_pars.vert'), + v_normal: require('./lib/chunks/normal.vert'), + f_color: require('./lib/chunks/color.frag'), + f_init_pars: require('./lib/chunks/init_pars.frag'), + f_init: require('./lib/chunks/init.frag'), + f_lambert_light_pars: require('./lib/chunks/lambert_light_pars.frag'), + f_lambert_light: require('./lib/chunks/lambert_light.frag'), + f_lights: require('./lib/chunks/lights.frag'), + f_normal_pars: require('./lib/chunks/normal_pars.frag'), + f_normal: require('./lib/chunks/normal.frag') +}; diff --git a/src/shaders/initializeShaderCollection.js b/src/shaders/initializeShaderCollection.js new file mode 100644 index 0000000..66eedb4 --- /dev/null +++ b/src/shaders/initializeShaderCollection.js @@ -0,0 +1,8 @@ +import shaders from './shaders'; +import {Shader} from './Shader'; + +Shader.collection = shaders; // For browser + +export function initializeShaderCollection() { // For webpack + Shader.collection = shaders; +} diff --git a/src/shaders/lib/chunks/color.frag b/src/shaders/lib/chunks/color.frag new file mode 100644 index 0000000..e69de29 diff --git a/src/shaders/lib/chunks/init.frag b/src/shaders/lib/chunks/init.frag new file mode 100644 index 0000000..70c9c51 --- /dev/null +++ b/src/shaders/lib/chunks/init.frag @@ -0,0 +1,5 @@ +vec3 color; + +#ifdef USE_COLOR + color = u_diffuse; +#endif diff --git a/src/shaders/lib/chunks/init_pars.frag b/src/shaders/lib/chunks/init_pars.frag new file mode 100644 index 0000000..8115026 --- /dev/null +++ b/src/shaders/lib/chunks/init_pars.frag @@ -0,0 +1,3 @@ +#ifdef USE_COLOR + uniform vec3 u_diffuse; +#endif diff --git a/src/shaders/lib/chunks/init_pars.vert b/src/shaders/lib/chunks/init_pars.vert new file mode 100644 index 0000000..d87f783 --- /dev/null +++ b/src/shaders/lib/chunks/init_pars.vert @@ -0,0 +1,5 @@ +precision mediump float; +in vec4 position; + +uniform mat4 projectionMatrix; +uniform mat4 modelMatrix; diff --git a/src/shaders/lib/chunks/lambert_light.frag b/src/shaders/lib/chunks/lambert_light.frag new file mode 100644 index 0000000..905ddec --- /dev/null +++ b/src/shaders/lib/chunks/lambert_light.frag @@ -0,0 +1,4 @@ +// requires [f normal] +float lightness = dot(u_lightDir, normal); + +color = color * lightness; diff --git a/src/shaders/lib/chunks/lambert_light_pars.frag b/src/shaders/lib/chunks/lambert_light_pars.frag new file mode 100644 index 0000000..24c6300 --- /dev/null +++ b/src/shaders/lib/chunks/lambert_light_pars.frag @@ -0,0 +1 @@ +uniform vec3 u_lightDir; diff --git a/src/shaders/lib/chunks/normal.frag b/src/shaders/lib/chunks/normal.frag new file mode 100644 index 0000000..608f6a7 --- /dev/null +++ b/src/shaders/lib/chunks/normal.frag @@ -0,0 +1 @@ +vec3 normal = normalize(v_normal); diff --git a/src/shaders/lib/chunks/normal.vert b/src/shaders/lib/chunks/normal.vert new file mode 100644 index 0000000..f730a89 --- /dev/null +++ b/src/shaders/lib/chunks/normal.vert @@ -0,0 +1 @@ +v_normal = normal; diff --git a/src/shaders/lib/chunks/normal_pars.frag b/src/shaders/lib/chunks/normal_pars.frag new file mode 100644 index 0000000..45e8afc --- /dev/null +++ b/src/shaders/lib/chunks/normal_pars.frag @@ -0,0 +1 @@ +in vec3 v_normal; diff --git a/src/shaders/lib/chunks/normal_pars.vert b/src/shaders/lib/chunks/normal_pars.vert new file mode 100644 index 0000000..2dbd7e9 --- /dev/null +++ b/src/shaders/lib/chunks/normal_pars.vert @@ -0,0 +1,2 @@ +in vec3 normal; +out vec3 v_normal; diff --git a/src/shaders/lib/flat.frag b/src/shaders/lib/flat.frag new file mode 100644 index 0000000..087c0f4 --- /dev/null +++ b/src/shaders/lib/flat.frag @@ -0,0 +1,10 @@ +precision mediump float; +out vec4 outColor; + +[f init_pars] + +void main() { + [f init] + + outColor = vec4(color, 1.0); +} diff --git a/src/shaders/lib/flat.vert b/src/shaders/lib/flat.vert new file mode 100644 index 0000000..5446f9f --- /dev/null +++ b/src/shaders/lib/flat.vert @@ -0,0 +1,5 @@ +[v init_pars] + +void main() { + gl_Position = projectionMatrix * modelMatrix * position; +} diff --git a/src/shaders/lib/lambert.frag b/src/shaders/lib/lambert.frag new file mode 100644 index 0000000..dc034ea --- /dev/null +++ b/src/shaders/lib/lambert.frag @@ -0,0 +1,14 @@ +precision mediump float; +out vec4 outColor; + +[f init_pars] +[f normal_pars] +[f lambert_light_pars] + +void main() { + [f init] + [f normal] + [f lambert_light] + + outColor = vec4(color, 1.0); +} diff --git a/src/shaders/lib/lambert.vert b/src/shaders/lib/lambert.vert new file mode 100644 index 0000000..36c1aa5 --- /dev/null +++ b/src/shaders/lib/lambert.vert @@ -0,0 +1,8 @@ +[v init_pars] +[v normal_pars] + +void main() { + [v normal] + + gl_Position = projectionMatrix * modelMatrix * position; +} diff --git a/src/shaders/shaders.js b/src/shaders/shaders.js index d53e48a..bb8495d 100644 --- a/src/shaders/shaders.js +++ b/src/shaders/shaders.js @@ -1,3 +1,5 @@ +const chunks = require('./chunks'); + module.exports = { default: { vert: require('./lib/default.vert'), @@ -7,7 +9,26 @@ module.exports = { vert: require('./lib/test.vert'), frag: require('./lib/test.frag') }, - chunks: { - f_lights: require('./lib/chunks/lights.frag') - } + flat: { + vert: require('./lib/flat.vert'), + frag: require('./lib/flat.frag'), + uniforms: { + u_diffuse: [1, 0, 0] + }, + defines: { + USE_COLOR: true + } + }, + lambert: { + vert: require('./lib/lambert.vert'), + frag: require('./lib/lambert.frag'), + uniforms: { + u_diffuse: [1, 0, 0], + u_lightDir: [0, 0, 1] + }, + defines: { + USE_COLOR: true + } + }, + chunks };