document.writeln(""); document.writeln(""); !function(e, t) { "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.dat = t() : e.dat = t() }(this, function() { return function(e) { function t(o) { if (n[o]) return n[o].exports; var i = n[o] = { exports: {}, id: o, loaded: !1 }; return e[o].call(i.exports, i, i.exports, t), i.loaded = !0, i.exports } var n = {}; return t.m = e, t.c = n, t.p = "", t(0) }([function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } var i = n(1) , r = o(i); e.exports = r["default"] } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } t.__esModule = !0; var i = n(2) , r = o(i) , a = n(6) , l = o(a) , s = n(3) , u = o(s) , d = n(7) , c = o(d) , f = n(8) , _ = o(f) , p = n(10) , h = o(p) , m = n(11) , b = o(m) , g = n(12) , v = o(g) , y = n(13) , w = o(y) , x = n(14) , E = o(x) , C = n(15) , A = o(C) , S = n(16) , k = o(S) , O = n(9) , T = o(O) , R = n(17) , L = o(R); t["default"] = { color: { Color: r["default"], math: l["default"], interpret: u["default"] }, controllers: { Controller: c["default"], BooleanController: _["default"], OptionController: h["default"], StringController: b["default"], NumberController: v["default"], NumberControllerBox: w["default"], NumberControllerSlider: E["default"], FunctionController: A["default"], ColorController: k["default"] }, dom: { dom: T["default"] }, gui: { GUI: L["default"] }, GUI: L["default"] } } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t, n) { Object.defineProperty(e, t, { get: function() { return "RGB" === this.__state.space ? this.__state[t] : (h.recalculateRGB(this, t, n), this.__state[t]) }, set: function(e) { "RGB" !== this.__state.space && (h.recalculateRGB(this, t, n), this.__state.space = "RGB"), this.__state[t] = e } }) } function a(e, t) { Object.defineProperty(e, t, { get: function() { return "HSV" === this.__state.space ? this.__state[t] : (h.recalculateHSV(this), this.__state[t]) }, set: function(e) { "HSV" !== this.__state.space && (h.recalculateHSV(this), this.__state.space = "HSV"), this.__state[t] = e } }) } t.__esModule = !0; var l = n(3) , s = o(l) , u = n(6) , d = o(u) , c = n(4) , f = o(c) , _ = n(5) , p = o(_) , h = function() { function e() { if (i(this, e), this.__state = s["default"].apply(this, arguments), this.__state === !1) throw new Error("Failed to interpret color arguments"); this.__state.a = this.__state.a || 1 } return e.prototype.toString = function() { return (0, f["default"])(this) } , e.prototype.toHexString = function() { return (0, f["default"])(this, !0) } , e.prototype.toOriginal = function() { return this.__state.conversion.write(this) } , e }(); h.recalculateRGB = function(e, t, n) { if ("HEX" === e.__state.space) e.__state[t] = d["default"].component_from_hex(e.__state.hex, n); else { if ("HSV" !== e.__state.space) throw new Error("Corrupted color state"); p["default"].extend(e.__state, d["default"].hsv_to_rgb(e.__state.h, e.__state.s, e.__state.v)) } } , h.recalculateHSV = function(e) { var t = d["default"].rgb_to_hsv(e.r, e.g, e.b); p["default"].extend(e.__state, { s: t.s, v: t.v }), p["default"].isNaN(t.h) ? p["default"].isUndefined(e.__state.h) && (e.__state.h = 0) : e.__state.h = t.h } , h.COMPONENTS = ["r", "g", "b", "h", "s", "v", "hex", "a"], r(h.prototype, "r", 2), r(h.prototype, "g", 1), r(h.prototype, "b", 0), a(h.prototype, "h"), a(h.prototype, "s"), a(h.prototype, "v"), Object.defineProperty(h.prototype, "a", { get: function() { return this.__state.a }, set: function(e) { this.__state.a = e } }), Object.defineProperty(h.prototype, "hex", { get: function() { return "HEX" !== !this.__state.space && (this.__state.hex = d["default"].rgb_to_hex(this.r, this.g, this.b)), this.__state.hex }, set: function(e) { this.__state.space = "HEX", this.__state.hex = e } }), t["default"] = h } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } t.__esModule = !0; var i = n(4) , r = o(i) , a = n(5) , l = o(a) , s = [{ litmus: l["default"].isString, conversions: { THREE_CHAR_HEX: { read: function(e) { var t = e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); return null !== t && { space: "HEX", hex: parseInt("0x" + t[1].toString() + t[1].toString() + t[2].toString() + t[2].toString() + t[3].toString() + t[3].toString(), 0) } }, write: r["default"] }, SIX_CHAR_HEX: { read: function(e) { var t = e.match(/^#([A-F0-9]{6})$/i); return null !== t && { space: "HEX", hex: parseInt("0x" + t[1].toString(), 0) } }, write: r["default"] }, CSS_RGB: { read: function(e) { var t = e.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); return null !== t && { space: "RGB", r: parseFloat(t[1]), g: parseFloat(t[2]), b: parseFloat(t[3]) } }, write: r["default"] }, CSS_RGBA: { read: function(e) { var t = e.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); return null !== t && { space: "RGB", r: parseFloat(t[1]), g: parseFloat(t[2]), b: parseFloat(t[3]), a: parseFloat(t[4]) } }, write: r["default"] } } }, { litmus: l["default"].isNumber, conversions: { HEX: { read: function(e) { return { space: "HEX", hex: e, conversionName: "HEX" } }, write: function(e) { return e.hex } } } }, { litmus: l["default"].isArray, conversions: { RGB_ARRAY: { read: function(e) { return 3 === e.length && { space: "RGB", r: e[0], g: e[1], b: e[2] } }, write: function(e) { return [e.r, e.g, e.b] } }, RGBA_ARRAY: { read: function(e) { return 4 === e.length && { space: "RGB", r: e[0], g: e[1], b: e[2], a: e[3] } }, write: function(e) { return [e.r, e.g, e.b, e.a] } } } }, { litmus: l["default"].isObject, conversions: { RGBA_OBJ: { read: function(e) { return !!(l["default"].isNumber(e.r) && l["default"].isNumber(e.g) && l["default"].isNumber(e.b) && l["default"].isNumber(e.a)) && { space: "RGB", r: e.r, g: e.g, b: e.b, a: e.a } }, write: function(e) { return { r: e.r, g: e.g, b: e.b, a: e.a } } }, RGB_OBJ: { read: function(e) { return !!(l["default"].isNumber(e.r) && l["default"].isNumber(e.g) && l["default"].isNumber(e.b)) && { space: "RGB", r: e.r, g: e.g, b: e.b } }, write: function(e) { return { r: e.r, g: e.g, b: e.b } } }, HSVA_OBJ: { read: function(e) { return !!(l["default"].isNumber(e.h) && l["default"].isNumber(e.s) && l["default"].isNumber(e.v) && l["default"].isNumber(e.a)) && { space: "HSV", h: e.h, s: e.s, v: e.v, a: e.a } }, write: function(e) { return { h: e.h, s: e.s, v: e.v, a: e.a } } }, HSV_OBJ: { read: function(e) { return !!(l["default"].isNumber(e.h) && l["default"].isNumber(e.s) && l["default"].isNumber(e.v)) && { space: "HSV", h: e.h, s: e.s, v: e.v } }, write: function(e) { return { h: e.h, s: e.s, v: e.v } } } } }] , u = void 0 , d = void 0 , c = function() { d = !1; var e = arguments.length > 1 ? l["default"].toArray(arguments) : arguments[0]; return l["default"].each(s, function(t) { if (t.litmus(e)) return l["default"].each(t.conversions, function(t, n) { if (u = t.read(e), d === !1 && u !== !1) return d = u, u.conversionName = n, u.conversion = t, l["default"].BREAK }), l["default"].BREAK }), d }; t["default"] = c } , function(e, t) { "use strict"; t.__esModule = !0, t["default"] = function(e, t) { var n = e.__state.conversionName.toString() , o = Math.round(e.r) , i = Math.round(e.g) , r = Math.round(e.b) , a = e.a , l = Math.round(e.h) , s = e.s.toFixed(1) , u = e.v.toFixed(1); if (t || "THREE_CHAR_HEX" === n || "SIX_CHAR_HEX" === n) { for (var d = e.hex.toString(16); d.length < 6; ) d = "0" + d; return "#" + d } return "CSS_RGB" === n ? "rgb(" + o + "," + i + "," + r + ")" : "CSS_RGBA" === n ? "rgba(" + o + "," + i + "," + r + "," + a + ")" : "HEX" === n ? "0x" + e.hex.toString(16) : "RGB_ARRAY" === n ? "[" + o + "," + i + "," + r + "]" : "RGBA_ARRAY" === n ? "[" + o + "," + i + "," + r + "," + a + "]" : "RGB_OBJ" === n ? "{r:" + o + ",g:" + i + ",b:" + r + "}" : "RGBA_OBJ" === n ? "{r:" + o + ",g:" + i + ",b:" + r + ",a:" + a + "}" : "HSV_OBJ" === n ? "{h:" + l + ",s:" + s + ",v:" + u + "}" : "HSVA_OBJ" === n ? "{h:" + l + ",s:" + s + ",v:" + u + ",a:" + a + "}" : "unknown format" } } , function(e, t) { "use strict"; t.__esModule = !0; var n = Array.prototype.forEach , o = Array.prototype.slice , i = { BREAK: {}, extend: function(e) { return this.each(o.call(arguments, 1), function(t) { var n = this.isObject(t) ? Object.keys(t) : []; n.forEach(function(n) { this.isUndefined(t[n]) || (e[n] = t[n]) } .bind(this)) }, this), e }, defaults: function(e) { return this.each(o.call(arguments, 1), function(t) { var n = this.isObject(t) ? Object.keys(t) : []; n.forEach(function(n) { this.isUndefined(e[n]) && (e[n] = t[n]) } .bind(this)) }, this), e }, compose: function() { var e = o.call(arguments); return function() { for (var t = o.call(arguments), n = e.length - 1; n >= 0; n--) t = [e[n].apply(this, t)]; return t[0] } }, each: function(e, t, o) { if (e) if (n && e.forEach && e.forEach === n) e.forEach(t, o); else if (e.length === e.length + 0) { var i = void 0 , r = void 0; for (i = 0, r = e.length; i < r; i++) if (i in e && t.call(o, e[i], i) === this.BREAK) return } else for (var a in e) if (t.call(o, e[a], a) === this.BREAK) return }, defer: function(e) { setTimeout(e, 0) }, debounce: function(e, t, n) { var o = void 0; return function() { function i() { o = null, n || e.apply(r, a) } var r = this , a = arguments , l = n || !o; clearTimeout(o), o = setTimeout(i, t), l && e.apply(r, a) } }, toArray: function(e) { return e.toArray ? e.toArray() : o.call(e) }, isUndefined: function(e) { return void 0 === e }, isNull: function(e) { return null === e }, isNaN: function(e) { function t(t) { return e.apply(this, arguments) } return t.toString = function() { return e.toString() } , t }(function(e) { return isNaN(e) }), isArray: Array.isArray || function(e) { return e.constructor === Array } , isObject: function(e) { return e === Object(e) }, isNumber: function(e) { return e === e + 0 }, isString: function(e) { return e === e + "" }, isBoolean: function(e) { return e === !1 || e === !0 }, isFunction: function(e) { return "[object Function]" === Object.prototype.toString.call(e) } }; t["default"] = i } , function(e, t) { "use strict"; t.__esModule = !0; var n = void 0 , o = { hsv_to_rgb: function(e, t, n) { var o = Math.floor(e / 60) % 6 , i = e / 60 - Math.floor(e / 60) , r = n * (1 - t) , a = n * (1 - i * t) , l = n * (1 - (1 - i) * t) , s = [[n, l, r], [a, n, r], [r, n, l], [r, a, n], [l, r, n], [n, r, a]][o]; return { r: 255 * s[0], g: 255 * s[1], b: 255 * s[2] } }, rgb_to_hsv: function(e, t, n) { var o = Math.min(e, t, n) , i = Math.max(e, t, n) , r = i - o , a = void 0 , l = void 0; return 0 === i ? { h: NaN, s: 0, v: 0 } : (l = r / i, a = e === i ? (t - n) / r : t === i ? 2 + (n - e) / r : 4 + (e - t) / r, a /= 6, a < 0 && (a += 1), { h: 360 * a, s: l, v: i / 255 }) }, rgb_to_hex: function(e, t, n) { var o = this.hex_with_component(0, 2, e); return o = this.hex_with_component(o, 1, t), o = this.hex_with_component(o, 0, n) }, component_from_hex: function(e, t) { return e >> 8 * t & 255 }, hex_with_component: function(e, t, o) { return o << (n = 8 * t) | e & ~(255 << n) } }; t["default"] = o } , function(e, t) { "use strict"; function n(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } t.__esModule = !0; var o = function() { function e(t, o) { n(this, e), this.initialValue = t[o], this.domElement = document.createElement("div"), this.object = t, this.property = o, this.__onChange = void 0, this.__onFinishChange = void 0 } return e.prototype.onChange = function(e) { return this.__onChange = e, this } , e.prototype.onFinishChange = function(e) { return this.__onFinishChange = e, this } , e.prototype.setValue = function(e) { return this.object[this.property] = e, this.__onChange && this.__onChange.call(this, e), this.updateDisplay(), this } , e.prototype.getValue = function() { return this.object[this.property] } , e.prototype.updateDisplay = function() { return this } , e.prototype.isModified = function() { return this.initialValue !== this.getValue() } , e }(); t["default"] = o } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } t.__esModule = !0; var l = n(7) , s = o(l) , u = n(9) , d = o(u) , c = function(e) { function t(n, o) { function a() { s.setValue(!s.__prev) } i(this, t); var l = r(this, e.call(this, n, o)) , s = l; return l.__prev = l.getValue(), l.__checkbox = document.createElement("input"), l.__checkbox.setAttribute("type", "checkbox"), d["default"].bind(l.__checkbox, "change", a, !1), l.domElement.appendChild(l.__checkbox), l.updateDisplay(), l } return a(t, e), t.prototype.setValue = function(t) { var n = e.prototype.setValue.call(this, t); return this.__onFinishChange && this.__onFinishChange.call(this, this.getValue()), this.__prev = this.getValue(), n } , t.prototype.updateDisplay = function() { return this.getValue() === !0 ? (this.__checkbox.setAttribute("checked", "checked"), this.__checkbox.checked = !0, this.__prev = !0) : (this.__checkbox.checked = !1, this.__prev = !1), e.prototype.updateDisplay.call(this) } , t }(s["default"]); t["default"] = c } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e) { if ("0" === e || a["default"].isUndefined(e)) return 0; var t = e.match(u); return a["default"].isNull(t) ? 0 : parseFloat(t[1]) } t.__esModule = !0; var r = n(5) , a = o(r) , l = { HTMLEvents: ["change"], MouseEvents: ["click", "mousemove", "mousedown", "mouseup", "mouseover"], KeyboardEvents: ["keydown"] } , s = {}; a["default"].each(l, function(e, t) { a["default"].each(e, function(e) { s[e] = t }) }); var u = /(\d+(\.\d+)?)px/ , d = { makeSelectable: function(e, t) { void 0 !== e && void 0 !== e.style && (e.onselectstart = t ? function() { return !1 } : function() {} , e.style.MozUserSelect = t ? "auto" : "none", e.style.KhtmlUserSelect = t ? "auto" : "none", e.unselectable = t ? "on" : "off") }, makeFullscreen: function(e, t, n) { var o = n , i = t; a["default"].isUndefined(i) && (i = !0), a["default"].isUndefined(o) && (o = !0), e.style.position = "absolute", i && (e.style.left = 0, e.style.right = 0), o && (e.style.top = 0, e.style.bottom = 0) }, fakeEvent: function(e, t, n, o) { var i = n || {} , r = s[t]; if (!r) throw new Error("Event type " + t + " not supported."); var l = document.createEvent(r); switch (r) { case "MouseEvents": var u = i.x || i.clientX || 0 , d = i.y || i.clientY || 0; l.initMouseEvent(t, i.bubbles || !1, i.cancelable || !0, window, i.clickCount || 1, 0, 0, u, d, !1, !1, !1, !1, 0, null); break; case "KeyboardEvents": var c = l.initKeyboardEvent || l.initKeyEvent; a["default"].defaults(i, { cancelable: !0, ctrlKey: !1, altKey: !1, shiftKey: !1, metaKey: !1, keyCode: void 0, charCode: void 0 }), c(t, i.bubbles || !1, i.cancelable, window, i.ctrlKey, i.altKey, i.shiftKey, i.metaKey, i.keyCode, i.charCode); break; default: l.initEvent(t, i.bubbles || !1, i.cancelable || !0) } a["default"].defaults(l, o), e.dispatchEvent(l) }, bind: function(e, t, n, o) { var i = o || !1; return e.addEventListener ? e.addEventListener(t, n, i) : e.attachEvent && e.attachEvent("on" + t, n), d }, unbind: function(e, t, n, o) { var i = o || !1; return e.removeEventListener ? e.removeEventListener(t, n, i) : e.detachEvent && e.detachEvent("on" + t, n), d }, addClass: function(e, t) { if (void 0 === e.className) e.className = t; else if (e.className !== t) { var n = e.className.split(/ +/); n.indexOf(t) === -1 && (n.push(t), e.className = n.join(" ").replace(/^\s+/, "").replace(/\s+$/, "")) } return d }, removeClass: function(e, t) { if (t) if (e.className === t) e.removeAttribute("class"); else { var n = e.className.split(/ +/) , o = n.indexOf(t); o !== -1 && (n.splice(o, 1), e.className = n.join(" ")) } else e.className = void 0; return d }, hasClass: function(e, t) { return new RegExp("(?:^|\\s+)" + t + "(?:\\s+|$)").test(e.className) || !1 }, getWidth: function(e) { var t = getComputedStyle(e); return i(t["border-left-width"]) + i(t["border-right-width"]) + i(t["padding-left"]) + i(t["padding-right"]) + i(t.width) }, getHeight: function(e) { var t = getComputedStyle(e); return i(t["border-top-width"]) + i(t["border-bottom-width"]) + i(t["padding-top"]) + i(t["padding-bottom"]) + i(t.height) }, getOffset: function(e) { var t = e , n = { left: 0, top: 0 }; if (t.offsetParent) do n.left += t.offsetLeft, n.top += t.offsetTop, t = t.offsetParent; while (t); return n }, isActive: function(e) { return e === document.activeElement && (e.type || e.href) } }; t["default"] = d } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } t.__esModule = !0; var l = n(7) , s = o(l) , u = n(9) , d = o(u) , c = n(5) , f = o(c) , _ = function(e) { function t(n, o, a) { i(this, t); var l = r(this, e.call(this, n, o)) , s = a , u = l; return l.__select = document.createElement("select"), f["default"].isArray(s) && !function() { var e = {}; f["default"].each(s, function(t) { e[t] = t }), s = e }(), f["default"].each(s, function(e, t) { var n = document.createElement("option"); n.innerHTML = t, n.setAttribute("value", e), u.__select.appendChild(n) }), l.updateDisplay(), d["default"].bind(l.__select, "change", function() { var e = this.options[this.selectedIndex].value; u.setValue(e) }), l.domElement.appendChild(l.__select), l } return a(t, e), t.prototype.setValue = function(t) { var n = e.prototype.setValue.call(this, t); return this.__onFinishChange && this.__onFinishChange.call(this, this.getValue()), n } , t.prototype.updateDisplay = function() { return d["default"].isActive(this.__select) ? this : (this.__select.value = this.getValue(), e.prototype.updateDisplay.call(this)) } , t }(s["default"]); t["default"] = _ } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } t.__esModule = !0; var l = n(7) , s = o(l) , u = n(9) , d = o(u) , c = function(e) { function t(n, o) { function a() { u.setValue(u.__input.value) } function l() { u.__onFinishChange && u.__onFinishChange.call(u, u.getValue()) } i(this, t); var s = r(this, e.call(this, n, o)) , u = s; return s.__input = document.createElement("input"), s.__input.setAttribute("type", "text"), d["default"].bind(s.__input, "keyup", a), d["default"].bind(s.__input, "change", a), d["default"].bind(s.__input, "blur", l), d["default"].bind(s.__input, "keydown", function(e) { 13 === e.keyCode && this.blur() }), s.updateDisplay(), s.domElement.appendChild(s.__input), s } return a(t, e), t.prototype.updateDisplay = function() { return d["default"].isActive(this.__input) || (this.__input.value = this.getValue()), e.prototype.updateDisplay.call(this) } , t }(s["default"]); t["default"] = c } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function l(e) { var t = e.toString(); return t.indexOf(".") > -1 ? t.length - t.indexOf(".") - 1 : 0 } t.__esModule = !0; var s = n(7) , u = o(s) , d = n(5) , c = o(d) , f = function(e) { function t(n, o, a) { i(this, t); var s = r(this, e.call(this, n, o)) , u = a || {}; return s.__min = u.min, s.__max = u.max, s.__step = u.step, c["default"].isUndefined(s.__step) ? 0 === s.initialValue ? s.__impliedStep = 1 : s.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(s.initialValue)) / Math.LN10)) / 10 : s.__impliedStep = s.__step, s.__precision = l(s.__impliedStep), s } return a(t, e), t.prototype.setValue = function(t) { var n = t; return void 0 !== this.__min && n < this.__min ? n = this.__min : void 0 !== this.__max && n > this.__max && (n = this.__max), void 0 !== this.__step && n % this.__step !== 0 && (n = Math.round(n / this.__step) * this.__step), e.prototype.setValue.call(this, n) } , t.prototype.min = function(e) { return this.__min = e, this } , t.prototype.max = function(e) { return this.__max = e, this } , t.prototype.step = function(e) { return this.__step = e, this.__impliedStep = e, this.__precision = l(e), this } , t }(u["default"]); t["default"] = f } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function l(e, t) { var n = Math.pow(10, t); return Math.round(e * n) / n } t.__esModule = !0; var s = n(12) , u = o(s) , d = n(9) , c = o(d) , f = n(5) , _ = o(f) , p = function(e) { function t(n, o, a) { function l() { var e = parseFloat(m.__input.value); _["default"].isNaN(e) || m.setValue(e) } function s() { m.__onFinishChange && m.__onFinishChange.call(m, m.getValue()) } function u() { s() } function d(e) { var t = b - e.clientY; m.setValue(m.getValue() + t * m.__impliedStep), b = e.clientY } function f() { c["default"].unbind(window, "mousemove", d), c["default"].unbind(window, "mouseup", f), s() } function p(e) { c["default"].bind(window, "mousemove", d), c["default"].bind(window, "mouseup", f), b = e.clientY } i(this, t); var h = r(this, e.call(this, n, o, a)); h.__truncationSuspended = !1; var m = h , b = void 0; return h.__input = document.createElement("input"), h.__input.setAttribute("type", "text"), c["default"].bind(h.__input, "change", l), c["default"].bind(h.__input, "blur", u), c["default"].bind(h.__input, "mousedown", p), c["default"].bind(h.__input, "keydown", function(e) { 13 === e.keyCode && (m.__truncationSuspended = !0, this.blur(), m.__truncationSuspended = !1, s()) }), h.updateDisplay(), h.domElement.appendChild(h.__input), h } return a(t, e), t.prototype.updateDisplay = function() { return this.__input.value = this.__truncationSuspended ? this.getValue() : l(this.getValue(), this.__precision), e.prototype.updateDisplay.call(this) } , t }(u["default"]); t["default"] = p } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function l(e, t, n, o, i) { return o + (i - o) * ((e - t) / (n - t)) } t.__esModule = !0; var s = n(12) , u = o(s) , d = n(9) , c = o(d) , f = function(e) { function t(n, o, a, s, u) { function d(e) { document.activeElement.blur(), c["default"].bind(window, "mousemove", f), c["default"].bind(window, "mouseup", _), f(e) } function f(e) { e.preventDefault(); var t = h.__background.getBoundingClientRect(); return h.setValue(l(e.clientX, t.left, t.right, h.__min, h.__max)), !1 } function _() { c["default"].unbind(window, "mousemove", f), c["default"].unbind(window, "mouseup", _), h.__onFinishChange && h.__onFinishChange.call(h, h.getValue()) } i(this, t); var p = r(this, e.call(this, n, o, { min: a, max: s, step: u })) , h = p; return p.__background = document.createElement("div"), p.__foreground = document.createElement("div"), c["default"].bind(p.__background, "mousedown", d), c["default"].addClass(p.__background, "slider"), c["default"].addClass(p.__foreground, "slider-fg"), p.updateDisplay(), p.__background.appendChild(p.__foreground), p.domElement.appendChild(p.__background), p } return a(t, e), t.prototype.updateDisplay = function() { var t = (this.getValue() - this.__min) / (this.__max - this.__min); return this.__foreground.style.width = 100 * t + "%", e.prototype.updateDisplay.call(this) } , t }(u["default"]); t["default"] = f } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } t.__esModule = !0; var l = n(7) , s = o(l) , u = n(9) , d = o(u) , c = function(e) { function t(n, o, a) { i(this, t); var l = r(this, e.call(this, n, o)) , s = l; return l.__button = document.createElement("div"), l.__button.innerHTML = void 0 === a ? "Fire" : a, d["default"].bind(l.__button, "click", function(e) { return e.preventDefault(), s.fire(), !1 }), d["default"].addClass(l.__button, "button"), l.domElement.appendChild(l.__button), l } return a(t, e), t.prototype.fire = function() { this.__onChange && this.__onChange.call(this), this.getValue().call(this.object), this.__onFinishChange && this.__onFinishChange.call(this, this.getValue()) } , t }(s["default"]); t["default"] = c } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function r(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function a(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function l(e, t, n, o) { e.style.background = "", g["default"].each(y, function(i) { e.style.cssText += "background: " + i + "linear-gradient(" + t + ", " + n + " 0%, " + o + " 100%); " }) } function s(e) { e.style.background = "", e.style.cssText += "background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);", e.style.cssText += "background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);", e.style.cssText += "background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);", e.style.cssText += "background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);", e.style.cssText += "background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);" } t.__esModule = !0; var u = n(7) , d = o(u) , c = n(9) , f = o(c) , _ = n(2) , p = o(_) , h = n(3) , m = o(h) , b = n(5) , g = o(b) , v = function(e) { function t(n, o) { function a(e) { h(e), f["default"].bind(window, "mousemove", h), f["default"].bind(window, "mouseup", u) } function u() { f["default"].unbind(window, "mousemove", h), f["default"].unbind(window, "mouseup", u), _() } function d() { var e = (0, m["default"])(this.value); e !== !1 ? (y.__color.__state = e, y.setValue(y.__color.toOriginal())) : this.value = y.__color.toString() } function c() { f["default"].unbind(window, "mousemove", b), f["default"].unbind(window, "mouseup", c), _() } function _() { y.__onFinishChange && y.__onFinishChange.call(y, y.__color.toOriginal()) } function h(e) { e.preventDefault(); var t = y.__saturation_field.getBoundingClientRect() , n = (e.clientX - t.left) / (t.right - t.left) , o = 1 - (e.clientY - t.top) / (t.bottom - t.top); return o > 1 ? o = 1 : o < 0 && (o = 0), n > 1 ? n = 1 : n < 0 && (n = 0), y.__color.v = o, y.__color.s = n, y.setValue(y.__color.toOriginal()), !1 } function b(e) { e.preventDefault(); var t = y.__hue_field.getBoundingClientRect() , n = 1 - (e.clientY - t.top) / (t.bottom - t.top); return n > 1 ? n = 1 : n < 0 && (n = 0), y.__color.h = 360 * n, y.setValue(y.__color.toOriginal()), !1 } i(this, t); var v = r(this, e.call(this, n, o)); v.__color = new p["default"](v.getValue()), v.__temp = new p["default"](0); var y = v; v.domElement = document.createElement("div"), f["default"].makeSelectable(v.domElement, !1), v.__selector = document.createElement("div"), v.__selector.className = "selector", v.__saturation_field = document.createElement("div"), v.__saturation_field.className = "saturation-field", v.__field_knob = document.createElement("div"), v.__field_knob.className = "field-knob", v.__field_knob_border = "2px solid ", v.__hue_knob = document.createElement("div"), v.__hue_knob.className = "hue-knob", v.__hue_field = document.createElement("div"), v.__hue_field.className = "hue-field", v.__input = document.createElement("input"), v.__input.type = "text", v.__input_textShadow = "0 1px 1px ", f["default"].bind(v.__input, "keydown", function(e) { 13 === e.keyCode && d.call(this) }), f["default"].bind(v.__input, "blur", d), f["default"].bind(v.__selector, "mousedown", function() { f["default"].addClass(this, "drag").bind(window, "mouseup", function() { f["default"].removeClass(y.__selector, "drag") }) }); var w = document.createElement("div"); return g["default"].extend(v.__selector.style, { width: "122px", height: "102px", padding: "3px", backgroundColor: "#222", boxShadow: "0px 1px 3px rgba(0,0,0,0.3)" }), g["default"].extend(v.__field_knob.style, { position: "absolute", width: "12px", height: "12px", border: v.__field_knob_border + (v.__color.v < .5 ? "#fff" : "#000"), boxShadow: "0px 1px 3px rgba(0,0,0,0.5)", borderRadius: "12px", zIndex: 1 }), g["default"].extend(v.__hue_knob.style, { position: "absolute", width: "15px", height: "2px", borderRight: "4px solid #fff", zIndex: 1 }), g["default"].extend(v.__saturation_field.style, { width: "100px", height: "100px", border: "1px solid #555", marginRight: "3px", display: "inline-block", cursor: "pointer" }), g["default"].extend(w.style, { width: "100%", height: "100%", background: "none" }), l(w, "top", "rgba(0,0,0,0)", "#000"), g["default"].extend(v.__hue_field.style, { width: "15px", height: "100px", border: "1px solid #555", cursor: "ns-resize", position: "absolute", top: "3px", right: "3px" }), s(v.__hue_field), g["default"].extend(v.__input.style, { outline: "none", textAlign: "center", color: "#fff", border: 0, fontWeight: "bold", textShadow: v.__input_textShadow + "rgba(0,0,0,0.7)" }), f["default"].bind(v.__saturation_field, "mousedown", a), f["default"].bind(v.__field_knob, "mousedown", a), f["default"].bind(v.__hue_field, "mousedown", function(e) { b(e), f["default"].bind(window, "mousemove", b), f["default"].bind(window, "mouseup", c) }), v.__saturation_field.appendChild(w), v.__selector.appendChild(v.__field_knob), v.__selector.appendChild(v.__saturation_field), v.__selector.appendChild(v.__hue_field), v.__hue_field.appendChild(v.__hue_knob), v.domElement.appendChild(v.__input), v.domElement.appendChild(v.__selector), v.updateDisplay(), v } return a(t, e), t.prototype.updateDisplay = function() { var e = (0, m["default"])(this.getValue()); if (e !== !1) { var t = !1; g["default"].each(p["default"].COMPONENTS, function(n) { if (!g["default"].isUndefined(e[n]) && !g["default"].isUndefined(this.__color.__state[n]) && e[n] !== this.__color.__state[n]) return t = !0, {} }, this), t && g["default"].extend(this.__color.__state, e) } g["default"].extend(this.__temp.__state, this.__color.__state), this.__temp.a = 1; var n = this.__color.v < .5 || this.__color.s > .5 ? 255 : 0 , o = 255 - n; g["default"].extend(this.__field_knob.style, { marginLeft: 100 * this.__color.s - 7 + "px", marginTop: 100 * (1 - this.__color.v) - 7 + "px", backgroundColor: this.__temp.toHexString(), border: this.__field_knob_border + "rgb(" + n + "," + n + "," + n + ")" }), this.__hue_knob.style.marginTop = 100 * (1 - this.__color.h / 360) + "px", this.__temp.s = 1, this.__temp.v = 1, l(this.__saturation_field, "left", "#fff", this.__temp.toHexString()), this.__input.value = this.__color.toString(), g["default"].extend(this.__input.style, { backgroundColor: this.__color.toHexString(), color: "rgb(" + n + "," + n + "," + n + ")", textShadow: this.__input_textShadow + "rgba(" + o + "," + o + "," + o + ",.7)" }) } , t }(d["default"]) , y = ["-moz-", "-o-", "-webkit-", "-ms-", ""]; t["default"] = v } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t, n) { var o = document.createElement("li"); return t && o.appendChild(t), n ? e.__ul.insertBefore(o, n) : e.__ul.appendChild(o), e.onResize(), o } function r(e, t) { var n = e.__preset_select[e.__preset_select.selectedIndex]; t ? n.innerHTML = n.value + "*" : n.innerHTML = n.value } function a(e, t, n) { if (n.__li = t, n.__gui = e, U["default"].extend(n, { options: function(t) { if (arguments.length > 1) { var o = n.__li.nextElementSibling; return n.remove(), s(e, n.object, n.property, { before: o, factoryArgs: [U["default"].toArray(arguments)] }) } if (U["default"].isArray(t) || U["default"].isObject(t)) { var i = n.__li.nextElementSibling; return n.remove(), s(e, n.object, n.property, { before: i, factoryArgs: [t] }) } }, name: function(e) { return n.__li.firstElementChild.firstElementChild.innerHTML = e, n }, listen: function() { return n.__gui.listen(n), n }, remove: function() { return n.__gui.remove(n), n } }), n instanceof M["default"]) !function() { var e = new B["default"](n.object,n.property,{ min: n.__min, max: n.__max, step: n.__step }); U["default"].each(["updateDisplay", "onChange", "onFinishChange", "step"], function(t) { var o = n[t] , i = e[t]; n[t] = e[t] = function() { var t = Array.prototype.slice.call(arguments); return i.apply(e, t), o.apply(n, t) } }), z["default"].addClass(t, "has-slider"), n.domElement.insertBefore(e.domElement, n.domElement.firstElementChild) }(); else if (n instanceof B["default"]) { var o = function(t) { if (U["default"].isNumber(n.__min) && U["default"].isNumber(n.__max)) { var o = n.__li.firstElementChild.firstElementChild.innerHTML , i = n.__gui.__listening.indexOf(n) > -1; n.remove(); var r = s(e, n.object, n.property, { before: n.__li.nextElementSibling, factoryArgs: [n.__min, n.__max, n.__step] }); return r.name(o), i && r.listen(), r } return t }; n.min = U["default"].compose(o, n.min), n.max = U["default"].compose(o, n.max) } else n instanceof O["default"] ? (z["default"].bind(t, "click", function() { z["default"].fakeEvent(n.__checkbox, "click") }), z["default"].bind(n.__checkbox, "click", function(e) { e.stopPropagation() })) : n instanceof R["default"] ? (z["default"].bind(t, "click", function() { z["default"].fakeEvent(n.__button, "click") }), z["default"].bind(t, "mouseover", function() { z["default"].addClass(n.__button, "hover") }), z["default"].bind(t, "mouseout", function() { z["default"].removeClass(n.__button, "hover") })) : n instanceof j["default"] && (z["default"].addClass(t, "color"), n.updateDisplay = U["default"].compose(function(e) { return t.style.borderLeftColor = n.__color.toString(), e }, n.updateDisplay), n.updateDisplay()); n.setValue = U["default"].compose(function(t) { return e.getRoot().__preset_select && n.isModified() && r(e.getRoot(), !0), t }, n.setValue) } function l(e, t) { var n = e.getRoot() , o = n.__rememberedObjects.indexOf(t.object); if (o !== -1) { var i = n.__rememberedObjectIndecesToControllers[o]; if (void 0 === i && (i = {}, n.__rememberedObjectIndecesToControllers[o] = i), i[t.property] = t, n.load && n.load.remembered) { var r = n.load.remembered , a = void 0; if (r[e.preset]) a = r[e.preset]; else { if (!r[Q]) return; a = r[Q] } if (a[o] && void 0 !== a[o][t.property]) { var l = a[o][t.property]; t.initialValue = l, t.setValue(l) } } } } function s(e, t, n, o) { if (void 0 === t[n]) throw new Error('Object "' + t + '" has no property "' + n + '"'); var r = void 0; if (o.color) r = new j["default"](t,n); else { var s = [t, n].concat(o.factoryArgs); r = C["default"].apply(e, s) } o.before instanceof S["default"] && (o.before = o.before.__li), l(e, r), z["default"].addClass(r.domElement, "c"); var u = document.createElement("span"); z["default"].addClass(u, "property-name"), u.innerHTML = r.property; var d = document.createElement("div"); d.appendChild(u), d.appendChild(r.domElement); var c = i(e, d, o.before); return z["default"].addClass(c, oe.CLASS_CONTROLLER_ROW), r instanceof j["default"] ? z["default"].addClass(c, "color") : z["default"].addClass(c, g(r.getValue())), a(e, c, r), e.__controllers.push(r), r } function u(e, t) { return document.location.href + "." + t } function d(e, t, n) { var o = document.createElement("option"); o.innerHTML = t, o.value = t, e.__preset_select.appendChild(o), n && (e.__preset_select.selectedIndex = e.__preset_select.length - 1) } function c(e, t) { t.style.display = e.useLocalStorage ? "block" : "none" } function f(e) { var t = e.__save_row = document.createElement("li"); z["default"].addClass(e.domElement, "has-save"), e.__ul.insertBefore(t, e.__ul.firstChild), z["default"].addClass(t, "save-row"); var n = document.createElement("span"); n.innerHTML = " ", z["default"].addClass(n, "button gears"); var o = document.createElement("span"); o.innerHTML = "Save", z["default"].addClass(o, "button"), z["default"].addClass(o, "save"); var i = document.createElement("span"); i.innerHTML = "New", z["default"].addClass(i, "button"), z["default"].addClass(i, "save-as"); var r = document.createElement("span"); r.innerHTML = "Revert", z["default"].addClass(r, "button"), z["default"].addClass(r, "revert"); var a = e.__preset_select = document.createElement("select"); e.load && e.load.remembered ? U["default"].each(e.load.remembered, function(t, n) { d(e, n, n === e.preset) }) : d(e, Q, !1), z["default"].bind(a, "change", function() { for (var t = 0; t < e.__preset_select.length; t++) e.__preset_select[t].innerHTML = e.__preset_select[t].value; e.preset = this.value }), t.appendChild(a), t.appendChild(n), t.appendChild(o), t.appendChild(i), t.appendChild(r), q && !function() { var t = document.getElementById("dg-local-explain") , n = document.getElementById("dg-local-storage") , o = document.getElementById("dg-save-locally"); o.style.display = "block", "true" === localStorage.getItem(u(e, "isLocal")) && n.setAttribute("checked", "checked"), c(e, t), z["default"].bind(n, "change", function() { e.useLocalStorage = !e.useLocalStorage, c(e, t) }) }(); var l = document.getElementById("dg-new-constructor"); z["default"].bind(l, "keydown", function(e) { !e.metaKey || 67 !== e.which && 67 !== e.keyCode || Z.hide() }), z["default"].bind(n, "click", function() { l.innerHTML = JSON.stringify(e.getSaveObject(), void 0, 2), Z.show(), l.focus(), l.select() }), z["default"].bind(o, "click", function() { e.save() }), z["default"].bind(i, "click", function() { var t = prompt("Enter a new preset name."); t && e.saveAs(t) }), z["default"].bind(r, "click", function() { e.revert() }) } function _(e) { function t(t) { return t.preventDefault(), e.width += i - t.clientX, e.onResize(), i = t.clientX, !1 } function n() { z["default"].removeClass(e.__closeButton, oe.CLASS_DRAG), z["default"].unbind(window, "mousemove", t), z["default"].unbind(window, "mouseup", n) } function o(o) { return o.preventDefault(), i = o.clientX, z["default"].addClass(e.__closeButton, oe.CLASS_DRAG), z["default"].bind(window, "mousemove", t), z["default"].bind(window, "mouseup", n), !1 } var i = void 0; e.__resize_handle = document.createElement("div"), U["default"].extend(e.__resize_handle.style, { width: "6px", marginLeft: "-3px", height: "200px", cursor: "ew-resize", position: "absolute" }), z["default"].bind(e.__resize_handle, "mousedown", o), z["default"].bind(e.__closeButton, "mousedown", o), e.domElement.insertBefore(e.__resize_handle, e.domElement.firstElementChild) } function p(e, t) { e.domElement.style.width = t + "px", e.__save_row && e.autoPlace && (e.__save_row.style.width = t + "px"), e.__closeButton && (e.__closeButton.style.width = t + "px") } function h(e, t) { var n = {}; return U["default"].each(e.__rememberedObjects, function(o, i) { var r = {} , a = e.__rememberedObjectIndecesToControllers[i]; U["default"].each(a, function(e, n) { r[n] = t ? e.initialValue : e.getValue() }), n[i] = r }), n } function m(e) { for (var t = 0; t < e.__preset_select.length; t++) e.__preset_select[t].value === e.preset && (e.__preset_select.selectedIndex = t) } function b(e) { 0 !== e.length && D["default"].call(window, function() { b(e) }), U["default"].each(e, function(e) { e.updateDisplay() }) } var g = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { return typeof e } : function(e) { return e && "function" == typeof Symbol && e.constructor === Symbol ? "symbol" : typeof e } , v = n(18) , y = o(v) , w = n(19) , x = o(w) , E = n(20) , C = o(E) , A = n(7) , S = o(A) , k = n(8) , O = o(k) , T = n(15) , R = o(T) , L = n(13) , B = o(L) , N = n(14) , M = o(N) , H = n(16) , j = o(H) , P = n(21) , D = o(P) , V = n(22) , F = o(V) , I = n(9) , z = o(I) , G = n(5) , U = o(G) , X = n(23) , K = o(X); y["default"].inject(K["default"]); var Y = "dg" , J = 72 , W = 20 , Q = "Default" , q = function() { try { return "localStorage"in window && null !== window.localStorage } catch (e) { return !1 } }() , Z = void 0 , $ = !0 , ee = void 0 , te = !1 , ne = [] , oe = function ie(e) { function t() { var e = n.getRoot(); e.width += 1, U["default"].defer(function() { e.width -= 1 }) } var n = this , o = e || {}; this.domElement = document.createElement("div"), this.__ul = document.createElement("ul"), this.domElement.appendChild(this.__ul), z["default"].addClass(this.domElement, Y), this.__folders = {}, this.__controllers = [], this.__rememberedObjects = [], this.__rememberedObjectIndecesToControllers = [], this.__listening = [], o = U["default"].defaults(o, { closeOnTop: !1, autoPlace: !0, width: ie.DEFAULT_WIDTH }), o = U["default"].defaults(o, { resizable: o.autoPlace, hideable: o.autoPlace }), U["default"].isUndefined(o.load) ? o.load = { preset: Q } : o.preset && (o.load.preset = o.preset), U["default"].isUndefined(o.parent) && o.hideable && ne.push(this), o.resizable = U["default"].isUndefined(o.parent) && o.resizable, o.autoPlace && U["default"].isUndefined(o.scrollable) && (o.scrollable = !0); var r = q && "true" === localStorage.getItem(u(this, "isLocal")) , a = void 0; if (Object.defineProperties(this, { parent: { get: function() { return o.parent } }, scrollable: { get: function() { return o.scrollable } }, autoPlace: { get: function() { return o.autoPlace } }, closeOnTop: { get: function() { return o.closeOnTop } }, preset: { get: function() { return n.parent ? n.getRoot().preset : o.load.preset }, set: function(e) { n.parent ? n.getRoot().preset = e : o.load.preset = e, m(this), n.revert() } }, width: { get: function() { return o.width }, set: function(e) { o.width = e, p(n, e) } }, name: { get: function() { return o.name }, set: function(e) { o.name = e, titleRowName && (titleRowName.innerHTML = o.name) } }, closed: { get: function() { return o.closed }, set: function(e) { o.closed = e, o.closed ? z["default"].addClass(n.__ul, ie.CLASS_CLOSED) : z["default"].removeClass(n.__ul, ie.CLASS_CLOSED), this.onResize(), n.__closeButton && (n.__closeButton.innerHTML = e ? ie.TEXT_OPEN : ie.TEXT_CLOSED) } }, load: { get: function() { return o.load } }, useLocalStorage: { get: function() { return r }, set: function(e) { q && (r = e, e ? z["default"].bind(window, "unload", a) : z["default"].unbind(window, "unload", a), localStorage.setItem(u(n, "isLocal"), e)) } } }), U["default"].isUndefined(o.parent)) { if (o.closed = !1, z["default"].addClass(this.domElement, ie.CLASS_MAIN), z["default"].makeSelectable(this.domElement, !1), q && r) { n.useLocalStorage = !0; var l = localStorage.getItem(u(this, "gui")); l && (o.load = JSON.parse(l)) } this.__closeButton = document.createElement("div"), this.__closeButton.innerHTML = ie.TEXT_CLOSED, z["default"].addClass(this.__closeButton, ie.CLASS_CLOSE_BUTTON), o.closeOnTop ? (z["default"].addClass(this.__closeButton, ie.CLASS_CLOSE_TOP), this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0])) : (z["default"].addClass(this.__closeButton, ie.CLASS_CLOSE_BOTTOM), this.domElement.appendChild(this.__closeButton)), z["default"].bind(this.__closeButton, "click", function() { n.closed = !n.closed }) } else { void 0 === o.closed && (o.closed = !0); var s = document.createTextNode(o.name); z["default"].addClass(s, "controller-name"); var d = i(n, s) , c = function(e) { return e.preventDefault(), n.closed = !n.closed, !1 }; z["default"].addClass(this.__ul, ie.CLASS_CLOSED), z["default"].addClass(d, "title"), z["default"].bind(d, "click", c), o.closed || (this.closed = !1) } o.autoPlace && (U["default"].isUndefined(o.parent) && ($ && (ee = document.createElement("div"), z["default"].addClass(ee, Y), z["default"].addClass(ee, ie.CLASS_AUTO_PLACE_CONTAINER), document.body.appendChild(ee), $ = !1), ee.appendChild(this.domElement), z["default"].addClass(this.domElement, ie.CLASS_AUTO_PLACE)), this.parent || p(n, o.width)), this.__resizeHandler = function() { n.onResizeDebounced() } , z["default"].bind(window, "resize", this.__resizeHandler), z["default"].bind(this.__ul, "webkitTransitionEnd", this.__resizeHandler), z["default"].bind(this.__ul, "transitionend", this.__resizeHandler), z["default"].bind(this.__ul, "oTransitionEnd", this.__resizeHandler), this.onResize(), o.resizable && _(this), a = function() { q && "true" === localStorage.getItem(u(n, "isLocal")) && localStorage.setItem(u(n, "gui"), JSON.stringify(n.getSaveObject())) } , this.saveToLocalStorageIfPossible = a, o.parent || t() }; oe.toggleHide = function() { te = !te, U["default"].each(ne, function(e) { e.domElement.style.display = te ? "none" : "" }) } , oe.CLASS_AUTO_PLACE = "a", oe.CLASS_AUTO_PLACE_CONTAINER = "ac", oe.CLASS_MAIN = "main", oe.CLASS_CONTROLLER_ROW = "cr", oe.CLASS_TOO_TALL = "taller-than-window", oe.CLASS_CLOSED = "closed", oe.CLASS_CLOSE_BUTTON = "close-button", oe.CLASS_CLOSE_TOP = "close-top", oe.CLASS_CLOSE_BOTTOM = "close-bottom", oe.CLASS_DRAG = "drag", oe.DEFAULT_WIDTH = 245, oe.TEXT_CLOSED = "Close Controls", oe.TEXT_OPEN = "Open Controls", oe._keydownHandler = function(e) { "text" === document.activeElement.type || e.which !== J && e.keyCode !== J || oe.toggleHide() } , z["default"].bind(window, "keydown", oe._keydownHandler, !1), U["default"].extend(oe.prototype, { add: function(e, t) { return s(this, e, t, { factoryArgs: Array.prototype.slice.call(arguments, 2) }) }, addColor: function(e, t) { return s(this, e, t, { color: !0 }) }, remove: function(e) { this.__ul.removeChild(e.__li), this.__controllers.splice(this.__controllers.indexOf(e), 1); var t = this; U["default"].defer(function() { t.onResize() }) }, destroy: function() { this.autoPlace && ee.removeChild(this.domElement), z["default"].unbind(window, "keydown", oe._keydownHandler, !1), z["default"].unbind(window, "resize", this.__resizeHandler), this.saveToLocalStorageIfPossible && z["default"].unbind(window, "unload", this.saveToLocalStorageIfPossible) }, addFolder: function(e) { if (void 0 !== this.__folders[e]) throw new Error('You already have a folder in this GUI by the name "' + e + '"'); var t = { name: e, parent: this }; t.autoPlace = this.autoPlace, this.load && this.load.folders && this.load.folders[e] && (t.closed = this.load.folders[e].closed, t.load = this.load.folders[e]); var n = new oe(t); this.__folders[e] = n; var o = i(this, n.domElement); return z["default"].addClass(o, "folder"), n }, open: function() { this.closed = !1 }, close: function() { this.closed = !0 }, onResize: function() { var e = this.getRoot(); if (e.scrollable) { var t = z["default"].getOffset(e.__ul).top , n = 0; U["default"].each(e.__ul.childNodes, function(t) { e.autoPlace && t === e.__save_row || (n += z["default"].getHeight(t)) }), window.innerHeight - t - W < n ? (z["default"].addClass(e.domElement, oe.CLASS_TOO_TALL), e.__ul.style.height = window.innerHeight - t - W + "px") : (z["default"].removeClass(e.domElement, oe.CLASS_TOO_TALL), e.__ul.style.height = "auto") } e.__resize_handle && U["default"].defer(function() { e.__resize_handle.style.height = e.__ul.offsetHeight + "px" }), e.__closeButton && (e.__closeButton.style.width = e.width + "px") }, onResizeDebounced: U["default"].debounce(function() { this.onResize() }, 50), remember: function() { if (U["default"].isUndefined(Z) && (Z = new F["default"], Z.domElement.innerHTML = x["default"]), this.parent) throw new Error("You can only call remember on a top level GUI."); var e = this; U["default"].each(Array.prototype.slice.call(arguments), function(t) { 0 === e.__rememberedObjects.length && f(e), e.__rememberedObjects.indexOf(t) === -1 && e.__rememberedObjects.push(t) }), this.autoPlace && p(this, this.width) }, getRoot: function() { for (var e = this; e.parent; ) e = e.parent; return e }, getSaveObject: function() { var e = this.load; return e.closed = this.closed, this.__rememberedObjects.length > 0 && (e.preset = this.preset, e.remembered || (e.remembered = {}), e.remembered[this.preset] = h(this)), e.folders = {}, U["default"].each(this.__folders, function(t, n) { e.folders[n] = t.getSaveObject() }), e }, save: function() { this.load.remembered || (this.load.remembered = {}), this.load.remembered[this.preset] = h(this), r(this, !1), this.saveToLocalStorageIfPossible() }, saveAs: function(e) { this.load.remembered || (this.load.remembered = {}, this.load.remembered[Q] = h(this, !0)), this.load.remembered[e] = h(this), this.preset = e, d(this, e, !0), this.saveToLocalStorageIfPossible() }, revert: function(e) { U["default"].each(this.__controllers, function(t) { this.getRoot().load.remembered ? l(e || this.getRoot(), t) : t.setValue(t.initialValue), t.__onFinishChange && t.__onFinishChange.call(t, t.getValue()) }, this), U["default"].each(this.__folders, function(e) { e.revert(e) }), e || r(this.getRoot(), !1) }, listen: function(e) { var t = 0 === this.__listening.length; this.__listening.push(e), t && b(this.__listening) }, updateDisplay: function() { U["default"].each(this.__controllers, function(e) { e.updateDisplay() }), U["default"].each(this.__folders, function(e) { e.updateDisplay() }) } }), e.exports = oe } , function(e, t) { "use strict"; e.exports = { load: function(e, t) { var n = t || document , o = n.createElement("link"); o.type = "text/css", o.rel = "stylesheet", o.href = e, n.getElementsByTagName("head")[0].appendChild(o) }, inject: function(e, t) { var n = t || document , o = document.createElement("style"); o.type = "text/css", o.innerHTML = e; var i = n.getElementsByTagName("head")[0]; try { i.appendChild(o) } catch (r) {} } } } , function(e, t) { e.exports = "
Here's the new load parameter for your GUI's constructor:
Automatically save values to localStorage on exit.
The values saved to localStorage will override those passed to dat.GUI's constructor. This makes it easier to work incrementally, but localStorage is fragile, and your friends may not see the same values you do.
" } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } t.__esModule = !0; var i = n(10) , r = o(i) , a = n(13) , l = o(a) , s = n(14) , u = o(s) , d = n(11) , c = o(d) , f = n(15) , _ = o(f) , p = n(8) , h = o(p) , m = n(5) , b = o(m) , g = function(e, t) { var n = e[t]; return b["default"].isArray(arguments[2]) || b["default"].isObject(arguments[2]) ? new r["default"](e,t,arguments[2]) : b["default"].isNumber(n) ? b["default"].isNumber(arguments[2]) && b["default"].isNumber(arguments[3]) ? b["default"].isNumber(arguments[4]) ? new u["default"](e,t,arguments[2],arguments[3],arguments[4]) : new u["default"](e,t,arguments[2],arguments[3]) : b["default"].isNumber(arguments[4]) ? new l["default"](e,t,{ min: arguments[2], max: arguments[3], step: arguments[4] }) : new l["default"](e,t,{ min: arguments[2], max: arguments[3] }) : b["default"].isString(n) ? new c["default"](e,t) : b["default"].isFunction(n) ? new _["default"](e,t,"") : b["default"].isBoolean(n) ? new h["default"](e,t) : null }; t["default"] = g } , function(e, t) { "use strict"; function n(e) { setTimeout(e, 1e3 / 60) } t.__esModule = !0, t["default"] = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || n } , function(e, t, n) { "use strict"; function o(e) { return e && e.__esModule ? e : { "default": e } } function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } t.__esModule = !0; var r = n(9) , a = o(r) , l = n(5) , s = o(l) , u = function() { function e() { i(this, e), this.backgroundElement = document.createElement("div"), s["default"].extend(this.backgroundElement.style, { backgroundColor: "rgba(0,0,0,0.8)", top: 0, left: 0, display: "none", zIndex: "1000", opacity: 0, WebkitTransition: "opacity 0.2s linear", transition: "opacity 0.2s linear" }), a["default"].makeFullscreen(this.backgroundElement), this.backgroundElement.style.position = "fixed", this.domElement = document.createElement("div"), s["default"].extend(this.domElement.style, { position: "fixed", display: "none", zIndex: "1001", opacity: 0, WebkitTransition: "-webkit-transform 0.2s ease-out, opacity 0.2s linear", transition: "transform 0.2s ease-out, opacity 0.2s linear" }), document.body.appendChild(this.backgroundElement), document.body.appendChild(this.domElement); var t = this; a["default"].bind(this.backgroundElement, "click", function() { t.hide() }) } return e.prototype.show = function() { var e = this; this.backgroundElement.style.display = "block", this.domElement.style.display = "block", this.domElement.style.opacity = 0, this.domElement.style.webkitTransform = "scale(1.1)", this.layout(), s["default"].defer(function() { e.backgroundElement.style.opacity = 1, e.domElement.style.opacity = 1, e.domElement.style.webkitTransform = "scale(1)" }) } , e.prototype.hide = function t() { var e = this , t = function n() { e.domElement.style.display = "none", e.backgroundElement.style.display = "none", a["default"].unbind(e.domElement, "webkitTransitionEnd", n), a["default"].unbind(e.domElement, "transitionend", n), a["default"].unbind(e.domElement, "oTransitionEnd", n) }; a["default"].bind(this.domElement, "webkitTransitionEnd", t), a["default"].bind(this.domElement, "transitionend", t), a["default"].bind(this.domElement, "oTransitionEnd", t), this.backgroundElement.style.opacity = 0, this.domElement.style.opacity = 0, this.domElement.style.webkitTransform = "scale(1.1)" } , e.prototype.layout = function() { this.domElement.style.left = window.innerWidth / 2 - a["default"].getWidth(this.domElement) / 2 + "px", this.domElement.style.top = window.innerHeight / 2 - a["default"].getHeight(this.domElement) / 2 + "px" } , e }(); t["default"] = u } , function(e, t, n) { t = e.exports = n(24)(), t.push([e.id, "canvas{line-height:0;margin-bottom:0;}.nodes-canvas{position:fixed;z-index: -1;left:0;top:0;width:100%;height:100%;}.cache-canvas{background-color:#6622ff;}.main-canvas{opacity:1;}.connection-paths{display:none;position:absolute;top:0;left:50%;height:100%;width:auto;-webkit-transform:translate(-50%);transform:translate(-50%);}.connection-path{stroke:white;stroke-width:2px;fill:none;}.center{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);}.message-text{text-align:center;color:#6622ff;font-size:30vw;font-weight:700;letter-spacing:-0.06em;line-height:0;}.emblem{border-radius:50%;height:35vw;width:35vw;background-color:#32e4b0;}.dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0;display: none;}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1!important}.dg.main .close-button.drag,.dg.main:hover .close-button{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:visible;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid transparent}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.boolean,.dg .cr.boolean *,.dg .cr.function,.dg .cr.function *,.dg .cr.function .property-name{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco,monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px Lucida Grande,sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid hsla(0,0%,100%,.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.boolean:hover,.dg .cr.function:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}", ""]) } , function(e, t) { e.exports = function() { var e = []; return e.toString = function() { for (var e = [], t = 0; t < this.length; t++) { var n = this[t]; n[2] ? e.push("@media " + n[2] + "{" + n[1] + "}") : e.push(n[1]) } return e.join("") } , e.i = function(t, n) { "string" == typeof t && (t = [[null, t, ""]]); for (var o = {}, i = 0; i < this.length; i++) { var r = this[i][0]; "number" == typeof r && (o[r] = !0) } for (i = 0; i < t.length; i++) { var a = t[i]; "number" == typeof a[0] && o[a[0]] || (n && !a[2] ? a[2] = n : n && (a[2] = "(" + a[2] + ") and (" + n + ")"), e.push(a)) } } , e } } ]) }); const cacheCanvas = document.getElementById('cache-canvas'); const canvas = document.getElementById('main-canvas'); const cacheCtx = cacheCanvas.getContext('2d'); const ctx = canvas.getContext('2d'); const __bounds = {}; const __dpr = window.devicePixelRatio || 1; let __nodePaths = []; let __shouldDraw = true; let __isDrawing = false; const EPSILON = 0.0001; const pathFunctions = { spider: function(startX, startY, endX, endY, distance) { return [startX, startY, startX + (Math.random() * 2 - 1) * distance, startY + (Math.random() * 2 - 1) * distance, endX + (Math.random() * 2 - 1) * distance, endY + (Math.random() * 2 - 1) * distance, endX, endY] }, techy: function(startX, startY, endX, endY, distance) { const diffX = endX - startX; const diffY = endY - startY; const angle = Math.atan2(diffY, -diffX) + Math.PI * 1.25; const ret = [startX, startY, , , endX, endY]; if (angle % Math.PI < Math.PI / 2) { if (Math.random() > 0.5) { ret[2] = endX - Math.abs(diffY) * Math.sign(diffX); ret[3] = startY } else { ret[2] = startX + Math.abs(diffY) * Math.sign(diffX); ret[3] = endY } } else { if (Math.random() > 0.5) { ret[2] = startX; ret[3] = endY - Math.abs(diffX) * Math.sign(diffY) } else { ret[2] = endX; ret[3] = startY + Math.abs(diffX) * Math.sign(diffY) } } return ret } }; const spring = { k: -8.5, b: -61 }; const settings = { grid: 100, pathFunction: pathFunctions['techy'] }; const tm = 200; let tv = 0; let tt = 0; let ta = 0; let t = 0.5; function draw() { ctx.clearRect(__bounds.left, __bounds.top, __bounds.width, __bounds.height); let pt0, pt1; ctx.beginPath(); const len = __nodePaths.length; for (let i = 0; i < len; i++) { plotPolyline(__nodePaths[i], clamp(t - 0.1, 0, 0.9999999), clamp(t + 0.1, 0, 0.9999999)) } ctx.stroke(); for (let i = 0; i < len; i++) { const p = __nodePaths[i]; const ptsLen = p.length; ctx.beginPath(); ctx.arc(p[0], p[1], Math.max(0, t * 10), 0, Math.PI * 2); ctx.closePath(); ctx.stroke(); ctx.beginPath(); ctx.arc(p[ptsLen - 2], p[ptsLen - 1], Math.max(0, t * 10), 0, Math.PI * 2); ctx.closePath(); ctx.fill() } } function loop() { requestAnimationFrame(loop); tv = tv + (spring.k * (t - tt) + spring.b * tv) / tm; if (Math.abs(tv) > EPSILON) { t = clamp(t + tv, 0, 0.999999); draw() } } function drawLines() { cacheCtx.clearRect(__bounds.left, __bounds.top, __bounds.width, __bounds.height); cacheCtx.beginPath(); Array.prototype.forEach.call(__nodePaths, function(np) { cacheCtx.moveTo(np[0], np[1]); for (let i = 2, ii = np.length; i < ii; i += 2) { cacheCtx.lineTo(np[i], np[i + 1]) } }); cacheCtx.stroke() } function plotPolyline(polyline, t1=0, t2=0.9999999) { const p0 = lerpPolyline(polyline, t1); ctx.moveTo(p0[0], p0[1]); let pt, elbow; for (let i = 0, ii = polyline.length; i < ii; i += 2) { for (let n = 1, nn = ii / 2; n < nn; n++) { let nt = n / (nn - 1); if (nt > t1 && nt < t2) { elbow = lerpPolyline(polyline, nt); ctx.lineTo(elbow[0], elbow[1]) } else { break } } pt = lerpPolyline(polyline, t2); ctx.lineTo(pt[0], pt[1]) } } function getDoNTimesHandler(fn, n, delay) { return function handler() { fn(arguments); if (n-- > 1) { window.setTimeout(function() { handler(arguments) }, delay) } } } function quantize(n, resolution) { return Math.floor(n / resolution) * resolution } function clamp(n, min, max) { return Math.min(Math.max(n, min), max) } function lerp(x0, y0, x1, y1, t) { return [x0 + (x1 - x0) * t, y0 + (y1 - y0) * t] } function lerpPolyline(polyline, t) { if (t % 1 === 0) return [polyline[t % 1], polyline[t % 1 + 1]]; const n = polyline.length / 2 - 1; const firstPt = t * n | 0; return lerp(polyline[firstPt * 2], polyline[firstPt * 2 + 1], polyline[firstPt * 2 + 2], polyline[firstPt * 2 + 3], t * n - firstPt) } function createNodePaths(n, startX, startY, endX, endY, pathFn, gridSize) { const paths = new Array(n); const dist = Math.sqrt(Math.pow(endY - startY, 2) + Math.pow(endX - startX, 2)) / 2; for (let i = 0; i < n; i++) { paths[i] = pathFn(startX || quantize(Math.random() * __bounds.width, gridSize) + gridSize / 2, startY || quantize(Math.random() * __bounds.height, gridSize) + gridSize / 2, endX || quantize(Math.random() * __bounds.width, gridSize) + gridSize / 2, endY || quantize(Math.random() * __bounds.height, gridSize) + gridSize / 2, dist) } return paths } let tempRect; function handleResize() { tempRect = canvas.getBoundingClientRect(); __bounds.left = tempRect.left; __bounds.top = tempRect.top; __bounds.right = tempRect.right; __bounds.bottom = tempRect.bottom; __bounds.width = tempRect.width; __bounds.height = tempRect.height; canvas.width = __bounds.width; canvas.height = __bounds.height; ctx.lineWidth = 4; ctx.strokeStyle = '#32E4B0'; ctx.fillStyle = '#32E4B0'; cacheCanvas.width = __bounds.width; cacheCanvas.height = __bounds.height; cacheCtx.lineWidth = 2; cacheCtx.strokeStyle = 'rgba(0,0,0,0.2)'; __nodePaths = createNodePaths(Math.floor(__bounds.width * __bounds.height / 50000 * __dpr), null, null, null, null, settings.pathFunction, settings.grid / __dpr); drawLines(); __shouldDraw = true; t = 0; tt = 1 } let __lastX = Math.random() * __bounds.width; let __lastY = Math.random() * __bounds.height; function animateNodes(startX, startY, endX, endY) { __shouldDraw = true; __nodePaths = createNodePaths(Math.floor(__bounds.width * __bounds.height / 50000 * __dpr), startX, startY, null, null, settings.pathFunction, settings.grid / __dpr); drawLines(); __lastX = startX; __lastY = startY; t = 0; tt = 1 } function handleClick(e) { animateNodes(e.pageX, e.pageY) } function handleTouch(e) { const touch = e.touches[0]; animateNodes(touch.pageX, touch.pageY) } function handleTouchMove(e) { const touch = e.touches[0]; tt = touch.pageX / __bounds.width } function handleFunctionChange() { handleResize() } function handlePageLoad() { handleResize(); loop(); const gui = new dat.GUI(); gui.add(spring, 'k', -30, 0).name('springiness'); gui.add(spring, 'b', -100, 0).name('stiffness'); gui.add(settings, 'grid', 0, 200); const n = gui.add(settings, 'pathFunction', pathFunctions); n.__onChange = handleFunctionChange; var h = getDoNTimesHandler(function() { animateNodes() }, 5, 500); h() } function handleMouseMove(e) { tt = e.pageX / __bounds.width } function init() { window.addEventListener('resize', handleResize); document.body.addEventListener('mousedown', handleClick); document.body.addEventListener('touchstart', handleClick); document.body.addEventListener('touchmove', handleTouchMove); document.body.addEventListener('mousemove', handleMouseMove); window.addEventListener('keydown', handleClick); document.addEventListener('DOMContentLoaded', handlePageLoad) } init(); 31