Created
April 6, 2016 08:03
-
-
Save chrisquinnr/ecd5f80a8e4a1eeafa961362b6d4c3f5 to your computer and use it in GitHub Desktop.
Engine behind xkcd 1663
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| !function (t) { | |
| function e(i) { | |
| if (n[i])return n[i].exports; | |
| var o = n[i] = {exports: {}, id: i, loaded: !1}; | |
| return t[i].call(o.exports, o, o.exports, e), o.loaded = !0, o.exports | |
| } | |
| var n = {}; | |
| return e.m = t, e.c = n, e.p = "", e(0) | |
| }([function (t, e, n) { | |
| n(55), n(53), n(52), n(51), n(54), n(50), n(109), n(103); | |
| var i = n(45), o = document.getElementsByTagName("script"), r = o[o.length - 1]; | |
| window.garden = new i({ | |
| name: "garden", | |
| el: document.getElementById("comic"), | |
| width: 740, | |
| height: 462, | |
| title: r.getAttribute("data-title"), | |
| endpoint: r.getAttribute("data-endpoint"), | |
| imgPrefix: r.getAttribute("data-image-endpoint"), | |
| spread: {reload: 60}, | |
| debug: "?debug" === location.search | |
| }).run(), window.addEventListener("keydown", function (t) { | |
| 8 === t.which && t.preventDefault() | |
| }, !1) | |
| }, function (t, e, n) { | |
| var i = n(40)("wks"), o = n(29), r = n(2).Symbol, s = "function" == typeof r; | |
| t.exports = function (t) { | |
| return i[t] || (i[t] = s && r[t] || (s ? r : o)("Symbol." + t)) | |
| } | |
| }, function (t, e) { | |
| var n = t.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); | |
| "number" == typeof __g && (__g = n) | |
| }, function (t, e) { | |
| var n = t.exports = {version: "2.2.1"}; | |
| "number" == typeof __e && (__e = n) | |
| }, function (t, e, n) { | |
| var i = n(10); | |
| t.exports = function (t) { | |
| if (!i(t))throw TypeError(t + " is not an object!"); | |
| return t | |
| } | |
| }, function (t, e, n) { | |
| var i = n(2), o = n(3), r = n(9), s = n(13), a = n(6), c = "prototype", u = function (t, e, n) { | |
| var h, l, d, A, f = t & u.F, p = t & u.G, g = t & u.S, v = t & u.P, m = t & u.B, y = p ? i : g ? i[e] || (i[e] = {}) : (i[e] || {})[c], b = p ? o : o[e] || (o[e] = {}), w = b[c] || (b[c] = {}); | |
| p && (n = e); | |
| for (h in n)l = !f && y && void 0 !== y[h], d = (l ? y : n)[h], A = m && l ? a(d, i) : v && "function" == typeof d ? a(Function.call, d) : d, y && s(y, h, d, t & u.U), b[h] != d && r(b, h, A), v && w[h] != d && (w[h] = d) | |
| }; | |
| i.core = o, u.F = 1, u.G = 2, u.S = 4, u.P = 8, u.B = 16, u.W = 32, u.U = 64, u.R = 128, t.exports = u | |
| }, function (t, e, n) { | |
| var i = n(17); | |
| t.exports = function (t, e, n) { | |
| if (i(t), void 0 === e)return t; | |
| switch (n) { | |
| case 1: | |
| return function (n) { | |
| return t.call(e, n) | |
| }; | |
| case 2: | |
| return function (n, i) { | |
| return t.call(e, n, i) | |
| }; | |
| case 3: | |
| return function (n, i, o) { | |
| return t.call(e, n, i, o) | |
| } | |
| } | |
| return function () { | |
| return t.apply(e, arguments) | |
| } | |
| } | |
| }, function (t, e, n) { | |
| t.exports = !n(14)(function () { | |
| return 7 != Object.defineProperty({}, "a", { | |
| get: function () { | |
| return 7 | |
| } | |
| }).a | |
| }) | |
| }, function (t, e) { | |
| var n = {}.hasOwnProperty; | |
| t.exports = function (t, e) { | |
| return n.call(t, e) | |
| } | |
| }, function (t, e, n) { | |
| var i = n(15), o = n(23); | |
| t.exports = n(7) ? function (t, e, n) { | |
| return i.f(t, e, o(1, n)) | |
| } : function (t, e, n) { | |
| return t[e] = n, t | |
| } | |
| }, function (t, e) { | |
| t.exports = function (t) { | |
| return "object" == typeof t ? null !== t : "function" == typeof t | |
| } | |
| }, function (t, e) { | |
| var n = {}.toString; | |
| t.exports = function (t) { | |
| return n.call(t).slice(8, -1) | |
| } | |
| }, function (t, e) { | |
| t.exports = {} | |
| }, function (t, e, n) { | |
| var i = n(2), o = n(9), r = n(8), s = n(29)("src"), a = "toString", c = Function[a], u = ("" + c).split(a); | |
| n(3).inspectSource = function (t) { | |
| return c.call(t) | |
| }, (t.exports = function (t, e, n, a) { | |
| var c = "function" == typeof n; | |
| c && (r(n, "name") || o(n, "name", e)), t[e] !== n && (c && (r(n, s) || o(n, s, t[e] ? "" + t[e] : u.join(String(e)))), t === i ? t[e] = n : a ? t[e] ? t[e] = n : o(t, e, n) : (delete t[e], o(t, e, n))) | |
| })(Function.prototype, a, function () { | |
| return "function" == typeof this && this[s] || c.call(this) | |
| }) | |
| }, function (t, e) { | |
| t.exports = function (t) { | |
| try { | |
| return !!t() | |
| } catch (e) { | |
| return !0 | |
| } | |
| } | |
| }, function (t, e, n) { | |
| var i = n(4), o = n(35), r = n(43), s = Object.defineProperty; | |
| e.f = n(7) ? Object.defineProperty : function (t, e, n) { | |
| if (i(t), e = r(e, !0), i(n), o)try { | |
| return s(t, e, n) | |
| } catch (a) { | |
| } | |
| if ("get" in n || "set" in n)throw TypeError("Accessors not supported!"); | |
| return "value" in n && (t[e] = n.value), t | |
| } | |
| }, function (t, e, n) { | |
| var i = n(22), o = n(20); | |
| t.exports = function (t) { | |
| return i(o(t)) | |
| } | |
| }, function (t, e) { | |
| t.exports = function (t) { | |
| if ("function" != typeof t)throw TypeError(t + " is not a function!"); | |
| return t | |
| } | |
| }, function (t, e, n) { | |
| var i = n(6), o = n(22), r = n(28), s = n(27), a = n(58); | |
| t.exports = function (t, e) { | |
| var n = 1 == t, c = 2 == t, u = 3 == t, h = 4 == t, l = 6 == t, d = 5 == t || l, A = e || a; | |
| return function (e, a, f) { | |
| for (var p, g, v = r(e), m = o(v), y = i(a, f, 3), b = s(m.length), w = 0, x = n ? A(e, b) : c ? A(e, 0) : void 0; b > w; w++)if ((d || w in m) && (p = m[w], g = y(p, w, v), t))if (n)x[w] = g; else if (g)switch (t) { | |
| case 3: | |
| return !0; | |
| case 5: | |
| return p; | |
| case 6: | |
| return w; | |
| case 2: | |
| x.push(p) | |
| } else if (h)return !1; | |
| return l ? -1 : u || h ? h : x | |
| } | |
| } | |
| }, function (t, e, n) { | |
| var i = n(11), o = n(1)("toStringTag"), r = "Arguments" == i(function () { | |
| return arguments | |
| }()), s = function (t, e) { | |
| try { | |
| return t[e] | |
| } catch (n) { | |
| } | |
| }; | |
| t.exports = function (t) { | |
| var e, n, a; | |
| return void 0 === t ? "Undefined" : null === t ? "Null" : "string" == typeof(n = s(e = Object(t), o)) ? n : r ? i(e) : "Object" == (a = i(e)) && "function" == typeof e.callee ? "Arguments" : a | |
| } | |
| }, function (t, e) { | |
| t.exports = function (t) { | |
| if (void 0 == t)throw TypeError("Can't call method on " + t); | |
| return t | |
| } | |
| }, function (t, e, n) { | |
| var i = n(10), o = n(2).document, r = i(o) && i(o.createElement); | |
| t.exports = function (t) { | |
| return r ? o.createElement(t) : {} | |
| } | |
| }, function (t, e, n) { | |
| var i = n(11); | |
| t.exports = Object("z").propertyIsEnumerable(0) ? Object : function (t) { | |
| return "String" == i(t) ? t.split("") : Object(t) | |
| } | |
| }, function (t, e) { | |
| t.exports = function (t, e) { | |
| return {enumerable: !(1 & t), configurable: !(2 & t), writable: !(4 & t), value: e} | |
| } | |
| }, function (t, e, n) { | |
| var i = n(15).f, o = n(8), r = n(1)("toStringTag"); | |
| t.exports = function (t, e, n) { | |
| t && !o(t = n ? t : t.prototype, r) && i(t, r, {configurable: !0, value: e}) | |
| } | |
| }, function (t, e, n) { | |
| var i = n(40)("keys"), o = n(29); | |
| t.exports = function (t) { | |
| return i[t] || (i[t] = o(t)) | |
| } | |
| }, function (t, e) { | |
| var n = Math.ceil, i = Math.floor; | |
| t.exports = function (t) { | |
| return isNaN(t = +t) ? 0 : (t > 0 ? i : n)(t) | |
| } | |
| }, function (t, e, n) { | |
| var i = n(26), o = Math.min; | |
| t.exports = function (t) { | |
| return t > 0 ? o(i(t), 9007199254740991) : 0 | |
| } | |
| }, function (t, e, n) { | |
| var i = n(20); | |
| t.exports = function (t) { | |
| return Object(i(t)) | |
| } | |
| }, function (t, e) { | |
| var n = 0, i = Math.random(); | |
| t.exports = function (t) { | |
| return "Symbol(".concat(void 0 === t ? "" : t, ")_", (++n + i).toString(36)) | |
| } | |
| }, function (t, e) { | |
| t.exports = function n(t, e) { | |
| function i() { | |
| for (var i = 0; i < t.children.length; i++)n(t.children[i], e) | |
| } | |
| t && e(t.node, i) | |
| } | |
| }, function (t, e) { | |
| function n(t, e, n) { | |
| return n > e ? e > t ? e : t > n ? n : t : n > t ? n : t > e ? e : t | |
| } | |
| t.exports = n | |
| }, function (t, e, n) { | |
| var i = n(1)("unscopables"), o = Array.prototype; | |
| void 0 == o[i] && n(9)(o, i, {}), t.exports = function (t) { | |
| o[i][t] = !0 | |
| } | |
| }, function (t, e) { | |
| t.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",") | |
| }, function (t, e, n) { | |
| t.exports = n(2).document && document.documentElement | |
| }, function (t, e, n) { | |
| t.exports = !n(7) && !n(14)(function () { | |
| return 7 != Object.defineProperty(n(21)("div"), "a", { | |
| get: function () { | |
| return 7 | |
| } | |
| }).a | |
| }) | |
| }, function (t, e, n) { | |
| "use strict"; | |
| var i = n(37), o = n(5), r = n(13), s = n(9), a = n(8), c = n(12), u = n(64), h = n(24), l = n(73), d = n(1)("iterator"), A = !([].keys && "next" in [].keys()), f = "@@iterator", p = "keys", g = "values", v = function () { | |
| return this | |
| }; | |
| t.exports = function (t, e, n, m, y, b, w) { | |
| u(n, e, m); | |
| var x, E, C, D = function (t) { | |
| if (!A && t in O)return O[t]; | |
| switch (t) { | |
| case p: | |
| return function () { | |
| return new n(this, t) | |
| }; | |
| case g: | |
| return function () { | |
| return new n(this, t) | |
| } | |
| } | |
| return function () { | |
| return new n(this, t) | |
| } | |
| }, M = e + " Iterator", S = y == g, R = !1, O = t.prototype, k = O[d] || O[f] || y && O[y], N = k || D(y), T = y ? S ? D("entries") : N : void 0, L = "Array" == e ? O.entries || k : k; | |
| if (L && (C = l(L.call(new t)), C !== Object.prototype && (h(C, M, !0), i || a(C, d) || s(C, d, v))), S && k && k.name !== g && (R = !0, N = function () { | |
| return k.call(this) | |
| }), i && !w || !A && !R && O[d] || s(O, d, N), c[e] = N, c[M] = v, y)if (x = { | |
| values: S ? N : D(g), | |
| keys: b ? N : D(p), | |
| entries: T | |
| }, w)for (E in x)E in O || r(O, E, x[E]); else o(o.P + o.F * (A || R), e, x); | |
| return x | |
| } | |
| }, function (t, e) { | |
| t.exports = !1 | |
| }, function (t, e, n) { | |
| var i = n(74), o = n(33); | |
| t.exports = Object.keys || function (t) { | |
| return i(t, o) | |
| } | |
| }, function (t, e) { | |
| e.f = {}.propertyIsEnumerable | |
| }, function (t, e, n) { | |
| var i = n(2), o = "__core-js_shared__", r = i[o] || (i[o] = {}); | |
| t.exports = function (t) { | |
| return r[t] || (r[t] = {}) | |
| } | |
| }, function (t, e, n) { | |
| var i = n(14); | |
| t.exports = function (t, e) { | |
| return !!t && i(function () { | |
| e ? t.call(null, function () { | |
| }, 1) : t.call(null) | |
| }) | |
| } | |
| }, function (t, e, n) { | |
| var i, o, r, s = n(6), a = n(60), c = n(34), u = n(21), h = n(2), l = h.process, d = h.setImmediate, A = h.clearImmediate, f = h.MessageChannel, p = 0, g = {}, v = "onreadystatechange", m = function () { | |
| var t = +this; | |
| if (g.hasOwnProperty(t)) { | |
| var e = g[t]; | |
| delete g[t], e() | |
| } | |
| }, y = function (t) { | |
| m.call(t.data) | |
| }; | |
| d && A || (d = function (t) { | |
| for (var e = [], n = 1; arguments.length > n;)e.push(arguments[n++]); | |
| return g[++p] = function () { | |
| a("function" == typeof t ? t : Function(t), e) | |
| }, i(p), p | |
| }, A = function (t) { | |
| delete g[t] | |
| }, "process" == n(11)(l) ? i = function (t) { | |
| l.nextTick(s(m, t, 1)) | |
| } : f ? (o = new f, r = o.port2, o.port1.onmessage = y, i = s(r.postMessage, r, 1)) : h.addEventListener && "function" == typeof postMessage && !h.importScripts ? (i = function (t) { | |
| h.postMessage(t + "", "*") | |
| }, h.addEventListener("message", y, !1)) : i = v in u("script") ? function (t) { | |
| c.appendChild(u("script"))[v] = function () { | |
| c.removeChild(this), m.call(t) | |
| } | |
| } : function (t) { | |
| setTimeout(s(m, t, 1), 0) | |
| }), t.exports = {set: d, clear: A} | |
| }, function (t, e, n) { | |
| var i = n(10); | |
| t.exports = function (t, e) { | |
| if (!i(t))return t; | |
| var n, o; | |
| if (e && "function" == typeof(n = t.toString) && !i(o = n.call(t)))return o; | |
| if ("function" == typeof(n = t.valueOf) && !i(o = n.call(t)))return o; | |
| if (!e && "function" == typeof(n = t.toString) && !i(o = n.call(t)))return o; | |
| throw TypeError("Can't convert object to primitive value") | |
| } | |
| }, function (t, e, n) { | |
| function i(t) { | |
| return t === p || t === g | |
| } | |
| function o(t) { | |
| return y.test(t) | |
| } | |
| var r = n(97), s = 0, a = 1, c = 2, u = 3, h = 4, l = 5, d = 6, A = 7, f = 8, p = 9, g = 10, v = 11, m = 12; | |
| t.exports = function (t, e) { | |
| function n(t) { | |
| return "function" == typeof t ? t : "string" == typeof t ? t : t && "object" == typeof t ? t : y("", t) | |
| } | |
| t = r(t), e || (e = {}); | |
| var y = e.concat || function (t, e) { | |
| return String(t) + String(e) | |
| }; | |
| return function (e) { | |
| function r(t) { | |
| var e = []; | |
| b === A && (b = h); | |
| for (var n = 0; n < t.length; n++) { | |
| var o = t.charAt(n); | |
| b === a && "<" === o ? (w.length && e.push([a, w]), w = "", b = c) : ">" !== o || i(b) ? b === a ? w += o : b === c && /\s/.test(o) ? (e.push([c, w]), w = "", b = h) : b === c ? w += o : b === h && /[\w-]/.test(o) ? (b = l, w = o) : b === h && /\s/.test(o) ? (w.length && e.push([l, w]), e.push([m])) : b === l && /\s/.test(o) ? (e.push([l, w]), w = "", b = d) : b === l && "=" === o ? (e.push([l, w], [v]), w = "", b = A) : b === l ? w += o : b !== d && b !== h || "=" !== o ? b !== d && b !== h || /\s/.test(o) ? b === A && '"' === o ? b = g : b === A && "'" === o ? b = p : b === g && '"' === o ? (e.push([f, w], [m]), w = "", b = h) : b === p && "'" === o ? (e.push([f, w], [m]), w = "", b = h) : b !== A || /\s/.test(o) ? b === f && /\s/.test(o) ? (e.push([m], [f, w]), w = "", b = h) : b !== f && b !== p && b !== g || (w += o) : (b = f, n--) : (e.push([m]), /[\w-]/.test(o) ? (w += o, b = l) : b = h) : (e.push([v]), b = A) : (b === c ? e.push([c, w]) : b === l ? e.push([l, w]) : b === f && w.length && e.push([f, w]), e.push([u]), w = "", b = a) | |
| } | |
| return b === a && w.length ? (e.push([a, w]), w = "") : b === f && w.length ? (e.push([f, w]), w = "") : b === g && w.length ? (e.push([f, w]), w = "") : b === p && w.length ? (e.push([f, w]), w = "") : b === l && (e.push([l, w]), w = ""), e | |
| } | |
| for (var b = a, w = "", x = arguments.length, E = [], C = 0; C < e.length; C++)if (x - 1 > C) { | |
| var D = arguments[C + 1], M = r(e[C]), S = b; | |
| S === g && (S = f), S === p && (S = f), S === A && (S = f), S === h && (S = l), M.push([s, S, D]), E.push.apply(E, M) | |
| } else E.push.apply(E, r(e[C])); | |
| for (var R = [null, {}, []], O = [[R, -1]], C = 0; C < E.length; C++) { | |
| var k = O[O.length - 1][0], M = E[C], N = M[0]; | |
| if (N === c && /^\//.test(M[1])) { | |
| var T = O[O.length - 1][1]; | |
| O.length > 1 && (O.pop(), O[O.length - 1][0][2][T] = t(k[0], k[1], k[2].length ? k[2] : void 0)) | |
| } else if (N === c) { | |
| var L = [M[1], {}, []]; | |
| k[2].push(L), O.push([L, k[2].length - 1]) | |
| } else if (N === l || N === s && M[1] === l) { | |
| for (var I, U = ""; C < E.length; C++)if (E[C][0] === l)U = y(U, E[C][1]); else { | |
| if (E[C][0] !== s || E[C][1] !== l)break; | |
| if ("object" != typeof E[C][2] || U)U = y(U, E[C][2]); else for (I in E[C][2])E[C][2].hasOwnProperty(I) && !k[1][I] && (k[1][I] = E[C][2][I]) | |
| } | |
| E[C][0] === v && C++; | |
| for (var B = C; C < E.length; C++)if (E[C][0] === f || E[C][0] === l)k[1][U] ? k[1][U] = y(k[1][U], E[C][1]) : k[1][U] = n(E[C][1]); else { | |
| if (E[C][0] !== s || E[C][1] !== f && E[C][1] !== l) { | |
| !U.length || k[1][U] || C !== B || E[C][0] !== u && E[C][0] !== m || (k[1][U] = U.toLowerCase()); | |
| break | |
| } | |
| k[1][U] ? k[1][U] = y(k[1][U], E[C][2]) : k[1][U] = n(E[C][2]) | |
| } | |
| } else if (N === l)k[1][M[1]] = !0; else if (N === s && M[1] === l)k[1][M[2]] = !0; else if (N === u) { | |
| if (o(k[0]) && O.length) { | |
| var T = O[O.length - 1][1]; | |
| O.pop(), O[O.length - 1][0][2][T] = t(k[0], k[1], k[2].length ? k[2] : void 0) | |
| } | |
| } else if (N === s && M[1] === a)void 0 === M[2] || null === M[2] ? M[2] = "" : M[2] || (M[2] = y("", M[2])), Array.isArray(M[2][0]) ? k[2].push.apply(k[2], M[2]) : k[2].push(M[2]); else if (N === a)k[2].push(M[1]); else if (N !== v && N !== m)throw new Error("unhandled: " + N) | |
| } | |
| if (R[2].length > 1 && /^\s*$/.test(R[2][0]) && R[2].shift(), R[2].length > 2 || 2 === R[2].length && /\S/.test(R[2][1]))throw new Error("multiple root elements must be wrapped in an enclosing tag"); | |
| return Array.isArray(R[2][0]) && "string" == typeof R[2][0][0] && Array.isArray(R[2][0][2]) && (R[2][0] = t(R[2][0][0], R[2][0][1], R[2][0][2])), R[2][0] | |
| } | |
| }; | |
| var y = (Object.prototype.hasOwnProperty, RegExp("^(" + ["area", "base", "basefont", "bgsound", "br", "col", "command", "embed", "frame", "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source", "track", "wbr", "animate", "animateTransform", "circle", "cursor", "desc", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "font-face-format", "font-face-name", "font-face-uri", "glyph", "glyphRef", "hkern", "image", "line", "missing-glyph", "mpath", "path", "polygon", "polyline", "rect", "set", "stop", "tref", "use", "view", "vkern"].join("|") + ")(?:[.#][a-zA-Z0-9-ï¿¿_:-]+)*$")) | |
| }, function (t, e, n) { | |
| n(99); | |
| var i = n(47), o = n(30), r = n(48), s = function (t) { | |
| this.opts = t, this.data = null, this.gardenId = null, this.gardenKey = null, this.dirtyLights = {}, this.inFlightRequests = 0 | |
| }; | |
| s.prototype = { | |
| record: function (t, e) { | |
| (new Image).src = "http://xkcd.com/events.gif?re=" + t + "&ev=" + e | |
| }, log: function () { | |
| this.opts.debug && console.log.apply(console, arguments) | |
| }, _url: function () { | |
| var t = this.opts.endpoint + "run"; | |
| return this.gardenId && (t += "/" + this.gardenId), t | |
| }, _connect: function () { | |
| var t = this._url(); | |
| this.source = new EventSource(t), this.log("connecting to event source:", t), this.source.addEventListener("open", this.onConnect.bind(this), !1), this.source.addEventListener("error", this.onConnectionError.bind(this), !1), this.source.addEventListener("linden-key", this.onLindenKey.bind(this), !1), this.source.addEventListener("linden", this.onLindenUpdate.bind(this), !1), this.source.addEventListener("reload", this.onReload.bind(this), !1) | |
| }, run: function () { | |
| try { | |
| this.opts.endpoint && (location.hash && (this.gardenId = location.hash.substr(1), this.gardenKey = localStorage["key-" + this.gardenId]), this._connect()), this.linden = new i({ | |
| el: this.opts.el, | |
| width: this.opts.width, | |
| height: this.opts.height, | |
| title: this.opts.title, | |
| urlPrefix: this.opts.imgPrefix, | |
| loading: !0, | |
| readOnly: !this.gardenKey, | |
| debug: this.opts.debug, | |
| onLightChanging: this.handleLightChanging.bind(this), | |
| onSetLight: this.handleSetLight.bind(this), | |
| onRemoveLight: this.handleRemoveLight.bind(this), | |
| onPruneNode: this.handlePruneNode.bind(this) | |
| }), this.opts.data && this.linden.update(this.opts.data), r(this.linden) | |
| } catch (t) { | |
| throw this.record(this.opts.name, "js_error"), t | |
| } | |
| return this | |
| }, onConnect: function () { | |
| this.record(this.opts.name, "connect_start"), this.linden.renderUI() | |
| }, onConnectionError: function (t) { | |
| this.log("connection error", t), this.record(this.opts.name, "connect_error"), this.linden.opts.loading = !0, this.linden.resetTree(), this.linden.renderUI(), this.source.url !== this._url() && (this.source.close(), this._connect()) | |
| }, onLindenKey: function (t) { | |
| this.log("linden key from EventSource", t); | |
| var e = JSON.parse(t.data); | |
| this.gardenId = location.hash = e.garden, this.gardenKey = localStorage["key-" + e.garden] = e.key, this.linden.opts.readOnly = !1, this.linden.renderUI() | |
| }, _acceptUpdate: function () { | |
| if (this.inFlightRequests > 0)return this.log("rejecting update, inflight:", this.inFlightRequests), !1; | |
| for (var t in this.dirtyLights)if (this.dirtyLights.hasOwnProperty(t) && this.dirtyLights[t] === !0)return this.log("rejecting update, dirty light:", t), !1; | |
| return !0 | |
| }, _update: function (t) { | |
| this._acceptUpdate() && (this.data = t, this.linden.update(t)) | |
| }, onLindenUpdate: function (t) { | |
| this.log("linden from EventSource", t), this._update(JSON.parse(t.data)) | |
| }, onReload: function () { | |
| var t = Math.round(Math.random() * this.opts.spread.reload); | |
| this.log("reloading in", t + 5, "seconds"), setTimeout(function () { | |
| this.record(this.opts.name, "reloading"), setTimeout(function () { | |
| location.reload() | |
| }, 5e3) | |
| }, 1e3 * t) | |
| }, request: function (t, e) { | |
| var n = function () { | |
| this.inFlightRequests--, this.log("inflight--", this.inFlightRequests) | |
| }.bind(this), i = {method: "POST"}; | |
| Object.assign(i, e), i.body = JSON.stringify(e.body), this.log("request", t, i); | |
| var o = fetch(t, i); | |
| return o.then(n, n), this.inFlightRequests++, this.log("inflight++", this.inFlightRequests), o | |
| }, handleLightChanging: function (t) { | |
| this.dirtyLights[t] = !0 | |
| }, handleSetLight: function (t, e) { | |
| this.log("set light:", t, e), this.request(this.opts.endpoint + "edit", { | |
| body: Object.assign({ | |
| tag: "EditLight", | |
| garden: this.data.garden, | |
| editKey: this.gardenKey, | |
| light: t | |
| }, e) | |
| }).then(function (t) { | |
| return t.json() | |
| }).then(function (t) { | |
| this._update(Object.assign({}, this.data, {lights: t})) | |
| }.bind(this)), delete this.dirtyLights[t] | |
| }, _sendRemove: function (t) { | |
| this.request(this.opts.endpoint + "edit", { | |
| body: { | |
| tag: "Del", | |
| garden: this.data.garden, | |
| editKey: this.gardenKey, | |
| node: t | |
| } | |
| }) | |
| }, handleRemoveLight: function (t) { | |
| this.log("remove light:", t); | |
| var e = this.data.lights.filter(function (e) { | |
| return e.id !== t | |
| }); | |
| this._update(Object.assign({}, this.data, {lights: e})), this._sendRemove(t) | |
| }, handlePruneNode: function (t) { | |
| this.log("prune node:", t); | |
| var e = {children: []}, n = e; | |
| o(this.data.tree, function (e, i) { | |
| var o = n; | |
| n = {node: e, children: []}, e.id !== t && o.children.push(n), i(), n = o | |
| }), this._update(Object.assign({}, this.data, {tree: e.children[0]})), this._sendRemove(t) | |
| } | |
| }, t.exports = s | |
| }, function (t, e) { | |
| function n() { | |
| this.imgs = {}, this.callbacks = {} | |
| } | |
| n.prototype = { | |
| get: function (t, e) { | |
| var n = this.imgs[t]; | |
| void 0 === n ? (this.imgs[t] = !0, this.callbacks[t] = [e], n = new Image, n.onload = this._onDone.bind(this, t, n, n), n.onerror = this._onDone.bind(this, t, n, !1), n.crossOrigin = "anonymous", n.src = t) : n === !0 ? this.callbacks[t].push(e) : e && e(t, n) | |
| }, _onDone: function (t, e, n) { | |
| this.imgs[t] = n; | |
| for (var i = 0; i < this.callbacks[t].length; i++) { | |
| var o = this.callbacks[t][i]; | |
| o && o(t, n) | |
| } | |
| delete this.callbacks[t] | |
| }, getAll: function (t, e) { | |
| function n(t, n) { | |
| o[t] = n, i--, 0 === i && e(o) | |
| } | |
| if (!t.length)return void e([]); | |
| for (var i = t.length, o = {}, r = 0; r < t.length; r++)this.get(t[r], n) | |
| } | |
| }, t.exports = n | |
| }, function (t, e, n) { | |
| function i(t, e) { | |
| return Object.freeze(Object.defineProperties(t, {raw: {value: Object.freeze(e)}})) | |
| } | |
| function o(t) { | |
| return Math.sin(t * O) | |
| } | |
| function r(t) { | |
| return Math.cos(t * O) | |
| } | |
| function s(t, e) { | |
| return (t % e + e) % e | |
| } | |
| function a(t, e, n, i, a, c, u) { | |
| var h, l, d, A, f = s(t, 360); | |
| 90 >= f ? (h = i, l = u, d = c, A = a) : 180 >= f ? (h = c, l = a, d = i, A = u) : 270 >= f ? (h = c, l = u, d = i, A = a) : (h = i, l = u, d = c, A = a), h -= e, l -= n, d -= e, A -= n; | |
| var p = { | |
| x1: e + h * r(f) - l * o(f), | |
| y1: n + h * o(f) + l * r(f), | |
| x2: e + d * r(f) - A * o(f), | |
| y2: n + d * o(f) + A * r(f) | |
| }; | |
| if (p.x2 < p.x1) { | |
| var g = p.x2; | |
| p.x2 = p.x1, p.x1 = g | |
| } | |
| if (p.y2 < p.y1) { | |
| var v = p.y2; | |
| p.y2 = p.y1, p.y1 = v | |
| } | |
| return p | |
| } | |
| function c(t, e, n, i) { | |
| return "rgba(" + 100 * t + "%, " + 100 * e + "%, " + 100 * n + "%, " + i + ")" | |
| } | |
| function u(t) { | |
| return .32 > t ? [1, .5 + .5 * t / .32, .5] : .64 > t ? [1, 1, .5 + .5 * (t - .32) / .32] : [.75 + .25 * (1 - t) / .36, .75 + .25 * (1 - t) / .36, 1] | |
| } | |
| function h(t, e, n) { | |
| var i = {x2: 0, y2: 0, scale: 1, angle: 0}; | |
| M(t, function (t, s) { | |
| var a = e[t.id], c = t.cache; | |
| c || (c = t.cache = {}), c.scale = i.scale * t.scale, c.angle = i.angle + a.angle; | |
| var u = t.attach[0] - t.root[0], h = t.attach[1] - t.root[1]; | |
| c.x1 = i.x2, c.y1 = i.y2, c.x2 = c.x1 + c.scale * (u * r(c.angle) + h * o(c.angle)), c.y2 = c.y1 + c.scale * (-u * o(c.angle) + h * r(c.angle)); | |
| var l = i; | |
| i = c, n(t, s), i = l | |
| }) | |
| } | |
| function l(t) { | |
| var e = t.cache, n = e.x1 - t.root[0], i = e.y1 - t.root[1]; | |
| return a(-e.angle, n + t.root[0], i + t.root[1], n, i, n + e.scale * e.width, i + e.scale * e.height) | |
| } | |
| function d(t, e, n, i) { | |
| function s(t, n) { | |
| return e[t.id][n] | |
| } | |
| var a = i.width, d = i.height, A = i.debug, f = i.urlPrefix, p = "", g = i.imgCache, v = i.el.getContext("2d"), m = Number(i.el.getAttribute("data-density")); | |
| m > 1 && (p = "2x-"); | |
| var y = []; | |
| M(t, function (t, e) { | |
| t.img && y.push(f + p + t.img), e() | |
| }), g.getAll(y, function (g) { | |
| function y(t) { | |
| for (var e = 0; e < n.length; e++) { | |
| var i = n[e]; | |
| x.save(), x.beginPath(), x.moveTo(i.pos[0], i.pos[1]); | |
| var s = i.pos[0] + E * r(i.pointAngle - i.beamAngle / 2), a = i.pos[1] + E * o(i.pointAngle - i.beamAngle / 2); | |
| x.lineTo(s, a), x.arc(i.pos[0], i.pos[1], E, (i.pointAngle - i.beamAngle / 2) * O, (i.pointAngle + i.beamAngle / 2) * O), x.lineTo(i.pos[0], i.pos[1]), t(i), x.restore() | |
| } | |
| } | |
| v.save(), v.scale(m, -m), v.translate(0, -d), v.clearRect(0, 0, a, d); | |
| var b; | |
| h(t, e, function (t, n) { | |
| var i = t.cache; | |
| if (v.save(), v.rotate(s(t, "angle") * -O), v.scale(t.scale, t.scale), e._selected && (t.id === e._selected.id && (v.globalAlpha = .5), t.id === e._selected.circled && (b = t)), t.img) { | |
| var o = f + p + t.img, r = g[o]; | |
| r && (v.save(), v.scale(1 / m, -1 / m), v.translate(0, -r.height), v.drawImage(r, -t.root[0] * m, t.root[1] * m), v.restore(), i.width = r.width / m, i.height = r.height / m) | |
| } | |
| v.translate(t.attach[0] - t.root[0], t.attach[1] - t.root[1]), n(), v.restore() | |
| }); | |
| var w = document.createElement("canvas"); | |
| w.width = i.el.width, w.height = i.el.height; | |
| var x = w.getContext("2d"); | |
| x.scale(m, m); | |
| var E = Math.sqrt(Math.pow(a, 2) + Math.pow(d, 2)); | |
| if (y(function (t) { | |
| var e = x.createRadialGradient(t.pos[0], t.pos[1], 0, t.pos[0], t.pos[1], E), n = u(t.temp); | |
| e.addColorStop(0, c(n[0], n[1], n[2], 1)), e.addColorStop(1, c(n[0], n[1], n[2], 0)), x.fillStyle = e, x.globalCompositeOperation = "lighten", x.fill() | |
| }), y(function (t) { | |
| x.globalAlpha = .4, x.strokeStyle = "black", x.stroke() | |
| }), v.save(), v.scale(1 / m, 1 / m), v.globalCompositeOperation = "source-atop", v.globalAlpha = .65, v.drawImage(w, 0, 0), v.globalAlpha = .25, v.globalCompositeOperation = "destination-over", v.drawImage(w, 0, 0), v.restore(), b) { | |
| b.cache; | |
| v.save(), v.beginPath(); | |
| var C = l(b), D = C.x1 + (C.x2 - C.x1) / 2, S = C.y1 + (C.y2 - C.y1) / 2, k = Math.sqrt(Math.pow(C.x2 - C.x1, 2) + Math.pow(C.y2 - C.y1, 2)); | |
| v.arc(D, S, k / 2 + 6, 0, R), v.strokeStyle = "red", v.lineWidth = 2, v.globalAlpha = .9, v.stroke(), v.restore() | |
| } | |
| A && M(t, function (t, e) { | |
| v.save(); | |
| var n = t.cache; | |
| if (v.beginPath(), v.globalAlpha = .75, v.moveTo(n.x1, n.y1), v.lineTo(n.x2, n.y2), v.strokeStyle = t.proxyFor ? "lightgreen" : "magenta", v.lineWidth = 1, v.stroke(), e(), v.restore(), n.width) { | |
| var i = l(t); | |
| v.beginPath(), v.rect(i.x1, i.y1, i.x2 - i.x1, i.y2 - i.y1), v.strokeStyle = "red", v.stroke() | |
| } | |
| }), v.restore(), i.onFinish && i.onFinish() | |
| }) | |
| } | |
| function A(t) { | |
| this.el = t.el, this.opts = t, this.imgCache = new D, this._queued = !1, this._rendering = !1, this._afterNextRender = null, this.resetTree(), this.renderUI() | |
| } | |
| var f = i(["<div\n className=", "\n style=", "\n onMouseDown=", "\n />"], ["<div\n className=", "\n style=", "\n onMouseDown=", "\n />"]), p = i(["\n <div>\n <div style=", '>\n <Handle\n className="rotate"\n disabled=', "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n <div style=", '>\n <Handle\n className="color"\n style=', "\n disabled=", "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n </div>\n "], ["\n <div>\n <div style=", '>\n <Handle\n className="rotate"\n disabled=', "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n <div style=", '>\n <Handle\n className="color"\n style=', "\n disabled=", "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n </div>\n "]), g = i(["\n <div\n className=", "\n style=", "\n data-light-id=", '\n >\n <div>\n <Handle\n className="position"\n disabled=', "\n onGrab=", "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n ", "\n </div>\n "], ["\n <div\n className=", "\n style=", "\n data-light-id=", '\n >\n <div>\n <Handle\n className="position"\n disabled=', "\n onGrab=", "\n onDrag=", "\n onRelease=", "\n ></Handle>\n </div>\n ", "\n </div>\n "]), v = i(['\n <div className="tools">\n <button\n className="add-light"\n disabled=', '\n title="Create new light"\n onClick=', '\n >+</button>\n <button\n className="remove"\n disabled=', '\n title="Remove selected (delete key)"\n onClick=', "\n >x</button>\n </div>\n "], ['\n <div className="tools">\n <button\n className="add-light"\n disabled=', '\n title="Create new light"\n onClick=', '\n >+</button>\n <button\n className="remove"\n disabled=', '\n title="Remove selected (delete key)"\n onClick=', "\n >x</button>\n </div>\n "]), m = i(["\n <div\n onMouseDown=", "\n onKeyDown=", "\n style=", "\n className=", "\n title=", '\n tabIndex="1"\n >\n ', "\n ", '\n <div className="content">\n <canvas\n data-density=', "\n width=", "\n height=", "\n style=", "\n onMouseDown=", "\n ></canvas>\n ", "\n </div>\n </div>\n "], ["\n <div\n onMouseDown=", "\n onKeyDown=", "\n style=", "\n className=", "\n title=", '\n tabIndex="1"\n >\n ', "\n ", '\n <div className="content">\n <canvas\n data-density=', "\n width=", "\n height=", "\n style=", "\n onMouseDown=", "\n ></canvas>\n ", "\n </div>\n </div>\n "]), y = i(['<div><div className="spinner"></div><div className="spinner-text">loading</div>'], ['<div><div className="spinner"></div><div className="spinner-text">loading</div>']), b = i(["<Light\n id=", "\n disabled=", "\n selected=", "\n x=", "\n y=", "\n temp=", "\n pointAngle=", "\n beamAngle=", "\n onInteract=", "\n onMove=", "\n onRotate=", "\n onChangeColor=", "\n onSave=", "\n />"], ["<Light\n id=", "\n disabled=", "\n selected=", "\n x=", "\n y=", "\n temp=", "\n pointAngle=", "\n beamAngle=", "\n onInteract=", "\n onMove=", "\n onRotate=", "\n onChangeColor=", "\n onSave=", "\n />"]), w = n(94), x = n(49), E = n(31), C = n(100), D = n(46), M = n(30), S = Math.PI / 2, R = 2 * Math.PI, O = S / 90; | |
| w.component("Handle", { | |
| componentDidMount: function () { | |
| this._handleDragMove = this.handleDragMove.bind(this), this._handleDragUp = this.handleDragUp.bind(this), this.getDOMNode().firstChild.addEventListener("touchstart", this.handleDragDown.bind(this)) | |
| }, _stopListening: function () { | |
| window.removeEventListener("mousemove", this._handleDragMove, !1), window.removeEventListener("mouseup", this._handleDragUp, !1), window.removeEventListener("touchmove", this._handleDragMove, !1), window.removeEventListener("touchend", this._handleDragUp, !1) | |
| }, componentWillUnmount: function () { | |
| this._stopListening() | |
| }, _normalizeEvent: function (t) { | |
| t.touches && t.touches[0] && (t.clientX = t.touches[0].clientX, t.clientY = t.touches[0].clientY) | |
| }, handleDragDown: function (t) { | |
| this.props.disabled || (document.documentElement.style.cursor = "move", window.addEventListener("mousemove", this._handleDragMove, !1), window.addEventListener("mouseup", this._handleDragUp, !1), window.addEventListener("touchmove", this._handleDragMove, !1), window.addEventListener("touchend", this._handleDragUp, !1), this.props.onGrab && (this._normalizeEvent(t), this.props.onGrab(t)), t.preventDefault()) | |
| }, handleDragUp: function (t) { | |
| document.documentElement.style.cursor = null, this._stopListening(), this.props.onRelease && (this._normalizeEvent(t), this.props.onRelease(t)), t.preventDefault() | |
| }, handleDragMove: function (t) { | |
| this.props.onDrag && (this._normalizeEvent(t), this.props.onDrag(t)), t.preventDefault() | |
| }, render: function () { | |
| return w(f, x("handle", this.props.className), this.props.style || "", this.handleDragDown.bind(this)) | |
| } | |
| }), w.component("Light", { | |
| handleRotate: function (t) { | |
| var e = this.getDOMNode().firstChild.getBoundingClientRect(), n = t.clientX - e.left, i = t.clientY - e.top, o = s(-Math.atan2(i, n) / O, 360), r = Math.sqrt(Math.pow(n, 2) + Math.pow(i, 2)); | |
| this.props.onRotate(o, E(0, 95 - 3 * (r - 42), 95)) | |
| }, handleRotateColor: function (t) { | |
| var e = this.getDOMNode().firstChild.getBoundingClientRect(), n = t.clientX - e.left, i = t.clientY - e.top, o = E(90, s(-Math.atan2(i, n) / O - this.props.pointAngle, 360), 270) - 90; | |
| this.props.onChangeColor(o / 180) | |
| }, render: function () { | |
| var t = C({ | |
| left: this.props.x + "px", | |
| top: this.props.y + "px", | |
| transform: "rotate(" + (-this.props.pointAngle - 90) + "deg)" | |
| }), e = ""; | |
| if (this.props.selected) { | |
| var n = 42 + E(0, (95 - this.props.beamAngle) / 3, 95), i = C({ | |
| position: "absolute", | |
| top: n + "px" | |
| }), s = 180 * this.props.temp, a = u(this.props.temp), h = C({ | |
| position: "absolute", | |
| left: 39 * r(-s) + "px", | |
| top: 39 * o(-s) + "px" | |
| }), l = C({backgroundColor: c(a[0], a[1], a[2], 1)}); | |
| e = w(p, i, this.props.disabled, this.handleRotate.bind(this), this.props.onSave, h, l, this.props.disabled, this.handleRotateColor.bind(this), this.props.onSave) | |
| } | |
| return w(g, x("light", this.props.selected && "selected"), t, this.props.id, this.props.disabled, this.props.onInteract, this.props.onMove, this.props.onSave, e) | |
| } | |
| }), A.prototype = { | |
| STIFFNESS: .25, FRICTION: .1, MAX_LIGHTS: 3, FPS: 15, resetTree: function () { | |
| this.l = null, this.lights = [], this.state = {_selected: null} | |
| }, renderUI: function () { | |
| var t = ""; | |
| this.opts.readOnly || this.opts.loading || (t = w(v, this.lights.length === this.MAX_LIGHTS, this.handleCreateLight.bind(this), !this.state._selected, this.handleRemoveSelection.bind(this))); | |
| var e = C({ | |
| width: this.opts.width + "px", | |
| height: this.opts.height + "px" | |
| }), n = window.devicePixelRatio > 1 ? 2 : 1, i = C({ | |
| transformOrigin: "0 0", | |
| transform: "scale(" + 1 / n + ", " + 1 / n + ")" | |
| }), o = x("frame", this.opts.loading && "loading"); | |
| w.render(w(m, this.handleMouseDown.bind(this), this.handleKeyDown.bind(this), e, o, this.opts.title, t, this.opts.loading ? w(y) : "", n, this.opts.width * n, this.opts.height * n, i, this.handleCanvasMouseDown.bind(this), this.lights.map(function (t) { | |
| var e = Boolean(this.state._selected && "light" === this.state._selected.kind && this.state._selected.id === t.id); | |
| return w(b, t.id, this.opts.readOnly, e, t.pos[0], this.opts.height - t.pos[1], t.temp, t.pointAngle, t.beamAngle, this.handleLightInteract.bind(this, t.id), this.handleLightMove.bind(this, t.id), this.handleLightRotate.bind(this, t.id), this.handleLightChangeColor.bind(this, t.id), this.saveLight.bind(this, t.id)) | |
| }.bind(this))), this.el) | |
| }, update: function (t) { | |
| this.l = t.tree; | |
| var e = 0, n = {}; | |
| M(this.l, function (t, i) { | |
| e++; | |
| var o = t.img || "proxy"; | |
| n[o] = n[o] || {count: 0}, n[o].count++; | |
| var r = this.state[t.id]; | |
| r || (r = this.state[t.id] = {angle: t.angle, av: 0}), r.node = t, i() | |
| }.bind(this)), this.lights = t.lights || []; | |
| var i = Date.now(); | |
| this._afterNextRender = function () { | |
| if (this.opts.loading = !1, this.renderUI(), this._afterNextRender = null, this.opts.debug) { | |
| var o = Date.now() - i; | |
| console.debug("updated. rendered", e, "nodes in", o, "ms", "| supply:", t.supply), console.table(n) | |
| } | |
| }.bind(this), this.renderCanvas() | |
| }, addWind: function (t, e, n) { | |
| M(this.l, function (i, r) { | |
| if (!i.rigid && i.cache) { | |
| var s = this.state[i.id], a = o(t - i.cache.angle), c = 1 - n + Math.random() * n; | |
| s.av += i.waviness * c * (1 / Math.sqrt(i.cache.scale)) * a * e | |
| } | |
| r() | |
| }.bind(this)), this.queueStep() | |
| }, queueStep: function () { | |
| this._queued || (setTimeout(this.step.bind(this), 1e3 / this.FPS), this._queued = Date.now()) | |
| }, step: function () { | |
| this.opts.beforeStep && this.opts.beforeStep(), M(this.l, function (t, e) { | |
| var n = this.state[t.id]; | |
| n.av += (1 - t.waviness) * t.scale * this.STIFFNESS * (t.angle - n.angle), n.av += -n.av * this.FRICTION, n.angle += n.av, e() | |
| }.bind(this)), this.renderCanvas(), this._queued = !1, this.queueStep() | |
| }, renderCanvas: function () { | |
| !this._rendering && this.l && (this._rendering = !0, d(this.l, this.state, this.lights, { | |
| width: this.opts.width, | |
| height: this.opts.height, | |
| el: this.el.querySelector("canvas"), | |
| urlPrefix: this.opts.urlPrefix, | |
| imgCache: this.imgCache, | |
| debug: this.opts.debug, | |
| onFinish: function () { | |
| this._afterNextRender && this._afterNextRender(), this._rendering = !1 | |
| }.bind(this) | |
| })) | |
| }, handleMouseDown: function () { | |
| this.el.querySelector(".frame").focus() | |
| }, _deselect: function () { | |
| this.state._selected = null, this.renderCanvas(), this.renderUI() | |
| }, handleCanvasMouseDown: function (t) { | |
| if (!this.opts.readOnly) { | |
| this._deselect(); | |
| var e = this.el.getBoundingClientRect(), n = t.clientX - e.left, i = this.opts.height - (t.clientY - e.top), o = null, r = Number.MAX_VALUE; | |
| if (M(this.l, function (t, e) { | |
| var s = t.cache; | |
| if (s && s.width && !t.immutable) { | |
| var a = l(t); | |
| if (a.x1 <= n && a.x2 >= n && a.y1 <= i && a.y2 >= i) { | |
| var c = (a.x2 - a.x1) * (a.y2 - a.y1); | |
| r > c && (o = t, r = c) | |
| } | |
| } | |
| e() | |
| }), o) { | |
| var s = o.proxyFor || o.id; | |
| this.state._selected = {kind: "node", id: s, circled: o.id} | |
| } | |
| this.renderCanvas(), this.renderUI() | |
| } | |
| }, handleKeyDown: function (t) { | |
| 46 !== t.which && 8 !== t.which || (this.handleRemoveSelection(), t.preventDefault()) | |
| }, handleLightInteract: function (t) { | |
| this.opts.readOnly || (this.state._selected = {kind: "light", id: t}, this.renderCanvas(), this.renderUI()) | |
| }, handleLightMove: function (t, e) { | |
| var n = this.el.getBoundingClientRect(), i = E(0, e.clientX - n.left, this.opts.width), o = E(0, this.opts.height - (e.clientY - n.top), this.opts.height); | |
| this.setLight(t, {pos: [i, o]}) | |
| }, handleLightRotate: function (t, e, n) { | |
| this.setLight(t, {pointAngle: e, beamAngle: n}) | |
| }, handleLightChangeColor: function (t, e) { | |
| this.setLight(t, {temp: e}) | |
| }, setLight: function (t, e) { | |
| this.opts.onLightChanging(t); | |
| var n = this.lights.findIndex(function (e) { | |
| return e.id === t | |
| }); | |
| -1 !== n && (Object.assign(this.lights[n], e), this.renderCanvas(), this.renderUI()) | |
| }, saveLight: function (t) { | |
| var e = this.lights.findIndex(function (e) { | |
| return e.id === t | |
| }); | |
| -1 !== e && this.opts.onSetLight(t, this.lights[e]) | |
| }, handleCreateLight: function () { | |
| var t = this.opts.width * Math.random(), e = (this.opts.height + this.opts.height * Math.random()) / 2, n = this.opts.width / 2, i = 0; | |
| this.opts.onSetLight(null, { | |
| pos: [t, e], | |
| pointAngle: Math.atan2(i - e, n - t) / O, | |
| beamAngle: 45 + 45 * Math.random(), | |
| temp: .5 | |
| }) | |
| }, handleRemoveSelection: function () { | |
| this.state._selected && ("node" === this.state._selected.kind ? this.opts.onPruneNode(this.state._selected.id) : "light" === this.state._selected.kind && this.opts.onRemoveLight(this.state._selected.id), this._deselect()) | |
| } | |
| }, t.exports = A | |
| }, function (t, e, n) { | |
| var i = n(31); | |
| t.exports = function (t) { | |
| function e() { | |
| var e = 2 * (Math.random() - .5); | |
| Math.random() > .9 && (n += Math.random() - .5), o = i(60, o + 2 * (Math.random() - .5), 120), n *= .995, t.addWind(o, .025 * e + .25 * n, .5) | |
| } | |
| var n = 0, o = 90; | |
| t.opts.beforeStep = e, e() | |
| } | |
| }, function (t, e, n) { | |
| var i, o; | |
| /*! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment