!function (e, t) {
"object" == typeof exports && "object" == typeof module ? module.exports = t(require("echarts")) : "function" == typeof define && define.amd ? define(["echarts"], t) : "object" == typeof exports ? exports["echarts-gl"] = t(require("echarts")) : e["echarts-gl"] = t(e.echarts)
}(self, (function (e) {
return (() => {
"use strict";
var t = {
468: (e, t, r) => {
r.r(t);
var i = r(83);
function n(e, t, r) {
"object" == typeof t && (r = t,
t = null);
var i, n = this;
if (!(e instanceof Function))
for (var s in i = [],
e)
e.hasOwnProperty(s) && i.push(s);
var l = function (t) {
if (n.apply(this, arguments),
e instanceof Function ? a(this, e.call(this, t)) : o(this, e, i),
this.constructor === l)
for (var r = l.__initializers__, s = 0; s < r.length; s++)
r[s].apply(this, arguments)
};
l.__super__ = n,
n.__initializers__ ? l.__initializers__ = n.__initializers__.slice() : l.__initializers__ = [],
t && l.__initializers__.push(t);
var h = function () { };
return h.prototype = n.prototype,
l.prototype = new h,
l.prototype.constructor = l,
a(l.prototype, r),
l.extend = n.extend,
l.derive = n.extend,
l
}
function a(e, t) {
if (t)
for (var r in t)
t.hasOwnProperty(r) && (e[r] = t[r])
}
function o(e, t, r) {
for (var i = 0; i < r.length; i++) {
var n = r[i];
e[n] = t[n]
}
}
const s = {
extend: n,
derive: n
};
function l(e, t) {
this.action = e,
this.context = t
}
const h = {
trigger: function (e) {
if (this.hasOwnProperty("__handlers__") && this.__handlers__.hasOwnProperty(e)) {
var t = this.__handlers__[e]
, r = t.length
, i = -1
, n = arguments;
switch (n.length) {
case 1:
for (; ++i < r;)
t[i].action.call(t[i].context);
return;
case 2:
for (; ++i < r;)
t[i].action.call(t[i].context, n[1]);
return;
case 3:
for (; ++i < r;)
t[i].action.call(t[i].context, n[1], n[2]);
return;
case 4:
for (; ++i < r;)
t[i].action.call(t[i].context, n[1], n[2], n[3]);
return;
case 5:
for (; ++i < r;)
t[i].action.call(t[i].context, n[1], n[2], n[3], n[4]);
return;
default:
for (; ++i < r;)
t[i].action.apply(t[i].context, Array.prototype.slice.call(n, 1));
return
}
}
},
on: function (e, t, r) {
if (e && t) {
var i = this.__handlers__ || (this.__handlers__ = {});
if (i[e]) {
if (this.has(e, t))
return
} else
i[e] = [];
var n = new l(t, r || this);
return i[e].push(n),
this
}
},
once: function (e, t, r) {
if (e && t) {
var i = this;
return this.on(e, (function r() {
i.off(e, r),
t.apply(this, arguments)
}
), r)
}
},
before: function (e, t, r) {
if (e && t)
return e = "before" + e,
this.on(e, t, r)
},
after: function (e, t, r) {
if (e && t)
return e = "after" + e,
this.on(e, t, r)
},
success: function (e, t) {
return this.once("success", e, t)
},
error: function (e, t) {
return this.once("error", e, t)
},
off: function (e, t) {
var r = this.__handlers__ || (this.__handlers__ = {});
if (t) {
if (r[e]) {
for (var i = r[e], n = [], a = 0; a < i.length; a++)
t && i[a].action !== t && n.push(i[a]);
r[e] = n
}
return this
}
r[e] = []
},
has: function (e, t) {
var r = this.__handlers__;
if (!r || !r[e])
return !1;
for (var i = r[e], n = 0; n < i.length; n++)
if (i[n].action === t)
return !0
}
};
var u = 0
, c = Array.prototype.forEach
, d = {
genGUID: function () {
return ++u
},
relative2absolute: function (e, t) {
if (!t || e.match(/^\//))
return e;
for (var r = e.split("/"), i = t.split("/"), n = r[0]; "." === n || ".." === n;)
".." === n && i.pop(),
r.shift(),
n = r[0];
return i.join("/") + "/" + r.join("/")
},
extend: function (e, t) {
if (t)
for (var r in t)
t.hasOwnProperty(r) && (e[r] = t[r]);
return e
},
defaults: function (e, t) {
if (t)
for (var r in t)
void 0 === e[r] && (e[r] = t[r]);
return e
},
extendWithPropList: function (e, t, r) {
if (t)
for (var i = 0; i < r.length; i++) {
var n = r[i];
e[n] = t[n]
}
return e
},
defaultsWithPropList: function (e, t, r) {
if (t)
for (var i = 0; i < r.length; i++) {
var n = r[i];
null == e[n] && (e[n] = t[n])
}
return e
},
each: function (e, t, r) {
if (e && t)
if (e.forEach && e.forEach === c)
e.forEach(t, r);
else if (e.length === +e.length)
for (var i = 0, n = e.length; i < n; i++)
t.call(r, e[i], i, e);
else
for (var a in e)
e.hasOwnProperty(a) && t.call(r, e[a], a, e)
},
isObject: function (e) {
return e === Object(e)
},
isArray: function (e) {
return Array.isArray(e)
},
isArrayLike: function (e) {
return !!e && e.length === +e.length
},
clone: function (e) {
if (d.isObject(e)) {
if (d.isArray(e))
return e.slice();
if (d.isArrayLike(e)) {
for (var t = new e.constructor(e.length), r = 0; r < e.length; r++)
t[r] = e[r];
return t
}
return d.extend({}, e)
}
return e
}
};
const f = d;
var p = function () {
this.__uid__ = f.genGUID()
};
p.__initializers__ = [function (e) {
f.extend(this, e)
}
],
f.extend(p, s),
f.extend(p.prototype, h);
const m = p;
var g = ["OES_texture_float", "OES_texture_half_float", "OES_texture_float_linear", "OES_texture_half_float_linear", "OES_standard_derivatives", "OES_vertex_array_object", "OES_element_index_uint", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture", "EXT_texture_filter_anisotropic", "EXT_shader_texture_lod", "WEBGL_draw_buffers", "EXT_frag_depth", "EXT_sRGB", "ANGLE_instanced_arrays"]
, _ = ["MAX_TEXTURE_SIZE", "MAX_CUBE_MAP_TEXTURE_SIZE"];
const v = function (e) {
for (var t = {}, r = {}, i = 0; i < g.length; i++)
a(g[i]);
for (i = 0; i < _.length; i++) {
var n = _[i];
r[n] = e.getParameter(e[n])
}
function a(r) {
if (e.getExtension) {
var i = e.getExtension(r);
i || (i = e.getExtension("MOZ_" + r)),
i || (i = e.getExtension("WEBKIT_" + r)),
t[r] = i
}
}
this.getExtension = function (e) {
return e in t || a(e),
t[e]
}
,
this.getParameter = function (e) {
return r[e]
}
}
, y = 1028
, x = 1029
, b = 2304
, w = 2305
, T = 5121
, S = 5126
, M = 6402
, A = 6408
, E = 9728
, C = 9729
, D = 9984
, L = 9985
, P = 9986
, O = 9987
, N = 10497
, I = 33071
, R = 33306
, B = {
get: function (e) {
var t = new XMLHttpRequest;
t.open("get", e.url),
t.responseType = e.responseType || "text",
e.onprogress && (t.onprogress = function (t) {
if (t.lengthComputable) {
var r = t.loaded / t.total;
e.onprogress(r, t.loaded, t.total)
} else
e.onprogress(null)
}
),
t.onload = function (r) {
t.status >= 400 ? e.onerror && e.onerror() : e.onload && e.onload(t.response)
}
,
e.onerror && (t.onerror = e.onerror),
t.send(null)
}
};
var F, z = {
supportWebGL: function () {
if (null == F)
try {
var e = document.createElement("canvas");
if (!e.getContext("webgl") && !e.getContext("experimental-webgl"))
throw new Error
} catch (e) {
F = !1
}
return F
}
};
z.Int8Array = "undefined" == typeof Int8Array ? Array : Int8Array,
z.Uint8Array = "undefined" == typeof Uint8Array ? Array : Uint8Array,
z.Uint16Array = "undefined" == typeof Uint16Array ? Array : Uint16Array,
z.Uint32Array = "undefined" == typeof Uint32Array ? Array : Uint32Array,
z.Int16Array = "undefined" == typeof Int16Array ? Array : Int16Array,
z.Float32Array = "undefined" == typeof Float32Array ? Array : Float32Array,
z.Float64Array = "undefined" == typeof Float64Array ? Array : Float64Array;
var G = {};
"undefined" != typeof window ? G = window : void 0 !== r.g && (G = r.g),
z.requestAnimationFrame = G.requestAnimationFrame || G.msRequestAnimationFrame || G.mozRequestAnimationFrame || G.webkitRequestAnimationFrame || function (e) {
setTimeout(e, 16)
}
,
z.createCanvas = function () {
return document.createElement("canvas")
}
,
z.createImage = function () {
return new G.Image
}
,
z.request = {
get: B.get
},
z.addEventListener = function (e, t, r, i) {
e.addEventListener(t, r, i)
}
,
z.removeEventListener = function (e, t, r) {
e.removeEventListener(t, r)
}
;
const U = z;
var k = function () {
this.head = null,
this.tail = null,
this._length = 0
};
k.prototype.insert = function (e) {
var t = new k.Entry(e);
return this.insertEntry(t),
t
}
,
k.prototype.insertAt = function (e, t) {
if (!(e < 0)) {
for (var r = this.head, i = 0; r && i != e;)
r = r.next,
i++;
if (r) {
var n = new k.Entry(t)
, a = r.prev;
a ? (a.next = n,
n.prev = a) : this.head = n,
n.next = r,
r.prev = n
} else
this.insert(t)
}
}
,
k.prototype.insertBeforeEntry = function (e, t) {
var r = new k.Entry(e)
, i = t.prev;
i ? (i.next = r,
r.prev = i) : this.head = r,
r.next = t,
t.prev = r,
this._length++
}
,
k.prototype.insertEntry = function (e) {
this.head ? (this.tail.next = e,
e.prev = this.tail,
this.tail = e) : this.head = this.tail = e,
this._length++
}
,
k.prototype.remove = function (e) {
var t = e.prev
, r = e.next;
t ? t.next = r : this.head = r,
r ? r.prev = t : this.tail = t,
e.next = e.prev = null,
this._length--
}
,
k.prototype.removeAt = function (e) {
if (!(e < 0)) {
for (var t = this.head, r = 0; t && r != e;)
t = t.next,
r++;
return t ? (this.remove(t),
t.value) : void 0
}
}
,
k.prototype.getHead = function () {
if (this.head)
return this.head.value
}
,
k.prototype.getTail = function () {
if (this.tail)
return this.tail.value
}
,
k.prototype.getAt = function (e) {
if (!(e < 0)) {
for (var t = this.head, r = 0; t && r != e;)
t = t.next,
r++;
return t.value
}
}
,
k.prototype.indexOf = function (e) {
for (var t = this.head, r = 0; t;) {
if (t.value === e)
return r;
t = t.next,
r++
}
}
,
k.prototype.length = function () {
return this._length
}
,
k.prototype.isEmpty = function () {
return 0 === this._length
}
,
k.prototype.forEach = function (e, t) {
for (var r = this.head, i = 0, n = void 0 !== t; r;)
n ? e.call(t, r.value, i) : e(r.value, i),
r = r.next,
i++
}
,
k.prototype.clear = function () {
this.tail = this.head = null,
this._length = 0
}
,
k.Entry = function (e) {
this.value = e,
this.next = null,
this.prev = null
}
;
const V = k;
var H = function (e) {
this._list = new V,
this._map = {},
this._maxSize = e || 10
};
H.prototype.setMaxSize = function (e) {
this._maxSize = e
}
,
H.prototype.put = function (e, t) {
if (!this._map.hasOwnProperty(e)) {
var r = this._list.length();
if (r >= this._maxSize && r > 0) {
var i = this._list.head;
this._list.remove(i),
delete this._map[i.key]
}
var n = this._list.insert(t);
n.key = e,
this._map[e] = n
}
}
,
H.prototype.get = function (e) {
var t = this._map[e];
if (this._map.hasOwnProperty(e))
return t !== this._list.tail && (this._list.remove(t),
this._list.insertEntry(t)),
t.value
}
,
H.prototype.remove = function (e) {
var t = this._map[e];
void 0 !== t && (delete this._map[e],
this._list.remove(t))
}
,
H.prototype.clear = function () {
this._list.clear(),
this._map = {}
}
;
const W = H;
var j = {}
, X = {
transparent: [0, 0, 0, 0],
aliceblue: [240, 248, 255, 1],
antiquewhite: [250, 235, 215, 1],
aqua: [0, 255, 255, 1],
aquamarine: [127, 255, 212, 1],
azure: [240, 255, 255, 1],
beige: [245, 245, 220, 1],
bisque: [255, 228, 196, 1],
black: [0, 0, 0, 1],
blanchedalmond: [255, 235, 205, 1],
blue: [0, 0, 255, 1],
blueviolet: [138, 43, 226, 1],
brown: [165, 42, 42, 1],
burlywood: [222, 184, 135, 1],
cadetblue: [95, 158, 160, 1],
chartreuse: [127, 255, 0, 1],
chocolate: [210, 105, 30, 1],
coral: [255, 127, 80, 1],
cornflowerblue: [100, 149, 237, 1],
cornsilk: [255, 248, 220, 1],
crimson: [220, 20, 60, 1],
cyan: [0, 255, 255, 1],
darkblue: [0, 0, 139, 1],
darkcyan: [0, 139, 139, 1],
darkgoldenrod: [184, 134, 11, 1],
darkgray: [169, 169, 169, 1],
darkgreen: [0, 100, 0, 1],
darkgrey: [169, 169, 169, 1],
darkkhaki: [189, 183, 107, 1],
darkmagenta: [139, 0, 139, 1],
darkolivegreen: [85, 107, 47, 1],
darkorange: [255, 140, 0, 1],
darkorchid: [153, 50, 204, 1],
darkred: [139, 0, 0, 1],
darksalmon: [233, 150, 122, 1],
darkseagreen: [143, 188, 143, 1],
darkslateblue: [72, 61, 139, 1],
darkslategray: [47, 79, 79, 1],
darkslategrey: [47, 79, 79, 1],
darkturquoise: [0, 206, 209, 1],
darkviolet: [148, 0, 211, 1],
deeppink: [255, 20, 147, 1],
deepskyblue: [0, 191, 255, 1],
dimgray: [105, 105, 105, 1],
dimgrey: [105, 105, 105, 1],
dodgerblue: [30, 144, 255, 1],
firebrick: [178, 34, 34, 1],
floralwhite: [255, 250, 240, 1],
forestgreen: [34, 139, 34, 1],
fuchsia: [255, 0, 255, 1],
gainsboro: [220, 220, 220, 1],
ghostwhite: [248, 248, 255, 1],
gold: [255, 215, 0, 1],
goldenrod: [218, 165, 32, 1],
gray: [128, 128, 128, 1],
green: [0, 128, 0, 1],
greenyellow: [173, 255, 47, 1],
grey: [128, 128, 128, 1],
honeydew: [240, 255, 240, 1],
hotpink: [255, 105, 180, 1],
indianred: [205, 92, 92, 1],
indigo: [75, 0, 130, 1],
ivory: [255, 255, 240, 1],
khaki: [240, 230, 140, 1],
lavender: [230, 230, 250, 1],
lavenderblush: [255, 240, 245, 1],
lawngreen: [124, 252, 0, 1],
lemonchiffon: [255, 250, 205, 1],
lightblue: [173, 216, 230, 1],
lightcoral: [240, 128, 128, 1],
lightcyan: [224, 255, 255, 1],
lightgoldenrodyellow: [250, 250, 210, 1],
lightgray: [211, 211, 211, 1],
lightgreen: [144, 238, 144, 1],
lightgrey: [211, 211, 211, 1],
lightpink: [255, 182, 193, 1],
lightsalmon: [255, 160, 122, 1],
lightseagreen: [32, 178, 170, 1],
lightskyblue: [135, 206, 250, 1],
lightslategray: [119, 136, 153, 1],
lightslategrey: [119, 136, 153, 1],
lightsteelblue: [176, 196, 222, 1],
lightyellow: [255, 255, 224, 1],
lime: [0, 255, 0, 1],
limegreen: [50, 205, 50, 1],
linen: [250, 240, 230, 1],
magenta: [255, 0, 255, 1],
maroon: [128, 0, 0, 1],
mediumaquamarine: [102, 205, 170, 1],
mediumblue: [0, 0, 205, 1],
mediumorchid: [186, 85, 211, 1],
mediumpurple: [147, 112, 219, 1],
mediumseagreen: [60, 179, 113, 1],
mediumslateblue: [123, 104, 238, 1],
mediumspringgreen: [0, 250, 154, 1],
mediumturquoise: [72, 209, 204, 1],
mediumvioletred: [199, 21, 133, 1],
midnightblue: [25, 25, 112, 1],
mintcream: [245, 255, 250, 1],
mistyrose: [255, 228, 225, 1],
moccasin: [255, 228, 181, 1],
navajowhite: [255, 222, 173, 1],
navy: [0, 0, 128, 1],
oldlace: [253, 245, 230, 1],
olive: [128, 128, 0, 1],
olivedrab: [107, 142, 35, 1],
orange: [255, 165, 0, 1],
orangered: [255, 69, 0, 1],
orchid: [218, 112, 214, 1],
palegoldenrod: [238, 232, 170, 1],
palegreen: [152, 251, 152, 1],
paleturquoise: [175, 238, 238, 1],
palevioletred: [219, 112, 147, 1],
papayawhip: [255, 239, 213, 1],
peachpuff: [255, 218, 185, 1],
peru: [205, 133, 63, 1],
pink: [255, 192, 203, 1],
plum: [221, 160, 221, 1],
powderblue: [176, 224, 230, 1],
purple: [128, 0, 128, 1],
red: [255, 0, 0, 1],
rosybrown: [188, 143, 143, 1],
royalblue: [65, 105, 225, 1],
saddlebrown: [139, 69, 19, 1],
salmon: [250, 128, 114, 1],
sandybrown: [244, 164, 96, 1],
seagreen: [46, 139, 87, 1],
seashell: [255, 245, 238, 1],
sienna: [160, 82, 45, 1],
silver: [192, 192, 192, 1],
skyblue: [135, 206, 235, 1],
slateblue: [106, 90, 205, 1],
slategray: [112, 128, 144, 1],
slategrey: [112, 128, 144, 1],
snow: [255, 250, 250, 1],
springgreen: [0, 255, 127, 1],
steelblue: [70, 130, 180, 1],
tan: [210, 180, 140, 1],
teal: [0, 128, 128, 1],
thistle: [216, 191, 216, 1],
tomato: [255, 99, 71, 1],
turquoise: [64, 224, 208, 1],
violet: [238, 130, 238, 1],
wheat: [245, 222, 179, 1],
white: [255, 255, 255, 1],
whitesmoke: [245, 245, 245, 1],
yellow: [255, 255, 0, 1],
yellowgreen: [154, 205, 50, 1]
};
function q(e) {
return (e = Math.round(e)) < 0 ? 0 : e > 255 ? 255 : e
}
function Z(e) {
return e < 0 ? 0 : e > 1 ? 1 : e
}
function Y(e) {
return e.length && "%" === e.charAt(e.length - 1) ? q(parseFloat(e) / 100 * 255) : q(parseInt(e, 10))
}
function K(e) {
return e.length && "%" === e.charAt(e.length - 1) ? Z(parseFloat(e) / 100) : Z(parseFloat(e))
}
function Q(e, t, r) {
return r < 0 ? r += 1 : r > 1 && (r -= 1),
6 * r < 1 ? e + (t - e) * r * 6 : 2 * r < 1 ? t : 3 * r < 2 ? e + (t - e) * (2 / 3 - r) * 6 : e
}
function J(e, t, r) {
return e + (t - e) * r
}
function $(e, t, r, i, n) {
return e[0] = t,
e[1] = r,
e[2] = i,
e[3] = n,
e
}
function ee(e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e
}
var te = new W(20)
, re = null;
function ie(e, t) {
re && ee(re, t),
re = te.put(e, re || t.slice())
}
function ne(e, t) {
var r = (parseFloat(e[0]) % 360 + 360) % 360 / 360
, i = K(e[1])
, n = K(e[2])
, a = n <= .5 ? n * (i + 1) : n + i - n * i
, o = 2 * n - a;
return $(t = t || [], q(255 * Q(o, a, r + 1 / 3)), q(255 * Q(o, a, r)), q(255 * Q(o, a, r - 1 / 3)), 1),
4 === e.length && (t[3] = e[3]),
t
}
j.parse = function (e, t) {
if (e) {
t = t || [];
var r = te.get(e);
if (r)
return ee(t, r);
var i, n = (e += "").replace(/ /g, "").toLowerCase();
if (n in X)
return ee(t, X[n]),
ie(e, t),
t;
if ("#" === n.charAt(0))
return 4 === n.length ? (i = parseInt(n.substr(1), 16)) >= 0 && i <= 4095 ? ($(t, (3840 & i) >> 4 | (3840 & i) >> 8, 240 & i | (240 & i) >> 4, 15 & i | (15 & i) << 4, 1),
ie(e, t),
t) : void $(t, 0, 0, 0, 1) : 7 === n.length ? (i = parseInt(n.substr(1), 16)) >= 0 && i <= 16777215 ? ($(t, (16711680 & i) >> 16, (65280 & i) >> 8, 255 & i, 1),
ie(e, t),
t) : void $(t, 0, 0, 0, 1) : void 0;
var a = n.indexOf("(")
, o = n.indexOf(")");
if (-1 !== a && o + 1 === n.length) {
var s = n.substr(0, a)
, l = n.substr(a + 1, o - (a + 1)).split(",")
, h = 1;
switch (s) {
case "rgba":
if (4 !== l.length)
return void $(t, 0, 0, 0, 1);
h = K(l.pop());
case "rgb":
return 3 !== l.length ? void $(t, 0, 0, 0, 1) : ($(t, Y(l[0]), Y(l[1]), Y(l[2]), h),
ie(e, t),
t);
case "hsla":
return 4 !== l.length ? void $(t, 0, 0, 0, 1) : (l[3] = K(l[3]),
ne(l, t),
ie(e, t),
t);
case "hsl":
return 3 !== l.length ? void $(t, 0, 0, 0, 1) : (ne(l, t),
ie(e, t),
t);
default:
return
}
}
$(t, 0, 0, 0, 1)
}
}
,
j.parseToFloat = function (e, t) {
if (t = j.parse(e, t))
return t[0] /= 255,
t[1] /= 255,
t[2] /= 255,
t
}
,
j.lift = function (e, t) {
var r = j.parse(e);
if (r) {
for (var i = 0; i < 3; i++)
r[i] = t < 0 ? r[i] * (1 - t) | 0 : (255 - r[i]) * t + r[i] | 0;
return j.stringify(r, 4 === r.length ? "rgba" : "rgb")
}
}
,
j.toHex = function (e) {
var t = j.parse(e);
if (t)
return ((1 << 24) + (t[0] << 16) + (t[1] << 8) + +t[2]).toString(16).slice(1)
}
,
j.fastLerp = function (e, t, r) {
if (t && t.length && e >= 0 && e <= 1) {
r = r || [];
var i = e * (t.length - 1)
, n = Math.floor(i)
, a = Math.ceil(i)
, o = t[n]
, s = t[a]
, l = i - n;
return r[0] = q(J(o[0], s[0], l)),
r[1] = q(J(o[1], s[1], l)),
r[2] = q(J(o[2], s[2], l)),
r[3] = Z(J(o[3], s[3], l)),
r
}
}
,
j.fastMapToColor = j.fastLerp,
j.lerp = function (e, t, r) {
if (t && t.length && e >= 0 && e <= 1) {
var i = e * (t.length - 1)
, n = Math.floor(i)
, a = Math.ceil(i)
, o = j.parse(t[n])
, s = j.parse(t[a])
, l = i - n
, h = j.stringify([q(J(o[0], s[0], l)), q(J(o[1], s[1], l)), q(J(o[2], s[2], l)), Z(J(o[3], s[3], l))], "rgba");
return r ? {
color: h,
leftIndex: n,
rightIndex: a,
value: i
} : h
}
}
,
j.mapToColor = j.lerp,
j.modifyHSL = function (e, t, r, i) {
if (e = j.parse(e))
return e = function (e) {
if (e) {
var t, r, i = e[0] / 255, n = e[1] / 255, a = e[2] / 255, o = Math.min(i, n, a), s = Math.max(i, n, a), l = s - o, h = (s + o) / 2;
if (0 === l)
t = 0,
r = 0;
else {
r = h < .5 ? l / (s + o) : l / (2 - s - o);
var u = ((s - i) / 6 + l / 2) / l
, c = ((s - n) / 6 + l / 2) / l
, d = ((s - a) / 6 + l / 2) / l;
i === s ? t = d - c : n === s ? t = 1 / 3 + u - d : a === s && (t = 2 / 3 + c - u),
t < 0 && (t += 1),
t > 1 && (t -= 1)
}
var f = [360 * t, r, h];
return null != e[3] && f.push(e[3]),
f
}
}(e),
null != t && (e[0] = (n = t,
(n = Math.round(n)) < 0 ? 0 : n > 360 ? 360 : n)),
null != r && (e[1] = K(r)),
null != i && (e[2] = K(i)),
j.stringify(ne(e), "rgba");
var n
}
,
j.modifyAlpha = function (e, t) {
if ((e = j.parse(e)) && null != t)
return e[3] = Z(t),
j.stringify(e, "rgba")
}
,
j.stringify = function (e, t) {
if (e && e.length) {
var r = e[0] + "," + e[1] + "," + e[2];
return "rgba" !== t && "hsva" !== t && "hsla" !== t || (r += "," + e[3]),
t + "(" + r + ")"
}
}
;
var ae = j.parseToFloat
, oe = {};
function se(e) {
var t = Object.keys(e);
t.sort();
for (var r = [], i = 0; i < t.length; i++) {
var n = t[i]
, a = e[n];
null === a ? r.push(n) : r.push(n + " " + a.toString())
}
return r.join("\n")
}
const le = m.extend((function () {
return {
name: "",
depthTest: !0,
depthMask: !0,
transparent: !1,
blend: null,
autoUpdateTextureStatus: !0,
uniforms: {},
vertexDefines: {},
fragmentDefines: {},
_textureStatus: {},
_enabledUniforms: null
}
}
), (function () {
this.name || (this.name = "MATERIAL_" + this.__uid__),
this.shader && this.attachShader(this.shader, !0)
}
), {
precision: "highp",
setUniform: function (e, t) {
void 0 === t && console.warn('Uniform value "' + e + '" is undefined');
var r = this.uniforms[e];
r && ("string" == typeof t && (t = ae(t) || t),
r.value = t,
this.autoUpdateTextureStatus && "t" === r.type && (t ? this.enableTexture(e) : this.disableTexture(e)))
},
setUniforms: function (e) {
for (var t in e) {
var r = e[t];
this.setUniform(t, r)
}
},
isUniformEnabled: function (e) {
return this._enabledUniforms.indexOf(e) >= 0
},
getEnabledUniforms: function () {
return this._enabledUniforms
},
getTextureUniforms: function () {
return this._textureUniforms
},
set: function (e, t) {
if ("object" == typeof e)
for (var r in e) {
var i = e[r];
this.setUniform(r, i)
}
else
this.setUniform(e, t)
},
get: function (e) {
var t = this.uniforms[e];
if (t)
return t.value
},
attachShader: function (e, t) {
var r = this.uniforms;
this.uniforms = e.createUniforms(),
this.shader = e;
var i = this.uniforms;
this._enabledUniforms = Object.keys(i),
this._enabledUniforms.sort(),
this._textureUniforms = this._enabledUniforms.filter((function (e) {
var t = this.uniforms[e].type;
return "t" === t || "tv" === t
}
), this);
var n = this.vertexDefines
, a = this.fragmentDefines;
if (this.vertexDefines = f.clone(e.vertexDefines),
this.fragmentDefines = f.clone(e.fragmentDefines),
t) {
for (var o in r)
i[o] && (i[o].value = r[o].value);
f.defaults(this.vertexDefines, n),
f.defaults(this.fragmentDefines, a)
}
var s = {};
for (var l in e.textures)
s[l] = {
shaderType: e.textures[l].shaderType,
type: e.textures[l].type,
enabled: !(!t || !this._textureStatus[l]) && this._textureStatus[l].enabled
};
this._textureStatus = s,
this._programKey = ""
},
clone: function () {
var e = new this.constructor({
name: this.name,
shader: this.shader
});
for (var t in this.uniforms)
e.uniforms[t].value = this.uniforms[t].value;
return e.depthTest = this.depthTest,
e.depthMask = this.depthMask,
e.transparent = this.transparent,
e.blend = this.blend,
e.vertexDefines = f.clone(this.vertexDefines),
e.fragmentDefines = f.clone(this.fragmentDefines),
e.enableTexture(this.getEnabledTextures()),
e.precision = this.precision,
e
},
define: function (e, t, r) {
var i = this.vertexDefines
, n = this.fragmentDefines;
"vertex" !== e && "fragment" !== e && "both" !== e && arguments.length < 3 && (r = t,
t = e,
e = "both"),
r = null != r ? r : null,
"vertex" !== e && "both" !== e || i[t] !== r && (i[t] = r,
this._programKey = ""),
"fragment" !== e && "both" !== e || n[t] !== r && (n[t] = r,
"both" !== e && (this._programKey = ""))
},
undefine: function (e, t) {
"vertex" !== e && "fragment" !== e && "both" !== e && arguments.length < 2 && (t = e,
e = "both"),
"vertex" !== e && "both" !== e || this.isDefined("vertex", t) && (delete this.vertexDefines[t],
this._programKey = ""),
"fragment" !== e && "both" !== e || this.isDefined("fragment", t) && (delete this.fragmentDefines[t],
"both" !== e && (this._programKey = ""))
},
isDefined: function (e, t) {
switch (e) {
case "vertex":
return void 0 !== this.vertexDefines[t];
case "fragment":
return void 0 !== this.fragmentDefines[t]
}
},
getDefine: function (e, t) {
switch (e) {
case "vertex":
return this.vertexDefines[t];
case "fragment":
return this.fragmentDefines[t]
}
},
enableTexture: function (e) {
if (Array.isArray(e))
for (var t = 0; t < e.length; t++)
this.enableTexture(e[t]);
else {
var r = this._textureStatus[e];
r && (r.enabled || (r.enabled = !0,
this._programKey = ""))
}
},
enableTexturesAll: function () {
var e = this._textureStatus;
for (var t in e)
e[t].enabled = !0;
this._programKey = ""
},
disableTexture: function (e) {
if (Array.isArray(e))
for (var t = 0; t < e.length; t++)
this.disableTexture(e[t]);
else {
var r = this._textureStatus[e];
r && (!r.enabled || (r.enabled = !1,
this._programKey = ""))
}
},
disableTexturesAll: function () {
var e = this._textureStatus;
for (var t in e)
e[t].enabled = !1;
this._programKey = ""
},
isTextureEnabled: function (e) {
var t = this._textureStatus;
return !!t[e] && t[e].enabled
},
getEnabledTextures: function () {
var e = []
, t = this._textureStatus;
for (var r in t)
t[r].enabled && e.push(r);
return e
},
dirtyDefines: function () {
this._programKey = ""
},
getProgramKey: function () {
return this._programKey || (this._programKey = function (e, t, r) {
r.sort();
for (var i = [], n = 0; n < r.length; n++) {
var a = r[n];
i.push(a)
}
var o = se(e) + "\n" + se(t) + "\n" + i.join("\n");
if (oe[o])
return oe[o];
var s = f.genGUID();
return oe[o] = s,
s
}(this.vertexDefines, this.fragmentDefines, this.getEnabledTextures())),
this._programKey
}
});
var he, ue = 1e-6, ce = Array, de = Math.random, fe = {
create: function () {
var e = new ce(2);
return e[0] = 0,
e[1] = 0,
e
},
clone: function (e) {
var t = new ce(2);
return t[0] = e[0],
t[1] = e[1],
t
},
fromValues: function (e, t) {
var r = new ce(2);
return r[0] = e,
r[1] = t,
r
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e
},
set: function (e, t, r) {
return e[0] = t,
e[1] = r,
e
},
add: function (e, t, r) {
return e[0] = t[0] + r[0],
e[1] = t[1] + r[1],
e
},
subtract: function (e, t, r) {
return e[0] = t[0] - r[0],
e[1] = t[1] - r[1],
e
}
};
fe.sub = fe.subtract,
fe.multiply = function (e, t, r) {
return e[0] = t[0] * r[0],
e[1] = t[1] * r[1],
e
}
,
fe.mul = fe.multiply,
fe.divide = function (e, t, r) {
return e[0] = t[0] / r[0],
e[1] = t[1] / r[1],
e
}
,
fe.div = fe.divide,
fe.min = function (e, t, r) {
return e[0] = Math.min(t[0], r[0]),
e[1] = Math.min(t[1], r[1]),
e
}
,
fe.max = function (e, t, r) {
return e[0] = Math.max(t[0], r[0]),
e[1] = Math.max(t[1], r[1]),
e
}
,
fe.scale = function (e, t, r) {
return e[0] = t[0] * r,
e[1] = t[1] * r,
e
}
,
fe.scaleAndAdd = function (e, t, r, i) {
return e[0] = t[0] + r[0] * i,
e[1] = t[1] + r[1] * i,
e
}
,
fe.distance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1];
return Math.sqrt(r * r + i * i)
}
,
fe.dist = fe.distance,
fe.squaredDistance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1];
return r * r + i * i
}
,
fe.sqrDist = fe.squaredDistance,
fe.length = function (e) {
var t = e[0]
, r = e[1];
return Math.sqrt(t * t + r * r)
}
,
fe.len = fe.length,
fe.squaredLength = function (e) {
var t = e[0]
, r = e[1];
return t * t + r * r
}
,
fe.sqrLen = fe.squaredLength,
fe.negate = function (e, t) {
return e[0] = -t[0],
e[1] = -t[1],
e
}
,
fe.inverse = function (e, t) {
return e[0] = 1 / t[0],
e[1] = 1 / t[1],
e
}
,
fe.normalize = function (e, t) {
var r = t[0]
, i = t[1]
, n = r * r + i * i;
return n > 0 && (n = 1 / Math.sqrt(n),
e[0] = t[0] * n,
e[1] = t[1] * n),
e
}
,
fe.dot = function (e, t) {
return e[0] * t[0] + e[1] * t[1]
}
,
fe.cross = function (e, t, r) {
var i = t[0] * r[1] - t[1] * r[0];
return e[0] = e[1] = 0,
e[2] = i,
e
}
,
fe.lerp = function (e, t, r, i) {
var n = t[0]
, a = t[1];
return e[0] = n + i * (r[0] - n),
e[1] = a + i * (r[1] - a),
e
}
,
fe.random = function (e, t) {
t = t || 1;
var r = 2 * GLMAT_RANDOM() * Math.PI;
return e[0] = Math.cos(r) * t,
e[1] = Math.sin(r) * t,
e
}
,
fe.transformMat2 = function (e, t, r) {
var i = t[0]
, n = t[1];
return e[0] = r[0] * i + r[2] * n,
e[1] = r[1] * i + r[3] * n,
e
}
,
fe.transformMat2d = function (e, t, r) {
var i = t[0]
, n = t[1];
return e[0] = r[0] * i + r[2] * n + r[4],
e[1] = r[1] * i + r[3] * n + r[5],
e
}
,
fe.transformMat3 = function (e, t, r) {
var i = t[0]
, n = t[1];
return e[0] = r[0] * i + r[3] * n + r[6],
e[1] = r[1] * i + r[4] * n + r[7],
e
}
,
fe.transformMat4 = function (e, t, r) {
var i = t[0]
, n = t[1];
return e[0] = r[0] * i + r[4] * n + r[12],
e[1] = r[1] * i + r[5] * n + r[13],
e
}
,
fe.forEach = (he = fe.create(),
function (e, t, r, i, n, a) {
var o, s;
for (t || (t = 2),
r || (r = 0),
s = i ? Math.min(i * t + r, e.length) : e.length,
o = r; o < s; o += t)
he[0] = e[o],
he[1] = e[o + 1],
n(he, he, a),
e[o] = he[0],
e[o + 1] = he[1];
return e
}
);
const pe = fe;
var me = function (e, t) {
e = e || 0,
t = t || 0,
this.array = pe.fromValues(e, t),
this._dirty = !0
};
if (me.prototype = {
constructor: me,
add: function (e) {
return pe.add(this.array, this.array, e.array),
this._dirty = !0,
this
},
set: function (e, t) {
return this.array[0] = e,
this.array[1] = t,
this._dirty = !0,
this
},
setArray: function (e) {
return this.array[0] = e[0],
this.array[1] = e[1],
this._dirty = !0,
this
},
clone: function () {
return new me(this.x, this.y)
},
copy: function (e) {
return pe.copy(this.array, e.array),
this._dirty = !0,
this
},
cross: function (e, t) {
return pe.cross(e.array, this.array, t.array),
e._dirty = !0,
this
},
dist: function (e) {
return pe.dist(this.array, e.array)
},
distance: function (e) {
return pe.distance(this.array, e.array)
},
div: function (e) {
return pe.div(this.array, this.array, e.array),
this._dirty = !0,
this
},
divide: function (e) {
return pe.divide(this.array, this.array, e.array),
this._dirty = !0,
this
},
dot: function (e) {
return pe.dot(this.array, e.array)
},
len: function () {
return pe.len(this.array)
},
length: function () {
return pe.length(this.array)
},
lerp: function (e, t, r) {
return pe.lerp(this.array, e.array, t.array, r),
this._dirty = !0,
this
},
min: function (e) {
return pe.min(this.array, this.array, e.array),
this._dirty = !0,
this
},
max: function (e) {
return pe.max(this.array, this.array, e.array),
this._dirty = !0,
this
},
mul: function (e) {
return pe.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiply: function (e) {
return pe.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
negate: function () {
return pe.negate(this.array, this.array),
this._dirty = !0,
this
},
normalize: function () {
return pe.normalize(this.array, this.array),
this._dirty = !0,
this
},
random: function (e) {
return pe.random(this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return pe.scale(this.array, this.array, e),
this._dirty = !0,
this
},
scaleAndAdd: function (e, t) {
return pe.scaleAndAdd(this.array, this.array, e.array, t),
this._dirty = !0,
this
},
sqrDist: function (e) {
return pe.sqrDist(this.array, e.array)
},
squaredDistance: function (e) {
return pe.squaredDistance(this.array, e.array)
},
sqrLen: function () {
return pe.sqrLen(this.array)
},
squaredLength: function () {
return pe.squaredLength(this.array)
},
sub: function (e) {
return pe.sub(this.array, this.array, e.array),
this._dirty = !0,
this
},
subtract: function (e) {
return pe.subtract(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat2: function (e) {
return pe.transformMat2(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat2d: function (e) {
return pe.transformMat2d(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat3: function (e) {
return pe.transformMat3(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat4: function (e) {
return pe.transformMat4(this.array, this.array, e.array),
this._dirty = !0,
this
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
},
Object.defineProperty) {
var ge = me.prototype;
Object.defineProperty(ge, "x", {
get: function () {
return this.array[0]
},
set: function (e) {
this.array[0] = e,
this._dirty = !0
}
}),
Object.defineProperty(ge, "y", {
get: function () {
return this.array[1]
},
set: function (e) {
this.array[1] = e,
this._dirty = !0
}
})
}
me.add = function (e, t, r) {
return pe.add(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.set = function (e, t, r) {
return pe.set(e.array, t, r),
e._dirty = !0,
e
}
,
me.copy = function (e, t) {
return pe.copy(e.array, t.array),
e._dirty = !0,
e
}
,
me.cross = function (e, t, r) {
return pe.cross(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.distance = me.dist = function (e, t) {
return pe.distance(e.array, t.array)
}
,
me.divide = me.div = function (e, t, r) {
return pe.divide(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.dot = function (e, t) {
return pe.dot(e.array, t.array)
}
,
me.len = function (e) {
return pe.length(e.array)
}
,
me.lerp = function (e, t, r, i) {
return pe.lerp(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
me.min = function (e, t, r) {
return pe.min(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.max = function (e, t, r) {
return pe.max(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.multiply = me.mul = function (e, t, r) {
return pe.multiply(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.negate = function (e, t) {
return pe.negate(e.array, t.array),
e._dirty = !0,
e
}
,
me.normalize = function (e, t) {
return pe.normalize(e.array, t.array),
e._dirty = !0,
e
}
,
me.random = function (e, t) {
return pe.random(e.array, t),
e._dirty = !0,
e
}
,
me.scale = function (e, t, r) {
return pe.scale(e.array, t.array, r),
e._dirty = !0,
e
}
,
me.scaleAndAdd = function (e, t, r, i) {
return pe.scaleAndAdd(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
me.squaredDistance = me.sqrDist = function (e, t) {
return pe.sqrDist(e.array, t.array)
}
,
me.squaredLength = me.sqrLen = function (e) {
return pe.sqrLen(e.array)
}
,
me.subtract = me.sub = function (e, t, r) {
return pe.subtract(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.transformMat2 = function (e, t, r) {
return pe.transformMat2(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.transformMat2d = function (e, t, r) {
return pe.transformMat2d(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.transformMat3 = function (e, t, r) {
return pe.transformMat3(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
me.transformMat4 = function (e, t, r) {
return pe.transformMat4(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
const _e = me;
var ve = {};
function ye(e) {
for (var t = e.split("\n"), r = 0, i = t.length; r < i; r++)
t[r] = r + 1 + ": " + t[r];
return t.join("\n")
}
function xe(e, t, r) {
if (!e.getShaderParameter(t, e.COMPILE_STATUS))
return [e.getShaderInfoLog(t), ye(r)].join("\n")
}
var be = new U.Float32Array(16);
const we = m.extend({
uniformSemantics: {},
attributes: {}
}, (function () {
this._locations = {},
this._textureSlot = 0,
this._program = null
}
), {
bind: function (e) {
this._textureSlot = 0,
e.gl.useProgram(this._program)
},
hasUniform: function (e) {
return null != this._locations[e]
},
useTextureSlot: function (e, t, r) {
t && (e.gl.activeTexture(e.gl.TEXTURE0 + r),
t.isRenderable() ? t.bind(e) : t.unbind(e))
},
currentTextureSlot: function () {
return this._textureSlot
},
resetTextureSlot: function (e) {
this._textureSlot = e || 0
},
takeCurrentTextureSlot: function (e, t) {
var r = this._textureSlot;
return this.useTextureSlot(e, t, r),
this._textureSlot++,
r
},
setUniform: function (e, t, r, i) {
var n = this._locations[r];
if (null == n)
return !1;
switch (t) {
case "m4":
if (!(i instanceof Float32Array)) {
for (var a = 0; a < i.length; a++)
be[a] = i[a];
i = be
}
e.uniformMatrix4fv(n, !1, i);
break;
case "2i":
e.uniform2i(n, i[0], i[1]);
break;
case "2f":
e.uniform2f(n, i[0], i[1]);
break;
case "3i":
e.uniform3i(n, i[0], i[1], i[2]);
break;
case "3f":
e.uniform3f(n, i[0], i[1], i[2]);
break;
case "4i":
e.uniform4i(n, i[0], i[1], i[2], i[3]);
break;
case "4f":
e.uniform4f(n, i[0], i[1], i[2], i[3]);
break;
case "1i":
e.uniform1i(n, i);
break;
case "1f":
e.uniform1f(n, i);
break;
case "1fv":
e.uniform1fv(n, i);
break;
case "1iv":
e.uniform1iv(n, i);
break;
case "2iv":
e.uniform2iv(n, i);
break;
case "2fv":
e.uniform2fv(n, i);
break;
case "3iv":
e.uniform3iv(n, i);
break;
case "3fv":
e.uniform3fv(n, i);
break;
case "4iv":
e.uniform4iv(n, i);
break;
case "4fv":
e.uniform4fv(n, i);
break;
case "m2":
case "m2v":
e.uniformMatrix2fv(n, !1, i);
break;
case "m3":
case "m3v":
e.uniformMatrix3fv(n, !1, i);
break;
case "m4v":
if (Array.isArray(i) && Array.isArray(i[0])) {
var o = new U.Float32Array(16 * i.length)
, s = 0;
for (a = 0; a < i.length; a++)
for (var l = i[a], h = 0; h < 16; h++)
o[s++] = l[h];
e.uniformMatrix4fv(n, !1, o)
} else
e.uniformMatrix4fv(n, !1, i)
}
return !0
},
setUniformOfSemantic: function (e, t, r) {
var i = this.uniformSemantics[t];
return !!i && this.setUniform(e, i.type, i.symbol, r)
},
enableAttributes: function (e, t, r) {
var i, n = e.gl, a = this._program, o = this._locations;
(i = r ? r.__enabledAttributeList : ve[e.__uid__]) || (i = r ? r.__enabledAttributeList = [] : ve[e.__uid__] = []);
for (var s = [], l = 0; l < t.length; l++) {
var h = t[l];
if (this.attributes[h]) {
var u = o[h];
if (null == u) {
if (-1 === (u = n.getAttribLocation(a, h))) {
s[l] = -1;
continue
}
o[h] = u
}
s[l] = u,
i[u] ? i[u] = 2 : i[u] = 1
} else
s[l] = -1
}
for (l = 0; l < i.length; l++)
switch (i[l]) {
case 1:
n.enableVertexAttribArray(l),
i[l] = 3;
break;
case 2:
i[l] = 3;
break;
case 3:
n.disableVertexAttribArray(l),
i[l] = 0
}
return s
},
getAttribLocation: function (e, t) {
var r = this._locations
, i = r[t];
return null == i && (i = e.getAttribLocation(this._program, t),
r[t] = i),
i
},
buildProgram: function (e, t, r, i) {
var n = e.createShader(e.VERTEX_SHADER)
, a = e.createProgram();
e.shaderSource(n, r),
e.compileShader(n);
var o = e.createShader(e.FRAGMENT_SHADER);
e.shaderSource(o, i),
e.compileShader(o);
var s = xe(e, n, r);
if (s)
return s;
if (s = xe(e, o, i))
return s;
if (e.attachShader(a, n),
e.attachShader(a, o),
t.attributeSemantics.POSITION)
e.bindAttribLocation(a, 0, t.attributeSemantics.POSITION.symbol);
else {
var l = Object.keys(this.attributes);
e.bindAttribLocation(a, 0, l[0])
}
if (e.linkProgram(a),
e.deleteShader(n),
e.deleteShader(o),
this._program = a,
this.vertexCode = r,
this.fragmentCode = i,
!e.getProgramParameter(a, e.LINK_STATUS))
return "Could not link program\n" + e.getProgramInfoLog(a);
for (var h = 0; h < t.uniforms.length; h++) {
var u = t.uniforms[h];
this._locations[u] = e.getUniformLocation(a, u)
}
}
});
var Te = /for\s*?\(int\s*?_idx_\s*\=\s*([\w-]+)\;\s*_idx_\s*<\s*([\w-]+);\s*_idx_\s*\+\+\s*\)\s*\{\{([\s\S]+?)(?=\}\})\}\}/g;
function Se(e, t, r) {
var i = {};
for (var n in r)
i[n + "_COUNT"] = r[n];
return e.replace(Te, (function (e, r, n, a) {
var o = "";
isNaN(r) && (r = r in t ? t[r] : i[r]),
isNaN(n) && (n = n in t ? t[n] : i[n]);
for (var s = parseInt(r); s < parseInt(n); s++)
o += "{" + a.replace(/float\s*\(\s*_idx_\s*\)/g, s.toFixed(1)).replace(/_idx_/g, s) + "}";
return o
}
))
}
function Me(e, t, r) {
var i = [];
if (t)
for (var n in t) {
var a = t[n];
a > 0 && i.push("#define " + n.toUpperCase() + "_COUNT " + a)
}
if (r)
for (var o = 0; o < r.length; o++) {
var s = r[o];
i.push("#define " + s.toUpperCase() + "_ENABLED")
}
for (var s in e) {
var l = e[s];
null === l ? i.push("#define " + s) : i.push("#define " + s + " " + l.toString())
}
return i.join("\n")
}
function Ae(e) {
this._renderer = e,
this._cache = {}
}
Ae.prototype.getProgram = function (e, t, r) {
var i = this._cache
, n = e.isSkinnedMesh && e.isSkinnedMesh()
, a = e.isInstancedMesh && e.isInstancedMesh()
, o = "s" + t.shader.shaderID + "m" + t.getProgramKey();
if (r && (o += "se" + r.getProgramKey(e.lightGroup)),
n && (o += ",sk" + e.joints.length),
a && (o += ",is"),
v = i[o])
return v;
var s = r ? r.getLightsNumbers(e.lightGroup) : {}
, l = this._renderer
, h = l.gl
, u = t.getEnabledTextures()
, c = "";
if (n) {
var d = {
SKINNING: null,
JOINT_COUNT: e.joints.length
};
e.joints.length > l.getMaxJointNumber() && (d.USE_SKIN_MATRICES_TEXTURE = null),
c += "\n" + Me(d) + "\n"
}
a && (c += "\n#define INSTANCING\n");
var f = c + Me(t.vertexDefines, s, u)
, p = c + Me(t.fragmentDefines, s, u)
, m = f + "\n" + t.shader.vertex
, g = ["OES_standard_derivatives", "EXT_shader_texture_lod"].filter((function (e) {
return null != l.getGLExtension(e)
}
));
g.indexOf("EXT_shader_texture_lod") >= 0 && (p += "\n#define SUPPORT_TEXTURE_LOD"),
g.indexOf("OES_standard_derivatives") >= 0 && (p += "\n#define SUPPORT_STANDARD_DERIVATIVES");
var _, v, y = function (e) {
for (var t = [], r = 0; r < e.length; r++)
t.push("#extension GL_" + e[r] + " : enable");
return t.join("\n")
}(g) + "\n" + ["precision", _ = t.precision, "float"].join(" ") + ";\n" + ["precision", _, "int"].join(" ") + ";\n" + ["precision", _, "sampler2D"].join(" ") + ";\n\n" + p + "\n" + t.shader.fragment, x = Se(m, t.vertexDefines, s), b = Se(y, t.fragmentDefines, s);
(v = new we).uniformSemantics = t.shader.uniformSemantics,
v.attributes = t.shader.attributes;
var w = v.buildProgram(h, t.shader, x, b);
return v.__error = w,
i[o] = v,
v
}
;
const Ee = Ae;
var Ce = /uniform\s+(bool|float|int|vec2|vec3|vec4|ivec2|ivec3|ivec4|mat2|mat3|mat4|sampler2D|samplerCube)\s+([\s\S]*?);/g
, De = /attribute\s+(float|int|vec2|vec3|vec4)\s+([\s\S]*?);/g
, Le = /#define\s+(\w+)?(\s+[\d-.]+)?\s*;?\s*\n/g
, Pe = {
bool: "1i",
int: "1i",
sampler2D: "t",
samplerCube: "t",
float: "1f",
vec2: "2f",
vec3: "3f",
vec4: "4f",
ivec2: "2i",
ivec3: "3i",
ivec4: "4i",
mat2: "m2",
mat3: "m3",
mat4: "m4"
};
function Oe(e) {
for (var t = [], r = 0; r < e; r++)
t[r] = 0;
return t
}
var Ne = {
bool: function () {
return !0
},
int: function () {
return 0
},
float: function () {
return 0
},
sampler2D: function () {
return null
},
samplerCube: function () {
return null
},
vec2: function () {
return Oe(2)
},
vec3: function () {
return Oe(3)
},
vec4: function () {
return Oe(4)
},
ivec2: function () {
return Oe(2)
},
ivec3: function () {
return Oe(3)
},
ivec4: function () {
return Oe(4)
},
mat2: function () {
return Oe(4)
},
mat3: function () {
return Oe(9)
},
mat4: function () {
return Oe(16)
},
array: function () {
return []
}
}
, Ie = ["POSITION", "NORMAL", "BINORMAL", "TANGENT", "TEXCOORD", "TEXCOORD_0", "TEXCOORD_1", "COLOR", "JOINT", "WEIGHT"]
, Re = ["SKIN_MATRIX", "VIEWPORT_SIZE", "VIEWPORT", "DEVICEPIXELRATIO", "WINDOW_SIZE", "NEAR", "FAR", "TIME"]
, Be = ["WORLD", "VIEW", "PROJECTION", "WORLDVIEW", "VIEWPROJECTION", "WORLDVIEWPROJECTION", "WORLDINVERSE", "VIEWINVERSE", "PROJECTIONINVERSE", "WORLDVIEWINVERSE", "VIEWPROJECTIONINVERSE", "WORLDVIEWPROJECTIONINVERSE", "WORLDTRANSPOSE", "VIEWTRANSPOSE", "PROJECTIONTRANSPOSE", "WORLDVIEWTRANSPOSE", "VIEWPROJECTIONTRANSPOSE", "WORLDVIEWPROJECTIONTRANSPOSE", "WORLDINVERSETRANSPOSE", "VIEWINVERSETRANSPOSE", "PROJECTIONINVERSETRANSPOSE", "WORLDVIEWINVERSETRANSPOSE", "VIEWPROJECTIONINVERSETRANSPOSE", "WORLDVIEWPROJECTIONINVERSETRANSPOSE"]
, Fe = {
vec4: 4,
vec3: 3,
vec2: 2,
float: 1
}
, ze = {}
, Ge = {};
function Ue(e) {
return e.replace(/[ \t]*\/\/.*\n/g, "").replace(/[ \t]*\/\*[\s\S]*?\*\//g, "")
}
function ke() {
console.error("Wrong uniform/attributes syntax")
}
function Ve(e, t) {
for (var r = /[,=\(\):]/, i = t.replace(/:\s*\[\s*(.*)\s*\]/g, "=" + e + "($1)").replace(/\s+/g, "").split(/(?=[,=\(\):])/g), n = [], a = 0; a < i.length; a++)
i[a].match(r) ? n.push(i[a].charAt(0), i[a].slice(1)) : n.push(i[a]);
var o, s = 0, l = {}, h = null;
function u(e) {
e || ke();
var t = e.match(/\[(.*?)\]/);
o = e.replace(/\[(.*?)\]/, ""),
l[o] = {},
t && (l[o].isArray = !0,
l[o].arraySize = t[1])
}
for (u((i = n)[0]),
a = 1; a < i.length; a++) {
var c = i[a];
if (c)
if ("=" !== c)
if (":" !== c)
if ("," !== c)
if (")" !== c)
if ("(" !== c)
if (c.indexOf("vec") >= 0) {
if (1 !== s && 4 !== s) {
ke();
break
}
s = 2,
h = []
} else if (1 !== s)
if (4 !== s)
u(c),
s = 0;
else {
var d = c;
Ie.indexOf(d) >= 0 || Re.indexOf(d) >= 0 || Be.indexOf(d) >= 0 ? l[o].semantic = d : "ignore" === d || "unconfigurable" === d ? l[o].ignore = !0 : l[o].value = "bool" === e ? "true" === d : parseFloat(d)
}
else
l[o].value = "bool" === e ? "true" === c : parseFloat(c),
h = null;
else {
if (2 !== s) {
ke();
break
}
if (!(h instanceof Array)) {
ke();
break
}
h.push(+i[++a])
}
else
l[o].value = new U.Float32Array(h),
h = null,
s = 5;
else if (2 === s) {
if (!(h instanceof Array)) {
ke();
break
}
h.push(+i[++a])
} else
s = 5;
else
s = 4;
else {
if (0 !== s && 3 !== s) {
ke();
break
}
s = 1
}
}
return l
}
function He(e, t) {
"object" == typeof e && (t = e.fragment,
e = e.vertex),
e = Ue(e),
t = Ue(t),
this._shaderID = function (e, t) {
var r = "vertex:" + e + "fragment:" + t;
if (ze[r])
return ze[r];
var i = f.genGUID();
return ze[r] = i,
Ge[i] = {
vertex: e,
fragment: t
},
i
}(e, t),
this._vertexCode = He.parseImport(e),
this._fragmentCode = He.parseImport(t),
this.attributeSemantics = {},
this.matrixSemantics = {},
this.uniformSemantics = {},
this.matrixSemanticKeys = [],
this.uniformTemplates = {},
this.attributes = {},
this.textures = {},
this.vertexDefines = {},
this.fragmentDefines = {},
this._parseAttributes(),
this._parseUniforms(),
this._parseDefines()
}
He.prototype = {
constructor: He,
createUniforms: function () {
var e = {};
for (var t in this.uniformTemplates) {
var r = this.uniformTemplates[t];
e[t] = {
type: r.type,
value: r.value()
}
}
return e
},
_parseImport: function () {
this._vertexCode = He.parseImport(this.vertex),
this._fragmentCode = He.parseImport(this.fragment)
},
_addSemanticUniform: function (e, t, r) {
if (Ie.indexOf(r) >= 0)
this.attributeSemantics[r] = {
symbol: e,
type: t
};
else if (Be.indexOf(r) >= 0) {
var i = !1
, n = r;
r.match(/TRANSPOSE$/) && (i = !0,
n = r.slice(0, -9)),
this.matrixSemantics[r] = {
symbol: e,
type: t,
isTranspose: i,
semanticNoTranspose: n
}
} else
Re.indexOf(r) >= 0 && (this.uniformSemantics[r] = {
symbol: e,
type: t
})
},
_addMaterialUniform: function (e, t, r, i, n, a) {
a[e] = {
type: r,
value: n ? Ne.array : i || Ne[t],
semantic: null
}
},
_parseUniforms: function () {
var e = {}
, t = this;
function r(e) {
return null != e ? function () {
return e
}
: null
}
function i(i, n, a) {
var o = Ve(n, a)
, s = [];
for (var l in o) {
var h = o[l]
, u = h.semantic
, c = l
, d = Pe[n]
, f = r(o[l].value);
o[l].isArray && (c += "[" + o[l].arraySize + "]",
d += "v"),
s.push(c),
t._uniformList.push(l),
h.ignore || ("sampler2D" !== n && "samplerCube" !== n || (t.textures[l] = {
shaderType: "fragment",
type: n
}),
u ? t._addSemanticUniform(l, d, u) : t._addMaterialUniform(l, n, d, f, o[l].isArray, e))
}
return s.length > 0 ? "uniform " + n + " " + s.join(",") + ";\n" : ""
}
this._uniformList = [],
this._vertexCode = this._vertexCode.replace(Ce, i),
this._fragmentCode = this._fragmentCode.replace(Ce, i),
t.matrixSemanticKeys = Object.keys(this.matrixSemantics),
this.uniformTemplates = e
},
_parseAttributes: function () {
var e = {}
, t = this;
this._vertexCode = this._vertexCode.replace(De, (function (r, i, n) {
var a = Ve(i, n)
, o = Fe[i] || 1
, s = [];
for (var l in a) {
var h = a[l].semantic;
if (e[l] = {
type: "float",
size: o,
semantic: h || null
},
h) {
if (Ie.indexOf(h) < 0)
throw new Error('Unkown semantic "' + h + '"');
t.attributeSemantics[h] = {
symbol: l,
type: i
}
}
s.push(l)
}
return "attribute " + i + " " + s.join(",") + ";\n"
}
)),
this.attributes = e
},
_parseDefines: function () {
var e = this;
function t(t, r, i) {
var n = e.fragmentDefines;
return n[r] || (n[r] = "false" !== i && ("true" === i || (i ? isNaN(parseFloat(i)) ? i.trim() : parseFloat(i) : null))),
""
}
this._vertexCode = this._vertexCode.replace(Le, t),
this._fragmentCode = this._fragmentCode.replace(Le, t)
},
clone: function () {
var e = Ge[this._shaderID];
return new He(e.vertex, e.fragment)
}
},
Object.defineProperty && (Object.defineProperty(He.prototype, "shaderID", {
get: function () {
return this._shaderID
}
}),
Object.defineProperty(He.prototype, "vertex", {
get: function () {
return this._vertexCode
}
}),
Object.defineProperty(He.prototype, "fragment", {
get: function () {
return this._fragmentCode
}
}),
Object.defineProperty(He.prototype, "uniforms", {
get: function () {
return this._uniformList
}
}));
var We = /(@import)\s*([0-9a-zA-Z_\-\.]*)/g;
He.parseImport = function (e) {
return e.replace(We, (function (e, t, r) {
return (e = He.source(r)) ? He.parseImport(e) : (console.error('Shader chunk "' + r + '" not existed in library'),
"")
}
))
}
;
var je = /(@export)\s*([0-9a-zA-Z_\-\.]*)\s*\n([\s\S]*?)@end/g;
He.import = function (e) {
e.replace(je, (function (e, t, r, i) {
if (i = i.replace(/(^[\s\t\xa0\u3000]+)|([\u3000\xa0\s\t]+\x24)/g, "")) {
for (var n, a = r.split("."), o = He.codes, s = 0; s < a.length - 1;)
o[n = a[s++]] || (o[n] = {}),
o = o[n];
o[n = a[s]] = i
}
return i
}
))
}
,
He.codes = {},
He.source = function (e) {
for (var t = e.split("."), r = He.codes, i = 0; r && i < t.length;)
r = r[t[i++]];
return "string" != typeof r ? (console.error('Shader "' + e + '" not existed in library'),
"") : r
}
;
const Xe = He
, qe = "@export clay.prez.vertex\nuniform mat4 WVP : WORLDVIEWPROJECTION;\nattribute vec3 pos : POSITION;\nattribute vec2 uv : TEXCOORD_0;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\n@import clay.chunk.skinning_header\n@import clay.chunk.instancing_header\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec4 P = vec4(pos, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n gl_Position = WVP * P;\n v_Texcoord = uv * uvRepeat + uvOffset;\n}\n@end\n@export clay.prez.fragment\nuniform sampler2D alphaMap;\nuniform float alphaCutoff: 0.0;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n if (alphaCutoff > 0.0) {\n if (texture2D(alphaMap, v_Texcoord).a <= alphaCutoff) {\n discard;\n }\n }\n gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n}\n@end";
var Ze = {
create: function () {
var e = new ce(16);
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 0,
e[5] = 1,
e[6] = 0,
e[7] = 0,
e[8] = 0,
e[9] = 0,
e[10] = 1,
e[11] = 0,
e[12] = 0,
e[13] = 0,
e[14] = 0,
e[15] = 1,
e
},
clone: function (e) {
var t = new ce(16);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t[3] = e[3],
t[4] = e[4],
t[5] = e[5],
t[6] = e[6],
t[7] = e[7],
t[8] = e[8],
t[9] = e[9],
t[10] = e[10],
t[11] = e[11],
t[12] = e[12],
t[13] = e[13],
t[14] = e[14],
t[15] = e[15],
t
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e[4] = t[4],
e[5] = t[5],
e[6] = t[6],
e[7] = t[7],
e[8] = t[8],
e[9] = t[9],
e[10] = t[10],
e[11] = t[11],
e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15],
e
},
identity: function (e) {
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 0,
e[5] = 1,
e[6] = 0,
e[7] = 0,
e[8] = 0,
e[9] = 0,
e[10] = 1,
e[11] = 0,
e[12] = 0,
e[13] = 0,
e[14] = 0,
e[15] = 1,
e
},
transpose: function (e, t) {
if (e === t) {
var r = t[1]
, i = t[2]
, n = t[3]
, a = t[6]
, o = t[7]
, s = t[11];
e[1] = t[4],
e[2] = t[8],
e[3] = t[12],
e[4] = r,
e[6] = t[9],
e[7] = t[13],
e[8] = i,
e[9] = a,
e[11] = t[14],
e[12] = n,
e[13] = o,
e[14] = s
} else
e[0] = t[0],
e[1] = t[4],
e[2] = t[8],
e[3] = t[12],
e[4] = t[1],
e[5] = t[5],
e[6] = t[9],
e[7] = t[13],
e[8] = t[2],
e[9] = t[6],
e[10] = t[10],
e[11] = t[14],
e[12] = t[3],
e[13] = t[7],
e[14] = t[11],
e[15] = t[15];
return e
},
invert: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[7]
, u = t[8]
, c = t[9]
, d = t[10]
, f = t[11]
, p = t[12]
, m = t[13]
, g = t[14]
, _ = t[15]
, v = r * s - i * o
, y = r * l - n * o
, x = r * h - a * o
, b = i * l - n * s
, w = i * h - a * s
, T = n * h - a * l
, S = u * m - c * p
, M = u * g - d * p
, A = u * _ - f * p
, E = c * g - d * m
, C = c * _ - f * m
, D = d * _ - f * g
, L = v * D - y * C + x * E + b * A - w * M + T * S;
return L ? (L = 1 / L,
e[0] = (s * D - l * C + h * E) * L,
e[1] = (n * C - i * D - a * E) * L,
e[2] = (m * T - g * w + _ * b) * L,
e[3] = (d * w - c * T - f * b) * L,
e[4] = (l * A - o * D - h * M) * L,
e[5] = (r * D - n * A + a * M) * L,
e[6] = (g * x - p * T - _ * y) * L,
e[7] = (u * T - d * x + f * y) * L,
e[8] = (o * C - s * A + h * S) * L,
e[9] = (i * A - r * C - a * S) * L,
e[10] = (p * w - m * x + _ * v) * L,
e[11] = (c * x - u * w - f * v) * L,
e[12] = (s * M - o * E - l * S) * L,
e[13] = (r * E - i * M + n * S) * L,
e[14] = (m * y - p * b - g * v) * L,
e[15] = (u * b - c * y + d * v) * L,
e) : null
},
adjoint: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[7]
, u = t[8]
, c = t[9]
, d = t[10]
, f = t[11]
, p = t[12]
, m = t[13]
, g = t[14]
, _ = t[15];
return e[0] = s * (d * _ - f * g) - c * (l * _ - h * g) + m * (l * f - h * d),
e[1] = -(i * (d * _ - f * g) - c * (n * _ - a * g) + m * (n * f - a * d)),
e[2] = i * (l * _ - h * g) - s * (n * _ - a * g) + m * (n * h - a * l),
e[3] = -(i * (l * f - h * d) - s * (n * f - a * d) + c * (n * h - a * l)),
e[4] = -(o * (d * _ - f * g) - u * (l * _ - h * g) + p * (l * f - h * d)),
e[5] = r * (d * _ - f * g) - u * (n * _ - a * g) + p * (n * f - a * d),
e[6] = -(r * (l * _ - h * g) - o * (n * _ - a * g) + p * (n * h - a * l)),
e[7] = r * (l * f - h * d) - o * (n * f - a * d) + u * (n * h - a * l),
e[8] = o * (c * _ - f * m) - u * (s * _ - h * m) + p * (s * f - h * c),
e[9] = -(r * (c * _ - f * m) - u * (i * _ - a * m) + p * (i * f - a * c)),
e[10] = r * (s * _ - h * m) - o * (i * _ - a * m) + p * (i * h - a * s),
e[11] = -(r * (s * f - h * c) - o * (i * f - a * c) + u * (i * h - a * s)),
e[12] = -(o * (c * g - d * m) - u * (s * g - l * m) + p * (s * d - l * c)),
e[13] = r * (c * g - d * m) - u * (i * g - n * m) + p * (i * d - n * c),
e[14] = -(r * (s * g - l * m) - o * (i * g - n * m) + p * (i * l - n * s)),
e[15] = r * (s * d - l * c) - o * (i * d - n * c) + u * (i * l - n * s),
e
},
determinant: function (e) {
var t = e[0]
, r = e[1]
, i = e[2]
, n = e[3]
, a = e[4]
, o = e[5]
, s = e[6]
, l = e[7]
, h = e[8]
, u = e[9]
, c = e[10]
, d = e[11]
, f = e[12]
, p = e[13]
, m = e[14]
, g = e[15];
return (t * o - r * a) * (c * g - d * m) - (t * s - i * a) * (u * g - d * p) + (t * l - n * a) * (u * m - c * p) + (r * s - i * o) * (h * g - d * f) - (r * l - n * o) * (h * m - c * f) + (i * l - n * s) * (h * p - u * f)
},
multiply: function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = t[6]
, u = t[7]
, c = t[8]
, d = t[9]
, f = t[10]
, p = t[11]
, m = t[12]
, g = t[13]
, _ = t[14]
, v = t[15]
, y = r[0]
, x = r[1]
, b = r[2]
, w = r[3];
return e[0] = y * i + x * s + b * c + w * m,
e[1] = y * n + x * l + b * d + w * g,
e[2] = y * a + x * h + b * f + w * _,
e[3] = y * o + x * u + b * p + w * v,
y = r[4],
x = r[5],
b = r[6],
w = r[7],
e[4] = y * i + x * s + b * c + w * m,
e[5] = y * n + x * l + b * d + w * g,
e[6] = y * a + x * h + b * f + w * _,
e[7] = y * o + x * u + b * p + w * v,
y = r[8],
x = r[9],
b = r[10],
w = r[11],
e[8] = y * i + x * s + b * c + w * m,
e[9] = y * n + x * l + b * d + w * g,
e[10] = y * a + x * h + b * f + w * _,
e[11] = y * o + x * u + b * p + w * v,
y = r[12],
x = r[13],
b = r[14],
w = r[15],
e[12] = y * i + x * s + b * c + w * m,
e[13] = y * n + x * l + b * d + w * g,
e[14] = y * a + x * h + b * f + w * _,
e[15] = y * o + x * u + b * p + w * v,
e
},
multiplyAffine: function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[8]
, u = t[9]
, c = t[10]
, d = t[12]
, f = t[13]
, p = t[14]
, m = r[0]
, g = r[1]
, _ = r[2];
return e[0] = m * i + g * o + _ * h,
e[1] = m * n + g * s + _ * u,
e[2] = m * a + g * l + _ * c,
m = r[4],
g = r[5],
_ = r[6],
e[4] = m * i + g * o + _ * h,
e[5] = m * n + g * s + _ * u,
e[6] = m * a + g * l + _ * c,
m = r[8],
g = r[9],
_ = r[10],
e[8] = m * i + g * o + _ * h,
e[9] = m * n + g * s + _ * u,
e[10] = m * a + g * l + _ * c,
m = r[12],
g = r[13],
_ = r[14],
e[12] = m * i + g * o + _ * h + d,
e[13] = m * n + g * s + _ * u + f,
e[14] = m * a + g * l + _ * c + p,
e
}
};
Ze.mul = Ze.multiply,
Ze.mulAffine = Ze.multiplyAffine,
Ze.translate = function (e, t, r) {
var i, n, a, o, s, l, h, u, c, d, f, p, m = r[0], g = r[1], _ = r[2];
return t === e ? (e[12] = t[0] * m + t[4] * g + t[8] * _ + t[12],
e[13] = t[1] * m + t[5] * g + t[9] * _ + t[13],
e[14] = t[2] * m + t[6] * g + t[10] * _ + t[14],
e[15] = t[3] * m + t[7] * g + t[11] * _ + t[15]) : (i = t[0],
n = t[1],
a = t[2],
o = t[3],
s = t[4],
l = t[5],
h = t[6],
u = t[7],
c = t[8],
d = t[9],
f = t[10],
p = t[11],
e[0] = i,
e[1] = n,
e[2] = a,
e[3] = o,
e[4] = s,
e[5] = l,
e[6] = h,
e[7] = u,
e[8] = c,
e[9] = d,
e[10] = f,
e[11] = p,
e[12] = i * m + s * g + c * _ + t[12],
e[13] = n * m + l * g + d * _ + t[13],
e[14] = a * m + h * g + f * _ + t[14],
e[15] = o * m + u * g + p * _ + t[15]),
e
}
,
Ze.scale = function (e, t, r) {
var i = r[0]
, n = r[1]
, a = r[2];
return e[0] = t[0] * i,
e[1] = t[1] * i,
e[2] = t[2] * i,
e[3] = t[3] * i,
e[4] = t[4] * n,
e[5] = t[5] * n,
e[6] = t[6] * n,
e[7] = t[7] * n,
e[8] = t[8] * a,
e[9] = t[9] * a,
e[10] = t[10] * a,
e[11] = t[11] * a,
e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15],
e
}
,
Ze.rotate = function (e, t, r, i) {
var n, a, o, s, l, h, u, c, d, f, p, m, g, _, v, y, x, b, w, T, S, M, A, E, C = i[0], D = i[1], L = i[2], P = Math.sqrt(C * C + D * D + L * L);
return Math.abs(P) < ue ? null : (C *= P = 1 / P,
D *= P,
L *= P,
n = Math.sin(r),
o = 1 - (a = Math.cos(r)),
s = t[0],
l = t[1],
h = t[2],
u = t[3],
c = t[4],
d = t[5],
f = t[6],
p = t[7],
m = t[8],
g = t[9],
_ = t[10],
v = t[11],
y = C * C * o + a,
x = D * C * o + L * n,
b = L * C * o - D * n,
w = C * D * o - L * n,
T = D * D * o + a,
S = L * D * o + C * n,
M = C * L * o + D * n,
A = D * L * o - C * n,
E = L * L * o + a,
e[0] = s * y + c * x + m * b,
e[1] = l * y + d * x + g * b,
e[2] = h * y + f * x + _ * b,
e[3] = u * y + p * x + v * b,
e[4] = s * w + c * T + m * S,
e[5] = l * w + d * T + g * S,
e[6] = h * w + f * T + _ * S,
e[7] = u * w + p * T + v * S,
e[8] = s * M + c * A + m * E,
e[9] = l * M + d * A + g * E,
e[10] = h * M + f * A + _ * E,
e[11] = u * M + p * A + v * E,
t !== e && (e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15]),
e)
}
,
Ze.rotateX = function (e, t, r) {
var i = Math.sin(r)
, n = Math.cos(r)
, a = t[4]
, o = t[5]
, s = t[6]
, l = t[7]
, h = t[8]
, u = t[9]
, c = t[10]
, d = t[11];
return t !== e && (e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15]),
e[4] = a * n + h * i,
e[5] = o * n + u * i,
e[6] = s * n + c * i,
e[7] = l * n + d * i,
e[8] = h * n - a * i,
e[9] = u * n - o * i,
e[10] = c * n - s * i,
e[11] = d * n - l * i,
e
}
,
Ze.rotateY = function (e, t, r) {
var i = Math.sin(r)
, n = Math.cos(r)
, a = t[0]
, o = t[1]
, s = t[2]
, l = t[3]
, h = t[8]
, u = t[9]
, c = t[10]
, d = t[11];
return t !== e && (e[4] = t[4],
e[5] = t[5],
e[6] = t[6],
e[7] = t[7],
e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15]),
e[0] = a * n - h * i,
e[1] = o * n - u * i,
e[2] = s * n - c * i,
e[3] = l * n - d * i,
e[8] = a * i + h * n,
e[9] = o * i + u * n,
e[10] = s * i + c * n,
e[11] = l * i + d * n,
e
}
,
Ze.rotateZ = function (e, t, r) {
var i = Math.sin(r)
, n = Math.cos(r)
, a = t[0]
, o = t[1]
, s = t[2]
, l = t[3]
, h = t[4]
, u = t[5]
, c = t[6]
, d = t[7];
return t !== e && (e[8] = t[8],
e[9] = t[9],
e[10] = t[10],
e[11] = t[11],
e[12] = t[12],
e[13] = t[13],
e[14] = t[14],
e[15] = t[15]),
e[0] = a * n + h * i,
e[1] = o * n + u * i,
e[2] = s * n + c * i,
e[3] = l * n + d * i,
e[4] = h * n - a * i,
e[5] = u * n - o * i,
e[6] = c * n - s * i,
e[7] = d * n - l * i,
e
}
,
Ze.fromRotationTranslation = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = i + i
, l = n + n
, h = a + a
, u = i * s
, c = i * l
, d = i * h
, f = n * l
, p = n * h
, m = a * h
, g = o * s
, _ = o * l
, v = o * h;
return e[0] = 1 - (f + m),
e[1] = c + v,
e[2] = d - _,
e[3] = 0,
e[4] = c - v,
e[5] = 1 - (u + m),
e[6] = p + g,
e[7] = 0,
e[8] = d + _,
e[9] = p - g,
e[10] = 1 - (u + f),
e[11] = 0,
e[12] = r[0],
e[13] = r[1],
e[14] = r[2],
e[15] = 1,
e
}
,
Ze.fromQuat = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = r + r
, s = i + i
, l = n + n
, h = r * o
, u = i * o
, c = i * s
, d = n * o
, f = n * s
, p = n * l
, m = a * o
, g = a * s
, _ = a * l;
return e[0] = 1 - c - p,
e[1] = u + _,
e[2] = d - g,
e[3] = 0,
e[4] = u - _,
e[5] = 1 - h - p,
e[6] = f + m,
e[7] = 0,
e[8] = d + g,
e[9] = f - m,
e[10] = 1 - h - c,
e[11] = 0,
e[12] = 0,
e[13] = 0,
e[14] = 0,
e[15] = 1,
e
}
,
Ze.frustum = function (e, t, r, i, n, a, o) {
var s = 1 / (r - t)
, l = 1 / (n - i)
, h = 1 / (a - o);
return e[0] = 2 * a * s,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 0,
e[5] = 2 * a * l,
e[6] = 0,
e[7] = 0,
e[8] = (r + t) * s,
e[9] = (n + i) * l,
e[10] = (o + a) * h,
e[11] = -1,
e[12] = 0,
e[13] = 0,
e[14] = o * a * 2 * h,
e[15] = 0,
e
}
,
Ze.perspective = function (e, t, r, i, n) {
var a = 1 / Math.tan(t / 2)
, o = 1 / (i - n);
return e[0] = a / r,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 0,
e[5] = a,
e[6] = 0,
e[7] = 0,
e[8] = 0,
e[9] = 0,
e[10] = (n + i) * o,
e[11] = -1,
e[12] = 0,
e[13] = 0,
e[14] = 2 * n * i * o,
e[15] = 0,
e
}
,
Ze.ortho = function (e, t, r, i, n, a, o) {
var s = 1 / (t - r)
, l = 1 / (i - n)
, h = 1 / (a - o);
return e[0] = -2 * s,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 0,
e[5] = -2 * l,
e[6] = 0,
e[7] = 0,
e[8] = 0,
e[9] = 0,
e[10] = 2 * h,
e[11] = 0,
e[12] = (t + r) * s,
e[13] = (n + i) * l,
e[14] = (o + a) * h,
e[15] = 1,
e
}
,
Ze.lookAt = function (e, t, r, i) {
var n, a, o, s, l, h, u, c, d, f, p = t[0], m = t[1], g = t[2], _ = i[0], v = i[1], y = i[2], x = r[0], b = r[1], w = r[2];
return Math.abs(p - x) < ue && Math.abs(m - b) < ue && Math.abs(g - w) < ue ? Ze.identity(e) : (u = p - x,
c = m - b,
d = g - w,
n = v * (d *= f = 1 / Math.sqrt(u * u + c * c + d * d)) - y * (c *= f),
a = y * (u *= f) - _ * d,
o = _ * c - v * u,
(f = Math.sqrt(n * n + a * a + o * o)) ? (n *= f = 1 / f,
a *= f,
o *= f) : (n = 0,
a = 0,
o = 0),
s = c * o - d * a,
l = d * n - u * o,
h = u * a - c * n,
(f = Math.sqrt(s * s + l * l + h * h)) ? (s *= f = 1 / f,
l *= f,
h *= f) : (s = 0,
l = 0,
h = 0),
e[0] = n,
e[1] = s,
e[2] = u,
e[3] = 0,
e[4] = a,
e[5] = l,
e[6] = c,
e[7] = 0,
e[8] = o,
e[9] = h,
e[10] = d,
e[11] = 0,
e[12] = -(n * p + a * m + o * g),
e[13] = -(s * p + l * m + h * g),
e[14] = -(u * p + c * m + d * g),
e[15] = 1,
e)
}
,
Ze.frob = function (e) {
return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2) + Math.pow(e[9], 2) + Math.pow(e[10], 2) + Math.pow(e[11], 2) + Math.pow(e[12], 2) + Math.pow(e[13], 2) + Math.pow(e[14], 2) + Math.pow(e[15], 2))
}
;
const Ye = Ze;
var Ke = {
create: function () {
var e = new ce(3);
return e[0] = 0,
e[1] = 0,
e[2] = 0,
e
},
clone: function (e) {
var t = new ce(3);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t
},
fromValues: function (e, t, r) {
var i = new ce(3);
return i[0] = e,
i[1] = t,
i[2] = r,
i
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e
},
set: function (e, t, r, i) {
return e[0] = t,
e[1] = r,
e[2] = i,
e
},
add: function (e, t, r) {
return e[0] = t[0] + r[0],
e[1] = t[1] + r[1],
e[2] = t[2] + r[2],
e
},
subtract: function (e, t, r) {
return e[0] = t[0] - r[0],
e[1] = t[1] - r[1],
e[2] = t[2] - r[2],
e
}
};
Ke.sub = Ke.subtract,
Ke.multiply = function (e, t, r) {
return e[0] = t[0] * r[0],
e[1] = t[1] * r[1],
e[2] = t[2] * r[2],
e
}
,
Ke.mul = Ke.multiply,
Ke.divide = function (e, t, r) {
return e[0] = t[0] / r[0],
e[1] = t[1] / r[1],
e[2] = t[2] / r[2],
e
}
,
Ke.div = Ke.divide,
Ke.min = function (e, t, r) {
return e[0] = Math.min(t[0], r[0]),
e[1] = Math.min(t[1], r[1]),
e[2] = Math.min(t[2], r[2]),
e
}
,
Ke.max = function (e, t, r) {
return e[0] = Math.max(t[0], r[0]),
e[1] = Math.max(t[1], r[1]),
e[2] = Math.max(t[2], r[2]),
e
}
,
Ke.scale = function (e, t, r) {
return e[0] = t[0] * r,
e[1] = t[1] * r,
e[2] = t[2] * r,
e
}
,
Ke.scaleAndAdd = function (e, t, r, i) {
return e[0] = t[0] + r[0] * i,
e[1] = t[1] + r[1] * i,
e[2] = t[2] + r[2] * i,
e
}
,
Ke.distance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1]
, n = t[2] - e[2];
return Math.sqrt(r * r + i * i + n * n)
}
,
Ke.dist = Ke.distance,
Ke.squaredDistance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1]
, n = t[2] - e[2];
return r * r + i * i + n * n
}
,
Ke.sqrDist = Ke.squaredDistance,
Ke.length = function (e) {
var t = e[0]
, r = e[1]
, i = e[2];
return Math.sqrt(t * t + r * r + i * i)
}
,
Ke.len = Ke.length,
Ke.squaredLength = function (e) {
var t = e[0]
, r = e[1]
, i = e[2];
return t * t + r * r + i * i
}
,
Ke.sqrLen = Ke.squaredLength,
Ke.negate = function (e, t) {
return e[0] = -t[0],
e[1] = -t[1],
e[2] = -t[2],
e
}
,
Ke.inverse = function (e, t) {
return e[0] = 1 / t[0],
e[1] = 1 / t[1],
e[2] = 1 / t[2],
e
}
,
Ke.normalize = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = r * r + i * i + n * n;
return a > 0 && (a = 1 / Math.sqrt(a),
e[0] = t[0] * a,
e[1] = t[1] * a,
e[2] = t[2] * a),
e
}
,
Ke.dot = function (e, t) {
return e[0] * t[0] + e[1] * t[1] + e[2] * t[2]
}
,
Ke.cross = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = r[0]
, s = r[1]
, l = r[2];
return e[0] = n * l - a * s,
e[1] = a * o - i * l,
e[2] = i * s - n * o,
e
}
,
Ke.lerp = function (e, t, r, i) {
var n = t[0]
, a = t[1]
, o = t[2];
return e[0] = n + i * (r[0] - n),
e[1] = a + i * (r[1] - a),
e[2] = o + i * (r[2] - o),
e
}
,
Ke.random = function (e, t) {
t = t || 1;
var r = 2 * de() * Math.PI
, i = 2 * de() - 1
, n = Math.sqrt(1 - i * i) * t;
return e[0] = Math.cos(r) * n,
e[1] = Math.sin(r) * n,
e[2] = i * t,
e
}
,
Ke.transformMat4 = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = r[3] * i + r[7] * n + r[11] * a + r[15];
return o = o || 1,
e[0] = (r[0] * i + r[4] * n + r[8] * a + r[12]) / o,
e[1] = (r[1] * i + r[5] * n + r[9] * a + r[13]) / o,
e[2] = (r[2] * i + r[6] * n + r[10] * a + r[14]) / o,
e
}
,
Ke.transformMat3 = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2];
return e[0] = i * r[0] + n * r[3] + a * r[6],
e[1] = i * r[1] + n * r[4] + a * r[7],
e[2] = i * r[2] + n * r[5] + a * r[8],
e
}
,
Ke.transformQuat = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = r[0]
, s = r[1]
, l = r[2]
, h = r[3]
, u = h * i + s * a - l * n
, c = h * n + l * i - o * a
, d = h * a + o * n - s * i
, f = -o * i - s * n - l * a;
return e[0] = u * h + f * -o + c * -l - d * -s,
e[1] = c * h + f * -s + d * -o - u * -l,
e[2] = d * h + f * -l + u * -s - c * -o,
e
}
,
Ke.rotateX = function (e, t, r, i) {
var n = []
, a = [];
return n[0] = t[0] - r[0],
n[1] = t[1] - r[1],
n[2] = t[2] - r[2],
a[0] = n[0],
a[1] = n[1] * Math.cos(i) - n[2] * Math.sin(i),
a[2] = n[1] * Math.sin(i) + n[2] * Math.cos(i),
e[0] = a[0] + r[0],
e[1] = a[1] + r[1],
e[2] = a[2] + r[2],
e
}
,
Ke.rotateY = function (e, t, r, i) {
var n = []
, a = [];
return n[0] = t[0] - r[0],
n[1] = t[1] - r[1],
n[2] = t[2] - r[2],
a[0] = n[2] * Math.sin(i) + n[0] * Math.cos(i),
a[1] = n[1],
a[2] = n[2] * Math.cos(i) - n[0] * Math.sin(i),
e[0] = a[0] + r[0],
e[1] = a[1] + r[1],
e[2] = a[2] + r[2],
e
}
,
Ke.rotateZ = function (e, t, r, i) {
var n = []
, a = [];
return n[0] = t[0] - r[0],
n[1] = t[1] - r[1],
n[2] = t[2] - r[2],
a[0] = n[0] * Math.cos(i) - n[1] * Math.sin(i),
a[1] = n[0] * Math.sin(i) + n[1] * Math.cos(i),
a[2] = n[2],
e[0] = a[0] + r[0],
e[1] = a[1] + r[1],
e[2] = a[2] + r[2],
e
}
,
Ke.forEach = function () {
var e = Ke.create();
return function (t, r, i, n, a, o) {
var s, l;
for (r || (r = 3),
i || (i = 0),
l = n ? Math.min(n * r + i, t.length) : t.length,
s = i; s < l; s += r)
e[0] = t[s],
e[1] = t[s + 1],
e[2] = t[s + 2],
a(e, e, o),
t[s] = e[0],
t[s + 1] = e[1],
t[s + 2] = e[2];
return t
}
}(),
Ke.angle = function (e, t) {
var r = Ke.fromValues(e[0], e[1], e[2])
, i = Ke.fromValues(t[0], t[1], t[2]);
Ke.normalize(r, r),
Ke.normalize(i, i);
var n = Ke.dot(r, i);
return n > 1 ? 0 : Math.acos(n)
}
;
const Qe = Ke;
Xe.import(qe);
var Je = Ye.create
, $e = {};
function et(e) {
return e.material
}
function tt(e, t, r) {
return t.uniforms[r].value
}
function rt(e, t, r, i) {
return r !== i
}
function it(e) {
return !0
}
function nt() { }
var at = {
float: S,
byte: 5120,
ubyte: T,
short: 5122,
ushort: 5123
};
function ot(e, t, r) {
this.availableAttributes = e,
this.availableAttributeSymbols = t,
this.indicesBuffer = r,
this.vao = null
}
function st(e) {
var t, r;
this.bind = function (e) {
t || ((t = U.createCanvas()).width = t.height = 1,
t.getContext("2d"));
var i = e.gl
, n = !r;
n && (r = i.createTexture()),
i.bindTexture(i.TEXTURE_2D, r),
n && i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, i.RGBA, i.UNSIGNED_BYTE, t)
}
,
this.unbind = function (e) {
e.gl.bindTexture(e.gl.TEXTURE_2D, null)
}
,
this.isRenderable = function () {
return !0
}
}
var lt = m.extend((function () {
return {
canvas: null,
_width: 100,
_height: 100,
devicePixelRatio: "undefined" != typeof window && window.devicePixelRatio || 1,
clearColor: [0, 0, 0, 0],
clearBit: 17664,
alpha: !0,
depth: !0,
stencil: !1,
antialias: !0,
premultipliedAlpha: !0,
preserveDrawingBuffer: !1,
throwError: !0,
gl: null,
viewport: {},
maxJointNumber: 20,
__currentFrameBuffer: null,
_viewportStack: [],
_clearStack: [],
_sceneRendering: null
}
}
), (function () {
this.canvas || (this.canvas = U.createCanvas());
var e = this.canvas;
try {
var t = {
alpha: this.alpha,
depth: this.depth,
stencil: this.stencil,
antialias: this.antialias,
premultipliedAlpha: this.premultipliedAlpha,
preserveDrawingBuffer: this.preserveDrawingBuffer
};
if (this.gl = e.getContext("webgl", t) || e.getContext("experimental-webgl", t),
!this.gl)
throw new Error;
this._glinfo = new v(this.gl),
this.gl.targetRenderer && console.error("Already created a renderer"),
this.gl.targetRenderer = this,
this.resize()
} catch (e) {
throw "Error creating WebGL Context " + e
}
this._programMgr = new Ee(this),
this._placeholderTexture = new st(this)
}
), {
resize: function (e, t) {
var r = this.canvas
, i = this.devicePixelRatio;
null != e ? (r.style && (r.style.width = e + "px",
r.style.height = t + "px"),
r.width = e * i,
r.height = t * i,
this._width = e,
this._height = t) : (this._width = r.width / i,
this._height = r.height / i),
this.setViewport(0, 0, this._width, this._height)
},
getWidth: function () {
return this._width
},
getHeight: function () {
return this._height
},
getViewportAspect: function () {
var e = this.viewport;
return e.width / e.height
},
setDevicePixelRatio: function (e) {
this.devicePixelRatio = e,
this.resize(this._width, this._height)
},
getDevicePixelRatio: function () {
return this.devicePixelRatio
},
getGLExtension: function (e) {
return this._glinfo.getExtension(e)
},
getGLParameter: function (e) {
return this._glinfo.getParameter(e)
},
setViewport: function (e, t, r, i, n) {
if ("object" == typeof e) {
var a = e;
e = a.x,
t = a.y,
r = a.width,
i = a.height,
n = a.devicePixelRatio
}
n = n || this.devicePixelRatio,
this.gl.viewport(e * n, t * n, r * n, i * n),
this.viewport = {
x: e,
y: t,
width: r,
height: i,
devicePixelRatio: n
}
},
saveViewport: function () {
this._viewportStack.push(this.viewport)
},
restoreViewport: function () {
this._viewportStack.length > 0 && this.setViewport(this._viewportStack.pop())
},
saveClear: function () {
this._clearStack.push({
clearBit: this.clearBit,
clearColor: this.clearColor
})
},
restoreClear: function () {
if (this._clearStack.length > 0) {
var e = this._clearStack.pop();
this.clearColor = e.clearColor,
this.clearBit = e.clearBit
}
},
bindSceneRendering: function (e) {
this._sceneRendering = e
},
render: function (e, t, r, i) {
var n = this.gl
, a = this.clearColor;
if (this.clearBit) {
n.colorMask(!0, !0, !0, !0),
n.depthMask(!0);
var o = this.viewport
, s = !1
, l = o.devicePixelRatio;
(o.width !== this._width || o.height !== this._height || l && l !== this.devicePixelRatio || o.x || o.y) && (s = !0,
n.enable(n.SCISSOR_TEST),
n.scissor(o.x * l, o.y * l, o.width * l, o.height * l)),
n.clearColor(a[0], a[1], a[2], a[3]),
n.clear(this.clearBit),
s && n.disable(n.SCISSOR_TEST)
}
if (r || e.update(!1),
e.updateLights(),
t = t || e.getMainCamera()) {
t.update();
var h = e.updateRenderList(t, !0);
this._sceneRendering = e;
var u = h.opaque
, c = h.transparent
, d = e.material;
e.trigger("beforerender", this, e, t, h),
i ? (this.renderPreZ(u, e, t),
n.depthFunc(n.LEQUAL)) : n.depthFunc(n.LESS);
for (var f = Je(), p = Qe.create(), m = 0; m < c.length; m++) {
var g = c[m];
Ye.multiplyAffine(f, t.viewMatrix.array, g.worldTransform.array),
Qe.transformMat4(p, g.position.array, f),
g.__depth = p[2]
}
this.renderPass(u, t, {
getMaterial: function (e) {
return d || e.material
},
sortCompare: this.opaqueSortCompare
}),
this.renderPass(c, t, {
getMaterial: function (e) {
return d || e.material
},
sortCompare: this.transparentSortCompare
}),
e.trigger("afterrender", this, e, t, h),
this._sceneRendering = null
} else
console.error("Can't find camera in the scene.")
},
getProgram: function (e, t, r) {
return t = t || e.material,
this._programMgr.getProgram(e, t, r)
},
validateProgram: function (e) {
if (e.__error) {
var t = e.__error;
if ($e[e.__uid__])
return;
if ($e[e.__uid__] = !0,
this.throwError)
throw new Error(t);
this.trigger("error", t)
}
},
updatePrograms: function (e, t, r) {
var i = r && r.getMaterial || et;
t = t || null;
for (var n = 0; n < e.length; n++) {
var a = e[n]
, o = i.call(this, a);
if (n > 0) {
var s = e[n - 1]
, l = s.joints ? s.joints.length : 0;
if ((a.joints ? a.joints.length : 0) === l && a.material === s.material && a.lightGroup === s.lightGroup) {
a.__program = s.__program;
continue
}
}
var h = this._programMgr.getProgram(a, o, t);
this.validateProgram(h),
a.__program = h
}
},
renderPass: function (e, t, r) {
this.trigger("beforerenderpass", this, e, t, r),
(r = r || {}).getMaterial = r.getMaterial || et,
r.getUniform = r.getUniform || tt,
r.isMaterialChanged = r.isMaterialChanged || rt,
r.beforeRender = r.beforeRender || nt,
r.afterRender = r.afterRender || nt;
var i = r.ifRender || it;
this.updatePrograms(e, this._sceneRendering, r),
r.sortCompare && e.sort(r.sortCompare);
var n = this.viewport
, a = n.devicePixelRatio
, o = [n.x * a, n.y * a, n.width * a, n.height * a]
, s = this.devicePixelRatio
, l = this.__currentFrameBuffer ? [this.__currentFrameBuffer.getTextureWidth(), this.__currentFrameBuffer.getTextureHeight()] : [this._width * s, this._height * s]
, h = [o[2], o[3]]
, u = Date.now();
t ? (Ye.copy(ht.VIEW, t.viewMatrix.array),
Ye.copy(ht.PROJECTION, t.projectionMatrix.array),
Ye.copy(ht.VIEWINVERSE, t.worldTransform.array)) : (Ye.identity(ht.VIEW),
Ye.identity(ht.PROJECTION),
Ye.identity(ht.VIEWINVERSE)),
Ye.multiply(ht.VIEWPROJECTION, ht.PROJECTION, ht.VIEW),
Ye.invert(ht.PROJECTIONINVERSE, ht.PROJECTION),
Ye.invert(ht.VIEWPROJECTIONINVERSE, ht.VIEWPROJECTION);
for (var c, d, f, p, m, g, _, v, y, x, b, w, T = this.gl, S = this._sceneRendering, M = 0; M < e.length; M++) {
var A, E = e[M], C = null != E.worldTransform;
if (i(E)) {
C && (A = E.isSkinnedMesh && E.isSkinnedMesh() ? E.offsetMatrix ? E.offsetMatrix.array : ht.IDENTITY : E.worldTransform.array);
var D = E.geometry
, L = r.getMaterial.call(this, E)
, P = E.__program
, O = L.shader
, N = D.__uid__ + "-" + P.__uid__
, I = N !== x;
x = N,
C && (Ye.copy(ht.WORLD, A),
Ye.multiply(ht.WORLDVIEWPROJECTION, ht.VIEWPROJECTION, A),
Ye.multiplyAffine(ht.WORLDVIEW, ht.VIEW, A),
(O.matrixSemantics.WORLDINVERSE || O.matrixSemantics.WORLDINVERSETRANSPOSE) && Ye.invert(ht.WORLDINVERSE, A),
(O.matrixSemantics.WORLDVIEWINVERSE || O.matrixSemantics.WORLDVIEWINVERSETRANSPOSE) && Ye.invert(ht.WORLDVIEWINVERSE, ht.WORLDVIEW),
(O.matrixSemantics.WORLDVIEWPROJECTIONINVERSE || O.matrixSemantics.WORLDVIEWPROJECTIONINVERSETRANSPOSE) && Ye.invert(ht.WORLDVIEWPROJECTIONINVERSE, ht.WORLDVIEWPROJECTION)),
E.beforeRender && E.beforeRender(this),
r.beforeRender.call(this, E, L, c);
var R = P !== d;
R ? (P.bind(this),
P.setUniformOfSemantic(T, "VIEWPORT", o),
P.setUniformOfSemantic(T, "WINDOW_SIZE", l),
t && (P.setUniformOfSemantic(T, "NEAR", t.near),
P.setUniformOfSemantic(T, "FAR", t.far)),
P.setUniformOfSemantic(T, "DEVICEPIXELRATIO", a),
P.setUniformOfSemantic(T, "TIME", u),
P.setUniformOfSemantic(T, "VIEWPORT_SIZE", h),
S && S.setLightUniforms(P, E.lightGroup, this)) : P = d,
(R || r.isMaterialChanged(E, f, L, c)) && (L.depthTest !== p && (L.depthTest ? T.enable(T.DEPTH_TEST) : T.disable(T.DEPTH_TEST),
p = L.depthTest),
L.depthMask !== m && (T.depthMask(L.depthMask),
m = L.depthMask),
L.transparent !== y && (L.transparent ? T.enable(T.BLEND) : T.disable(T.BLEND),
y = L.transparent),
L.transparent && (L.blend ? L.blend(T) : (T.blendEquationSeparate(T.FUNC_ADD, T.FUNC_ADD),
T.blendFuncSeparate(T.SRC_ALPHA, T.ONE_MINUS_SRC_ALPHA, T.ONE, T.ONE_MINUS_SRC_ALPHA))),
w = this._bindMaterial(E, L, P, f || null, c || null, d || null, r.getUniform),
c = L);
var B = O.matrixSemanticKeys;
if (C)
for (var F = 0; F < B.length; F++) {
var z = B[F]
, G = O.matrixSemantics[z]
, U = ht[z];
if (G.isTranspose) {
var k = ht[G.semanticNoTranspose];
Ye.transpose(U, k)
}
P.setUniform(T, G.type, G.symbol, U)
}
E.cullFace !== _ && (_ = E.cullFace,
T.cullFace(_)),
E.frontFace !== v && (v = E.frontFace,
T.frontFace(v)),
E.culling !== g && ((g = E.culling) ? T.enable(T.CULL_FACE) : T.disable(T.CULL_FACE)),
this._updateSkeleton(E, P, w),
I && (b = this._bindVAO(null, O, D, P)),
this._renderObject(E, b, P),
r.afterRender(this, E),
E.afterRender && E.afterRender(this),
d = P,
f = E
}
}
this.trigger("afterrenderpass", this, e, t, r)
},
getMaxJointNumber: function () {
return this.maxJointNumber
},
_updateSkeleton: function (e, t, r) {
var i = this.gl
, n = e.skeleton;
if (n)
if (n.update(),
e.joints.length > this.getMaxJointNumber()) {
var a = n.getSubSkinMatricesTexture(e.__uid__, e.joints);
t.useTextureSlot(this, a, r),
t.setUniform(i, "1i", "skinMatricesTexture", r),
t.setUniform(i, "1f", "skinMatricesTextureSize", a.width)
} else {
var o = n.getSubSkinMatrices(e.__uid__, e.joints);
t.setUniformOfSemantic(i, "SKIN_MATRIX", o)
}
},
_renderObject: function (e, t, r) {
var i = this.gl
, n = e.geometry
, a = e.mode;
null == a && (a = 4);
var o = null
, s = e.isInstancedMesh && e.isInstancedMesh();
if (!s || (o = this.getGLExtension("ANGLE_instanced_arrays"))) {
var l;
if (s && (l = this._bindInstancedAttributes(e, r, o)),
t.indicesBuffer) {
var h = this.getGLExtension("OES_element_index_uint") && n.indices instanceof Uint32Array ? i.UNSIGNED_INT : i.UNSIGNED_SHORT;
s ? o.drawElementsInstancedANGLE(a, t.indicesBuffer.count, h, 0, e.getInstanceCount()) : i.drawElements(a, t.indicesBuffer.count, h, 0)
} else
s ? o.drawArraysInstancedANGLE(a, 0, n.vertexCount, e.getInstanceCount()) : i.drawArrays(a, 0, n.vertexCount);
if (s)
for (var u = 0; u < l.length; u++)
i.disableVertexAttribArray(l[u])
} else
console.warn("Device not support ANGLE_instanced_arrays extension")
},
_bindInstancedAttributes: function (e, t, r) {
for (var i = this.gl, n = e.getInstancedAttributesBuffers(this), a = [], o = 0; o < n.length; o++) {
var s = n[o]
, l = t.getAttribLocation(i, s.symbol);
if (!(l < 0)) {
var h = at[s.type] || i.FLOAT;
i.enableVertexAttribArray(l),
i.bindBuffer(i.ARRAY_BUFFER, s.buffer),
i.vertexAttribPointer(l, s.size, h, !1, 0, 0),
r.vertexAttribDivisorANGLE(l, s.divisor),
a.push(l)
}
}
return a
},
_bindMaterial: function (e, t, r, i, n, a, o) {
for (var s = this.gl, l = a === r, h = r.currentTextureSlot(), u = t.getEnabledUniforms(), c = t.getTextureUniforms(), d = this._placeholderTexture, f = 0; f < c.length; f++) {
var p = o(e, t, _ = c[f]);
if ("t" === (g = t.uniforms[_].type) && p)
p.__slot = -1;
else if ("tv" === g)
for (var m = 0; m < p.length; m++)
p[m] && (p[m].__slot = -1)
}
for (d.__slot = -1,
f = 0; f < u.length; f++) {
var g, _ = u[f], v = t.uniforms[_], y = (p = o(e, t, _),
"t" === (g = v.type));
if (y && (p && p.isRenderable() || (p = d)),
n && l) {
var x = o(i, n, _);
if (y && (x && x.isRenderable() || (x = d)),
x === p) {
if (y)
r.takeCurrentTextureSlot(this, null);
else if ("tv" === g && p)
for (m = 0; m < p.length; m++)
r.takeCurrentTextureSlot(this, null);
continue
}
}
if (null != p)
if (y)
if (p.__slot < 0) {
var b = r.currentTextureSlot();
r.setUniform(s, "1i", _, b) && (r.takeCurrentTextureSlot(this, p),
p.__slot = b)
} else
r.setUniform(s, "1i", _, p.__slot);
else if (Array.isArray(p)) {
if (0 === p.length)
continue;
if ("tv" === g) {
if (!r.hasUniform(_))
continue;
var w = [];
for (m = 0; m < p.length; m++) {
var T = p[m];
T.__slot < 0 ? (b = r.currentTextureSlot(),
w.push(b),
r.takeCurrentTextureSlot(this, T),
T.__slot = b) : w.push(T.__slot)
}
r.setUniform(s, "1iv", _, w)
} else
r.setUniform(s, v.type, _, p)
} else
r.setUniform(s, v.type, _, p)
}
var S = r.currentTextureSlot();
return r.resetTextureSlot(h),
S
},
_bindVAO: function (e, t, r, i) {
var n = !r.dynamic
, a = this.gl
, o = this.__uid__ + "-" + i.__uid__
, s = r.__vaoCache[o];
if (!s) {
var l = r.getBufferChunks(this);
if (!l || !l.length)
return;
for (var h = l[0], u = h.attributeBuffers, c = h.indicesBuffer, d = [], f = [], p = 0; p < u.length; p++) {
var m, g = (w = u[p]).name, _ = w.semantic;
if (_) {
var v = t.attributeSemantics[_];
m = v && v.symbol
} else
m = g;
m && i.attributes[m] && (d.push(w),
f.push(m))
}
s = new ot(d, f, c),
n && (r.__vaoCache[o] = s)
}
var y = !0;
if (e && n && (null == s.vao ? s.vao = e.createVertexArrayOES() : y = !1,
e.bindVertexArrayOES(s.vao)),
d = s.availableAttributes,
c = s.indicesBuffer,
y) {
var x = i.enableAttributes(this, s.availableAttributeSymbols, e && n && s);
for (p = 0; p < d.length; p++) {
var b = x[p];
if (-1 !== b) {
var w, T = (w = d[p]).buffer, S = w.size, M = at[w.type] || a.FLOAT;
a.bindBuffer(a.ARRAY_BUFFER, T),
a.vertexAttribPointer(b, S, M, !1, 0, 0)
}
}
r.isUseIndices() && a.bindBuffer(a.ELEMENT_ARRAY_BUFFER, c.buffer)
}
return s
},
renderPreZ: function (e, t, r) {
var i = this.gl
, n = this._prezMaterial || new le({
shader: new Xe(Xe.source("clay.prez.vertex"), Xe.source("clay.prez.fragment"))
});
this._prezMaterial = n,
i.colorMask(!1, !1, !1, !1),
i.depthMask(!0),
this.renderPass(e, r, {
ifRender: function (e) {
return !e.ignorePreZ
},
isMaterialChanged: function (e, t) {
var r = e.material
, i = t.material;
return r.get("diffuseMap") !== i.get("diffuseMap") || (r.get("alphaCutoff") || 0) !== (i.get("alphaCutoff") || 0)
},
getUniform: function (e, t, r) {
return "alphaMap" === r ? e.material.get("diffuseMap") : "alphaCutoff" === r ? e.material.isDefined("fragment", "ALPHA_TEST") && e.material.get("diffuseMap") && e.material.get("alphaCutoff") || 0 : "uvRepeat" === r ? e.material.get("uvRepeat") : "uvOffset" === r ? e.material.get("uvOffset") : t.get(r)
},
getMaterial: function () {
return n
},
sort: this.opaqueSortCompare
}),
i.colorMask(!0, !0, !0, !0),
i.depthMask(!0)
},
disposeScene: function (e) {
this.disposeNode(e, !0, !0),
e.dispose()
},
disposeNode: function (e, t, r) {
e.getParent() && e.getParent().remove(e);
var i = {};
e.traverse((function (e) {
var n = e.material;
if (e.geometry && t && e.geometry.dispose(this),
r && n && !i[n.__uid__]) {
for (var a = n.getTextureUniforms(), o = 0; o < a.length; o++) {
var s = a[o]
, l = n.uniforms[s].value
, h = n.uniforms[s].type;
if (l)
if ("t" === h)
l.dispose && l.dispose(this);
else if ("tv" === h)
for (var u = 0; u < l.length; u++)
l[u] && l[u].dispose && l[u].dispose(this)
}
i[n.__uid__] = !0
}
e.dispose && e.dispose(this)
}
), this)
},
disposeGeometry: function (e) {
e.dispose(this)
},
disposeTexture: function (e) {
e.dispose(this)
},
disposeFrameBuffer: function (e) {
e.dispose(this)
},
dispose: function () { },
screenToNDC: function (e, t, r) {
r || (r = new _e),
t = this._height - t;
var i = this.viewport
, n = r.array;
return n[0] = (e - i.x) / i.width,
n[0] = 2 * n[0] - 1,
n[1] = (t - i.y) / i.height,
n[1] = 2 * n[1] - 1,
r
}
});
lt.opaqueSortCompare = lt.prototype.opaqueSortCompare = function (e, t) {
return e.renderOrder === t.renderOrder ? e.__program === t.__program ? e.material === t.material ? e.geometry.__uid__ - t.geometry.__uid__ : e.material.__uid__ - t.material.__uid__ : e.__program && t.__program ? e.__program.__uid__ - t.__program.__uid__ : 0 : e.renderOrder - t.renderOrder
}
,
lt.transparentSortCompare = lt.prototype.transparentSortCompare = function (e, t) {
return e.renderOrder === t.renderOrder ? e.__depth === t.__depth ? e.__program === t.__program ? e.material === t.material ? e.geometry.__uid__ - t.geometry.__uid__ : e.material.__uid__ - t.material.__uid__ : e.__program && t.__program ? e.__program.__uid__ - t.__program.__uid__ : 0 : e.__depth - t.__depth : e.renderOrder - t.renderOrder
}
;
var ht = {
IDENTITY: Je(),
WORLD: Je(),
VIEW: Je(),
PROJECTION: Je(),
WORLDVIEW: Je(),
VIEWPROJECTION: Je(),
WORLDVIEWPROJECTION: Je(),
WORLDINVERSE: Je(),
VIEWINVERSE: Je(),
PROJECTIONINVERSE: Je(),
WORLDVIEWINVERSE: Je(),
VIEWPROJECTIONINVERSE: Je(),
WORLDVIEWPROJECTIONINVERSE: Je(),
WORLDTRANSPOSE: Je(),
VIEWTRANSPOSE: Je(),
PROJECTIONTRANSPOSE: Je(),
WORLDVIEWTRANSPOSE: Je(),
VIEWPROJECTIONTRANSPOSE: Je(),
WORLDVIEWPROJECTIONTRANSPOSE: Je(),
WORLDINVERSETRANSPOSE: Je(),
VIEWINVERSETRANSPOSE: Je(),
PROJECTIONINVERSETRANSPOSE: Je(),
WORLDVIEWINVERSETRANSPOSE: Je(),
VIEWPROJECTIONINVERSETRANSPOSE: Je(),
WORLDVIEWPROJECTIONINVERSETRANSPOSE: Je()
};
lt.COLOR_BUFFER_BIT = 16384,
lt.DEPTH_BUFFER_BIT = 256,
lt.STENCIL_BUFFER_BIT = 1024;
const ut = lt;
var ct = function (e, t, r) {
e = e || 0,
t = t || 0,
r = r || 0,
this.array = Qe.fromValues(e, t, r),
this._dirty = !0
};
ct.prototype = {
constructor: ct,
add: function (e) {
return Qe.add(this.array, this.array, e.array),
this._dirty = !0,
this
},
set: function (e, t, r) {
return this.array[0] = e,
this.array[1] = t,
this.array[2] = r,
this._dirty = !0,
this
},
setArray: function (e) {
return this.array[0] = e[0],
this.array[1] = e[1],
this.array[2] = e[2],
this._dirty = !0,
this
},
clone: function () {
return new ct(this.x, this.y, this.z)
},
copy: function (e) {
return Qe.copy(this.array, e.array),
this._dirty = !0,
this
},
cross: function (e, t) {
return Qe.cross(this.array, e.array, t.array),
this._dirty = !0,
this
},
dist: function (e) {
return Qe.dist(this.array, e.array)
},
distance: function (e) {
return Qe.distance(this.array, e.array)
},
div: function (e) {
return Qe.div(this.array, this.array, e.array),
this._dirty = !0,
this
},
divide: function (e) {
return Qe.divide(this.array, this.array, e.array),
this._dirty = !0,
this
},
dot: function (e) {
return Qe.dot(this.array, e.array)
},
len: function () {
return Qe.len(this.array)
},
length: function () {
return Qe.length(this.array)
},
lerp: function (e, t, r) {
return Qe.lerp(this.array, e.array, t.array, r),
this._dirty = !0,
this
},
min: function (e) {
return Qe.min(this.array, this.array, e.array),
this._dirty = !0,
this
},
max: function (e) {
return Qe.max(this.array, this.array, e.array),
this._dirty = !0,
this
},
mul: function (e) {
return Qe.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Qe.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
negate: function () {
return Qe.negate(this.array, this.array),
this._dirty = !0,
this
},
normalize: function () {
return Qe.normalize(this.array, this.array),
this._dirty = !0,
this
},
random: function (e) {
return Qe.random(this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return Qe.scale(this.array, this.array, e),
this._dirty = !0,
this
},
scaleAndAdd: function (e, t) {
return Qe.scaleAndAdd(this.array, this.array, e.array, t),
this._dirty = !0,
this
},
sqrDist: function (e) {
return Qe.sqrDist(this.array, e.array)
},
squaredDistance: function (e) {
return Qe.squaredDistance(this.array, e.array)
},
sqrLen: function () {
return Qe.sqrLen(this.array)
},
squaredLength: function () {
return Qe.squaredLength(this.array)
},
sub: function (e) {
return Qe.sub(this.array, this.array, e.array),
this._dirty = !0,
this
},
subtract: function (e) {
return Qe.subtract(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat3: function (e) {
return Qe.transformMat3(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat4: function (e) {
return Qe.transformMat4(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformQuat: function (e) {
return Qe.transformQuat(this.array, this.array, e.array),
this._dirty = !0,
this
},
applyProjection: function (e) {
var t = this.array;
if (0 === (e = e.array)[15]) {
var r = -1 / t[2];
t[0] = e[0] * t[0] * r,
t[1] = e[5] * t[1] * r,
t[2] = (e[10] * t[2] + e[14]) * r
} else
t[0] = e[0] * t[0] + e[12],
t[1] = e[5] * t[1] + e[13],
t[2] = e[10] * t[2] + e[14];
return this._dirty = !0,
this
},
eulerFromQuat: function (e, t) {
ct.eulerFromQuat(this, e, t)
},
eulerFromMat3: function (e, t) {
ct.eulerFromMat3(this, e, t)
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
};
var dt = Object.defineProperty;
if (dt) {
var ft = ct.prototype;
dt(ft, "x", {
get: function () {
return this.array[0]
},
set: function (e) {
this.array[0] = e,
this._dirty = !0
}
}),
dt(ft, "y", {
get: function () {
return this.array[1]
},
set: function (e) {
this.array[1] = e,
this._dirty = !0
}
}),
dt(ft, "z", {
get: function () {
return this.array[2]
},
set: function (e) {
this.array[2] = e,
this._dirty = !0
}
})
}
function pt(e, t, r) {
return e < t ? t : e > r ? r : e
}
ct.add = function (e, t, r) {
return Qe.add(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.set = function (e, t, r, i) {
Qe.set(e.array, t, r, i),
e._dirty = !0
}
,
ct.copy = function (e, t) {
return Qe.copy(e.array, t.array),
e._dirty = !0,
e
}
,
ct.cross = function (e, t, r) {
return Qe.cross(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.distance = ct.dist = function (e, t) {
return Qe.distance(e.array, t.array)
}
,
ct.divide = ct.div = function (e, t, r) {
return Qe.divide(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.dot = function (e, t) {
return Qe.dot(e.array, t.array)
}
,
ct.len = function (e) {
return Qe.length(e.array)
}
,
ct.lerp = function (e, t, r, i) {
return Qe.lerp(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
ct.min = function (e, t, r) {
return Qe.min(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.max = function (e, t, r) {
return Qe.max(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.multiply = ct.mul = function (e, t, r) {
return Qe.multiply(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.negate = function (e, t) {
return Qe.negate(e.array, t.array),
e._dirty = !0,
e
}
,
ct.normalize = function (e, t) {
return Qe.normalize(e.array, t.array),
e._dirty = !0,
e
}
,
ct.random = function (e, t) {
return Qe.random(e.array, t),
e._dirty = !0,
e
}
,
ct.scale = function (e, t, r) {
return Qe.scale(e.array, t.array, r),
e._dirty = !0,
e
}
,
ct.scaleAndAdd = function (e, t, r, i) {
return Qe.scaleAndAdd(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
ct.squaredDistance = ct.sqrDist = function (e, t) {
return Qe.sqrDist(e.array, t.array)
}
,
ct.squaredLength = ct.sqrLen = function (e) {
return Qe.sqrLen(e.array)
}
,
ct.subtract = ct.sub = function (e, t, r) {
return Qe.subtract(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.transformMat3 = function (e, t, r) {
return Qe.transformMat3(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.transformMat4 = function (e, t, r) {
return Qe.transformMat4(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
ct.transformQuat = function (e, t, r) {
return Qe.transformQuat(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
var mt = Math.atan2
, gt = Math.asin
, _t = Math.abs;
ct.eulerFromQuat = function (e, t, r) {
e._dirty = !0,
t = t.array;
var i = e.array
, n = t[0]
, a = t[1]
, o = t[2]
, s = t[3]
, l = n * n
, h = a * a
, u = o * o
, c = s * s;
switch (r = (r || "XYZ").toUpperCase()) {
case "XYZ":
i[0] = mt(2 * (n * s - a * o), c - l - h + u),
i[1] = gt(pt(2 * (n * o + a * s), -1, 1)),
i[2] = mt(2 * (o * s - n * a), c + l - h - u);
break;
case "YXZ":
i[0] = gt(pt(2 * (n * s - a * o), -1, 1)),
i[1] = mt(2 * (n * o + a * s), c - l - h + u),
i[2] = mt(2 * (n * a + o * s), c - l + h - u);
break;
case "ZXY":
i[0] = gt(pt(2 * (n * s + a * o), -1, 1)),
i[1] = mt(2 * (a * s - o * n), c - l - h + u),
i[2] = mt(2 * (o * s - n * a), c - l + h - u);
break;
case "ZYX":
i[0] = mt(2 * (n * s + o * a), c - l - h + u),
i[1] = gt(pt(2 * (a * s - n * o), -1, 1)),
i[2] = mt(2 * (n * a + o * s), c + l - h - u);
break;
case "YZX":
i[0] = mt(2 * (n * s - o * a), c - l + h - u),
i[1] = mt(2 * (a * s - n * o), c + l - h - u),
i[2] = gt(pt(2 * (n * a + o * s), -1, 1));
break;
case "XZY":
i[0] = mt(2 * (n * s + a * o), c - l + h - u),
i[1] = mt(2 * (n * o + a * s), c + l - h - u),
i[2] = gt(pt(2 * (o * s - n * a), -1, 1));
break;
default:
console.warn("Unkown order: " + r)
}
return e
}
,
ct.eulerFromMat3 = function (e, t, r) {
var i = t.array
, n = i[0]
, a = i[3]
, o = i[6]
, s = i[1]
, l = i[4]
, h = i[7]
, u = i[2]
, c = i[5]
, d = i[8]
, f = e.array;
switch (r = (r || "XYZ").toUpperCase()) {
case "XYZ":
f[1] = gt(pt(o, -1, 1)),
_t(o) < .99999 ? (f[0] = mt(-h, d),
f[2] = mt(-a, n)) : (f[0] = mt(c, l),
f[2] = 0);
break;
case "YXZ":
f[0] = gt(-pt(h, -1, 1)),
_t(h) < .99999 ? (f[1] = mt(o, d),
f[2] = mt(s, l)) : (f[1] = mt(-u, n),
f[2] = 0);
break;
case "ZXY":
f[0] = gt(pt(c, -1, 1)),
_t(c) < .99999 ? (f[1] = mt(-u, d),
f[2] = mt(-a, l)) : (f[1] = 0,
f[2] = mt(s, n));
break;
case "ZYX":
f[1] = gt(-pt(u, -1, 1)),
_t(u) < .99999 ? (f[0] = mt(c, d),
f[2] = mt(s, n)) : (f[0] = 0,
f[2] = mt(-a, l));
break;
case "YZX":
f[2] = gt(pt(s, -1, 1)),
_t(s) < .99999 ? (f[0] = mt(-h, l),
f[1] = mt(-u, n)) : (f[0] = 0,
f[1] = mt(o, d));
break;
case "XZY":
f[2] = gt(-pt(a, -1, 1)),
_t(a) < .99999 ? (f[0] = mt(c, l),
f[1] = mt(o, n)) : (f[0] = mt(-h, d),
f[1] = 0);
break;
default:
console.warn("Unkown order: " + r)
}
return e._dirty = !0,
e
}
,
Object.defineProperties(ct, {
POSITIVE_X: {
get: function () {
return new ct(1, 0, 0)
}
},
NEGATIVE_X: {
get: function () {
return new ct(-1, 0, 0)
}
},
POSITIVE_Y: {
get: function () {
return new ct(0, 1, 0)
}
},
NEGATIVE_Y: {
get: function () {
return new ct(0, -1, 0)
}
},
POSITIVE_Z: {
get: function () {
return new ct(0, 0, 1)
}
},
NEGATIVE_Z: {
get: function () {
return new ct(0, 0, -1)
}
},
UP: {
get: function () {
return new ct(0, 1, 0)
}
},
ZERO: {
get: function () {
return new ct
}
}
});
const vt = ct;
var yt, xt, bt, wt, Tt, St = function (e, t) {
this.origin = e || new vt,
this.direction = t || new vt
};
St.prototype = {
constructor: St,
intersectPlane: function (e, t) {
var r = e.normal.array
, i = e.distance
, n = this.origin.array
, a = this.direction.array
, o = Qe.dot(r, a);
if (0 === o)
return null;
t || (t = new vt);
var s = (Qe.dot(r, n) - i) / o;
return Qe.scaleAndAdd(t.array, n, a, -s),
t._dirty = !0,
t
},
mirrorAgainstPlane: function (e) {
var t = Qe.dot(e.normal.array, this.direction.array);
Qe.scaleAndAdd(this.direction.array, this.direction.array, e.normal.array, 2 * -t),
this.direction._dirty = !0
},
distanceToPoint: (Tt = Qe.create(),
function (e) {
Qe.sub(Tt, e, this.origin.array);
var t = Qe.dot(Tt, this.direction.array);
if (t < 0)
return Qe.distance(this.origin.array, e);
var r = Qe.lenSquared(Tt);
return Math.sqrt(r - t * t)
}
),
intersectSphere: function () {
var e = Qe.create();
return function (t, r, i) {
var n = this.origin.array
, a = this.direction.array;
t = t.array,
Qe.sub(e, t, n);
var o = Qe.dot(e, a)
, s = Qe.squaredLength(e) - o * o
, l = r * r;
if (!(s > l)) {
var h = Math.sqrt(l - s)
, u = o - h
, c = o + h;
return i || (i = new vt),
u < 0 ? c < 0 ? null : (Qe.scaleAndAdd(i.array, n, a, c),
i) : (Qe.scaleAndAdd(i.array, n, a, u),
i)
}
}
}(),
intersectBoundingBox: function (e, t) {
var r, i, n, a, o, s, l = this.direction.array, h = this.origin.array, u = e.min.array, c = e.max.array, d = 1 / l[0], f = 1 / l[1], p = 1 / l[2];
if (d >= 0 ? (r = (u[0] - h[0]) * d,
i = (c[0] - h[0]) * d) : (i = (u[0] - h[0]) * d,
r = (c[0] - h[0]) * d),
f >= 0 ? (n = (u[1] - h[1]) * f,
a = (c[1] - h[1]) * f) : (a = (u[1] - h[1]) * f,
n = (c[1] - h[1]) * f),
r > a || n > i)
return null;
if ((n > r || r != r) && (r = n),
(a < i || i != i) && (i = a),
p >= 0 ? (o = (u[2] - h[2]) * p,
s = (c[2] - h[2]) * p) : (s = (u[2] - h[2]) * p,
o = (c[2] - h[2]) * p),
r > s || o > i)
return null;
if ((o > r || r != r) && (r = o),
(s < i || i != i) && (i = s),
i < 0)
return null;
var m = r >= 0 ? r : i;
return t || (t = new vt),
Qe.scaleAndAdd(t.array, h, l, m),
t
},
intersectTriangle: (yt = Qe.create(),
xt = Qe.create(),
bt = Qe.create(),
wt = Qe.create(),
function (e, t, r, i, n, a) {
var o = this.direction.array
, s = this.origin.array;
e = e.array,
t = t.array,
r = r.array,
Qe.sub(yt, t, e),
Qe.sub(xt, r, e),
Qe.cross(wt, xt, o);
var l = Qe.dot(yt, wt);
if (i) {
if (l > -1e-5)
return null
} else if (l > -1e-5 && l < 1e-5)
return null;
Qe.sub(bt, s, e);
var h = Qe.dot(wt, bt) / l;
if (h < 0 || h > 1)
return null;
Qe.cross(wt, yt, bt);
var u = Qe.dot(o, wt) / l;
if (u < 0 || u > 1 || h + u > 1)
return null;
Qe.cross(wt, yt, xt);
var c = -Qe.dot(bt, wt) / l;
return c < 0 ? null : (n || (n = new vt),
a && vt.set(a, 1 - h - u, h, u),
Qe.scaleAndAdd(n.array, s, o, c),
n)
}
),
applyTransform: function (e) {
vt.add(this.direction, this.direction, this.origin),
vt.transformMat4(this.origin, this.origin, e),
vt.transformMat4(this.direction, this.direction, e),
vt.sub(this.direction, this.direction, this.origin),
vt.normalize(this.direction, this.direction)
},
copy: function (e) {
vt.copy(this.origin, e.origin),
vt.copy(this.direction, e.direction)
},
clone: function () {
var e = new St;
return e.copy(this),
e
}
};
const Mt = St;
var At = {
create: function () {
var e = new ce(4);
return e[0] = 0,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e
},
clone: function (e) {
var t = new ce(4);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t[3] = e[3],
t
},
fromValues: function (e, t, r, i) {
var n = new ce(4);
return n[0] = e,
n[1] = t,
n[2] = r,
n[3] = i,
n
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e
},
set: function (e, t, r, i, n) {
return e[0] = t,
e[1] = r,
e[2] = i,
e[3] = n,
e
},
add: function (e, t, r) {
return e[0] = t[0] + r[0],
e[1] = t[1] + r[1],
e[2] = t[2] + r[2],
e[3] = t[3] + r[3],
e
},
subtract: function (e, t, r) {
return e[0] = t[0] - r[0],
e[1] = t[1] - r[1],
e[2] = t[2] - r[2],
e[3] = t[3] - r[3],
e
}
};
At.sub = At.subtract,
At.multiply = function (e, t, r) {
return e[0] = t[0] * r[0],
e[1] = t[1] * r[1],
e[2] = t[2] * r[2],
e[3] = t[3] * r[3],
e
}
,
At.mul = At.multiply,
At.divide = function (e, t, r) {
return e[0] = t[0] / r[0],
e[1] = t[1] / r[1],
e[2] = t[2] / r[2],
e[3] = t[3] / r[3],
e
}
,
At.div = At.divide,
At.min = function (e, t, r) {
return e[0] = Math.min(t[0], r[0]),
e[1] = Math.min(t[1], r[1]),
e[2] = Math.min(t[2], r[2]),
e[3] = Math.min(t[3], r[3]),
e
}
,
At.max = function (e, t, r) {
return e[0] = Math.max(t[0], r[0]),
e[1] = Math.max(t[1], r[1]),
e[2] = Math.max(t[2], r[2]),
e[3] = Math.max(t[3], r[3]),
e
}
,
At.scale = function (e, t, r) {
return e[0] = t[0] * r,
e[1] = t[1] * r,
e[2] = t[2] * r,
e[3] = t[3] * r,
e
}
,
At.scaleAndAdd = function (e, t, r, i) {
return e[0] = t[0] + r[0] * i,
e[1] = t[1] + r[1] * i,
e[2] = t[2] + r[2] * i,
e[3] = t[3] + r[3] * i,
e
}
,
At.distance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1]
, n = t[2] - e[2]
, a = t[3] - e[3];
return Math.sqrt(r * r + i * i + n * n + a * a)
}
,
At.dist = At.distance,
At.squaredDistance = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1]
, n = t[2] - e[2]
, a = t[3] - e[3];
return r * r + i * i + n * n + a * a
}
,
At.sqrDist = At.squaredDistance,
At.length = function (e) {
var t = e[0]
, r = e[1]
, i = e[2]
, n = e[3];
return Math.sqrt(t * t + r * r + i * i + n * n)
}
,
At.len = At.length,
At.squaredLength = function (e) {
var t = e[0]
, r = e[1]
, i = e[2]
, n = e[3];
return t * t + r * r + i * i + n * n
}
,
At.sqrLen = At.squaredLength,
At.negate = function (e, t) {
return e[0] = -t[0],
e[1] = -t[1],
e[2] = -t[2],
e[3] = -t[3],
e
}
,
At.inverse = function (e, t) {
return e[0] = 1 / t[0],
e[1] = 1 / t[1],
e[2] = 1 / t[2],
e[3] = 1 / t[3],
e
}
,
At.normalize = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = r * r + i * i + n * n + a * a;
return o > 0 && (o = 1 / Math.sqrt(o),
e[0] = t[0] * o,
e[1] = t[1] * o,
e[2] = t[2] * o,
e[3] = t[3] * o),
e
}
,
At.dot = function (e, t) {
return e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3]
}
,
At.lerp = function (e, t, r, i) {
var n = t[0]
, a = t[1]
, o = t[2]
, s = t[3];
return e[0] = n + i * (r[0] - n),
e[1] = a + i * (r[1] - a),
e[2] = o + i * (r[2] - o),
e[3] = s + i * (r[3] - s),
e
}
,
At.random = function (e, t) {
return t = t || 1,
e[0] = de(),
e[1] = de(),
e[2] = de(),
e[3] = de(),
At.normalize(e, e),
At.scale(e, e, t),
e
}
,
At.transformMat4 = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3];
return e[0] = r[0] * i + r[4] * n + r[8] * a + r[12] * o,
e[1] = r[1] * i + r[5] * n + r[9] * a + r[13] * o,
e[2] = r[2] * i + r[6] * n + r[10] * a + r[14] * o,
e[3] = r[3] * i + r[7] * n + r[11] * a + r[15] * o,
e
}
,
At.transformQuat = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = r[0]
, s = r[1]
, l = r[2]
, h = r[3]
, u = h * i + s * a - l * n
, c = h * n + l * i - o * a
, d = h * a + o * n - s * i
, f = -o * i - s * n - l * a;
return e[0] = u * h + f * -o + c * -l - d * -s,
e[1] = c * h + f * -s + d * -o - u * -l,
e[2] = d * h + f * -l + u * -s - c * -o,
e
}
,
At.forEach = function () {
var e = At.create();
return function (t, r, i, n, a, o) {
var s, l;
for (r || (r = 4),
i || (i = 0),
l = n ? Math.min(n * r + i, t.length) : t.length,
s = i; s < l; s += r)
e[0] = t[s],
e[1] = t[s + 1],
e[2] = t[s + 2],
e[3] = t[s + 3],
a(e, e, o),
t[s] = e[0],
t[s + 1] = e[1],
t[s + 2] = e[2],
t[s + 3] = e[3];
return t
}
}();
const Et = At;
var Ct = {
create: function () {
var e = new ce(9);
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 1,
e[5] = 0,
e[6] = 0,
e[7] = 0,
e[8] = 1,
e
},
fromMat4: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[4],
e[4] = t[5],
e[5] = t[6],
e[6] = t[8],
e[7] = t[9],
e[8] = t[10],
e
},
clone: function (e) {
var t = new ce(9);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t[3] = e[3],
t[4] = e[4],
t[5] = e[5],
t[6] = e[6],
t[7] = e[7],
t[8] = e[8],
t
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e[4] = t[4],
e[5] = t[5],
e[6] = t[6],
e[7] = t[7],
e[8] = t[8],
e
},
identity: function (e) {
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 0,
e[4] = 1,
e[5] = 0,
e[6] = 0,
e[7] = 0,
e[8] = 1,
e
},
transpose: function (e, t) {
if (e === t) {
var r = t[1]
, i = t[2]
, n = t[5];
e[1] = t[3],
e[2] = t[6],
e[3] = r,
e[5] = t[7],
e[6] = i,
e[7] = n
} else
e[0] = t[0],
e[1] = t[3],
e[2] = t[6],
e[3] = t[1],
e[4] = t[4],
e[5] = t[7],
e[6] = t[2],
e[7] = t[5],
e[8] = t[8];
return e
},
invert: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[7]
, u = t[8]
, c = u * o - s * h
, d = -u * a + s * l
, f = h * a - o * l
, p = r * c + i * d + n * f;
return p ? (p = 1 / p,
e[0] = c * p,
e[1] = (-u * i + n * h) * p,
e[2] = (s * i - n * o) * p,
e[3] = d * p,
e[4] = (u * r - n * l) * p,
e[5] = (-s * r + n * a) * p,
e[6] = f * p,
e[7] = (-h * r + i * l) * p,
e[8] = (o * r - i * a) * p,
e) : null
},
adjoint: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[7]
, u = t[8];
return e[0] = o * u - s * h,
e[1] = n * h - i * u,
e[2] = i * s - n * o,
e[3] = s * l - a * u,
e[4] = r * u - n * l,
e[5] = n * a - r * s,
e[6] = a * h - o * l,
e[7] = i * l - r * h,
e[8] = r * o - i * a,
e
},
determinant: function (e) {
var t = e[0]
, r = e[1]
, i = e[2]
, n = e[3]
, a = e[4]
, o = e[5]
, s = e[6]
, l = e[7]
, h = e[8];
return t * (h * a - o * l) + r * (-h * n + o * s) + i * (l * n - a * s)
},
multiply: function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = t[6]
, u = t[7]
, c = t[8]
, d = r[0]
, f = r[1]
, p = r[2]
, m = r[3]
, g = r[4]
, _ = r[5]
, v = r[6]
, y = r[7]
, x = r[8];
return e[0] = d * i + f * o + p * h,
e[1] = d * n + f * s + p * u,
e[2] = d * a + f * l + p * c,
e[3] = m * i + g * o + _ * h,
e[4] = m * n + g * s + _ * u,
e[5] = m * a + g * l + _ * c,
e[6] = v * i + y * o + x * h,
e[7] = v * n + y * s + x * u,
e[8] = v * a + y * l + x * c,
e
}
};
Ct.mul = Ct.multiply,
Ct.translate = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = t[6]
, u = t[7]
, c = t[8]
, d = r[0]
, f = r[1];
return e[0] = i,
e[1] = n,
e[2] = a,
e[3] = o,
e[4] = s,
e[5] = l,
e[6] = d * i + f * o + h,
e[7] = d * n + f * s + u,
e[8] = d * a + f * l + c,
e
}
,
Ct.rotate = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = t[6]
, u = t[7]
, c = t[8]
, d = Math.sin(r)
, f = Math.cos(r);
return e[0] = f * i + d * o,
e[1] = f * n + d * s,
e[2] = f * a + d * l,
e[3] = f * o - d * i,
e[4] = f * s - d * n,
e[5] = f * l - d * a,
e[6] = h,
e[7] = u,
e[8] = c,
e
}
,
Ct.scale = function (e, t, r) {
var i = r[0]
, n = r[1];
return e[0] = i * t[0],
e[1] = i * t[1],
e[2] = i * t[2],
e[3] = n * t[3],
e[4] = n * t[4],
e[5] = n * t[5],
e[6] = t[6],
e[7] = t[7],
e[8] = t[8],
e
}
,
Ct.fromMat2d = function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = 0,
e[3] = t[2],
e[4] = t[3],
e[5] = 0,
e[6] = t[4],
e[7] = t[5],
e[8] = 1,
e
}
,
Ct.fromQuat = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = r + r
, s = i + i
, l = n + n
, h = r * o
, u = i * o
, c = i * s
, d = n * o
, f = n * s
, p = n * l
, m = a * o
, g = a * s
, _ = a * l;
return e[0] = 1 - c - p,
e[3] = u - _,
e[6] = d + g,
e[1] = u + _,
e[4] = 1 - h - p,
e[7] = f - m,
e[2] = d - g,
e[5] = f + m,
e[8] = 1 - h - c,
e
}
,
Ct.normalFromMat4 = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = t[6]
, h = t[7]
, u = t[8]
, c = t[9]
, d = t[10]
, f = t[11]
, p = t[12]
, m = t[13]
, g = t[14]
, _ = t[15]
, v = r * s - i * o
, y = r * l - n * o
, x = r * h - a * o
, b = i * l - n * s
, w = i * h - a * s
, T = n * h - a * l
, S = u * m - c * p
, M = u * g - d * p
, A = u * _ - f * p
, E = c * g - d * m
, C = c * _ - f * m
, D = d * _ - f * g
, L = v * D - y * C + x * E + b * A - w * M + T * S;
return L ? (L = 1 / L,
e[0] = (s * D - l * C + h * E) * L,
e[1] = (l * A - o * D - h * M) * L,
e[2] = (o * C - s * A + h * S) * L,
e[3] = (n * C - i * D - a * E) * L,
e[4] = (r * D - n * A + a * M) * L,
e[5] = (i * A - r * C - a * S) * L,
e[6] = (m * T - g * w + _ * b) * L,
e[7] = (g * x - p * T - _ * y) * L,
e[8] = (p * w - m * x + _ * v) * L,
e) : null
}
,
Ct.frob = function (e) {
return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2))
}
;
const Dt = Ct;
var Lt, Pt, Ot, Nt, It = {
create: function () {
var e = new ce(4);
return e[0] = 0,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e
}
};
It.rotationTo = (Lt = Qe.create(),
Pt = Qe.fromValues(1, 0, 0),
Ot = Qe.fromValues(0, 1, 0),
function (e, t, r) {
var i = Qe.dot(t, r);
return i < -.999999 ? (Qe.cross(Lt, Pt, t),
Qe.length(Lt) < 1e-6 && Qe.cross(Lt, Ot, t),
Qe.normalize(Lt, Lt),
It.setAxisAngle(e, Lt, Math.PI),
e) : i > .999999 ? (e[0] = 0,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e) : (Qe.cross(Lt, t, r),
e[0] = Lt[0],
e[1] = Lt[1],
e[2] = Lt[2],
e[3] = 1 + i,
It.normalize(e, e))
}
),
It.setAxes = (Nt = Dt.create(),
function (e, t, r, i) {
return Nt[0] = r[0],
Nt[3] = r[1],
Nt[6] = r[2],
Nt[1] = i[0],
Nt[4] = i[1],
Nt[7] = i[2],
Nt[2] = -t[0],
Nt[5] = -t[1],
Nt[8] = -t[2],
It.normalize(e, It.fromMat3(e, Nt))
}
),
It.clone = Et.clone,
It.fromValues = Et.fromValues,
It.copy = Et.copy,
It.set = Et.set,
It.identity = function (e) {
return e[0] = 0,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e
}
,
It.setAxisAngle = function (e, t, r) {
r *= .5;
var i = Math.sin(r);
return e[0] = i * t[0],
e[1] = i * t[1],
e[2] = i * t[2],
e[3] = Math.cos(r),
e
}
,
It.add = Et.add,
It.multiply = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = r[0]
, l = r[1]
, h = r[2]
, u = r[3];
return e[0] = i * u + o * s + n * h - a * l,
e[1] = n * u + o * l + a * s - i * h,
e[2] = a * u + o * h + i * l - n * s,
e[3] = o * u - i * s - n * l - a * h,
e
}
,
It.mul = It.multiply,
It.scale = Et.scale,
It.rotateX = function (e, t, r) {
r *= .5;
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = Math.sin(r)
, l = Math.cos(r);
return e[0] = i * l + o * s,
e[1] = n * l + a * s,
e[2] = a * l - n * s,
e[3] = o * l - i * s,
e
}
,
It.rotateY = function (e, t, r) {
r *= .5;
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = Math.sin(r)
, l = Math.cos(r);
return e[0] = i * l - a * s,
e[1] = n * l + o * s,
e[2] = a * l + i * s,
e[3] = o * l - n * s,
e
}
,
It.rotateZ = function (e, t, r) {
r *= .5;
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = Math.sin(r)
, l = Math.cos(r);
return e[0] = i * l + n * s,
e[1] = n * l - i * s,
e[2] = a * l + o * s,
e[3] = o * l - a * s,
e
}
,
It.calculateW = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2];
return e[0] = r,
e[1] = i,
e[2] = n,
e[3] = Math.sqrt(Math.abs(1 - r * r - i * i - n * n)),
e
}
,
It.dot = Et.dot,
It.lerp = Et.lerp,
It.slerp = function (e, t, r, i) {
var n, a, o, s, l, h = t[0], u = t[1], c = t[2], d = t[3], f = r[0], p = r[1], m = r[2], g = r[3];
return (a = h * f + u * p + c * m + d * g) < 0 && (a = -a,
f = -f,
p = -p,
m = -m,
g = -g),
1 - a > 1e-6 ? (n = Math.acos(a),
o = Math.sin(n),
s = Math.sin((1 - i) * n) / o,
l = Math.sin(i * n) / o) : (s = 1 - i,
l = i),
e[0] = s * h + l * f,
e[1] = s * u + l * p,
e[2] = s * c + l * m,
e[3] = s * d + l * g,
e
}
,
It.invert = function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = r * r + i * i + n * n + a * a
, s = o ? 1 / o : 0;
return e[0] = -r * s,
e[1] = -i * s,
e[2] = -n * s,
e[3] = a * s,
e
}
,
It.conjugate = function (e, t) {
return e[0] = -t[0],
e[1] = -t[1],
e[2] = -t[2],
e[3] = t[3],
e
}
,
It.length = Et.length,
It.len = It.length,
It.squaredLength = Et.squaredLength,
It.sqrLen = It.squaredLength,
It.normalize = Et.normalize,
It.fromMat3 = function (e, t) {
var r, i = t[0] + t[4] + t[8];
if (i > 0)
r = Math.sqrt(i + 1),
e[3] = .5 * r,
r = .5 / r,
e[0] = (t[5] - t[7]) * r,
e[1] = (t[6] - t[2]) * r,
e[2] = (t[1] - t[3]) * r;
else {
var n = 0;
t[4] > t[0] && (n = 1),
t[8] > t[3 * n + n] && (n = 2);
var a = (n + 1) % 3
, o = (n + 2) % 3;
r = Math.sqrt(t[3 * n + n] - t[3 * a + a] - t[3 * o + o] + 1),
e[n] = .5 * r,
r = .5 / r,
e[3] = (t[3 * a + o] - t[3 * o + a]) * r,
e[a] = (t[3 * a + n] + t[3 * n + a]) * r,
e[o] = (t[3 * o + n] + t[3 * n + o]) * r
}
return e
}
;
const Rt = It;
var Bt, Ft, zt, Gt, Ut = function () {
this._axisX = new vt,
this._axisY = new vt,
this._axisZ = new vt,
this.array = Ye.create(),
this._dirty = !0
};
Ut.prototype = {
constructor: Ut,
setArray: function (e) {
for (var t = 0; t < this.array.length; t++)
this.array[t] = e[t];
return this._dirty = !0,
this
},
adjoint: function () {
return Ye.adjoint(this.array, this.array),
this._dirty = !0,
this
},
clone: function () {
return (new Ut).copy(this)
},
copy: function (e) {
return Ye.copy(this.array, e.array),
this._dirty = !0,
this
},
determinant: function () {
return Ye.determinant(this.array)
},
fromQuat: function (e) {
return Ye.fromQuat(this.array, e.array),
this._dirty = !0,
this
},
fromRotationTranslation: function (e, t) {
return Ye.fromRotationTranslation(this.array, e.array, t.array),
this._dirty = !0,
this
},
fromMat2d: function (e) {
return Ut.fromMat2d(this, e),
this
},
frustum: function (e, t, r, i, n, a) {
return Ye.frustum(this.array, e, t, r, i, n, a),
this._dirty = !0,
this
},
identity: function () {
return Ye.identity(this.array),
this._dirty = !0,
this
},
invert: function () {
return Ye.invert(this.array, this.array),
this._dirty = !0,
this
},
lookAt: function (e, t, r) {
return Ye.lookAt(this.array, e.array, t.array, r.array),
this._dirty = !0,
this
},
mul: function (e) {
return Ye.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
mulLeft: function (e) {
return Ye.mul(this.array, e.array, this.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Ye.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiplyLeft: function (e) {
return Ye.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
ortho: function (e, t, r, i, n, a) {
return Ye.ortho(this.array, e, t, r, i, n, a),
this._dirty = !0,
this
},
perspective: function (e, t, r, i) {
return Ye.perspective(this.array, e, t, r, i),
this._dirty = !0,
this
},
rotate: function (e, t) {
return Ye.rotate(this.array, this.array, e, t.array),
this._dirty = !0,
this
},
rotateX: function (e) {
return Ye.rotateX(this.array, this.array, e),
this._dirty = !0,
this
},
rotateY: function (e) {
return Ye.rotateY(this.array, this.array, e),
this._dirty = !0,
this
},
rotateZ: function (e) {
return Ye.rotateZ(this.array, this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return Ye.scale(this.array, this.array, e.array),
this._dirty = !0,
this
},
translate: function (e) {
return Ye.translate(this.array, this.array, e.array),
this._dirty = !0,
this
},
transpose: function () {
return Ye.transpose(this.array, this.array),
this._dirty = !0,
this
},
decomposeMatrix: (Bt = Qe.create(),
Ft = Qe.create(),
zt = Qe.create(),
Gt = Dt.create(),
function (e, t, r) {
var i = this.array;
Qe.set(Bt, i[0], i[1], i[2]),
Qe.set(Ft, i[4], i[5], i[6]),
Qe.set(zt, i[8], i[9], i[10]);
var n = Qe.length(Bt)
, a = Qe.length(Ft)
, o = Qe.length(zt);
this.determinant() < 0 && (n = -n),
e && e.set(n, a, o),
r.set(i[12], i[13], i[14]),
Dt.fromMat4(Gt, i),
Gt[0] /= n,
Gt[1] /= n,
Gt[2] /= n,
Gt[3] /= a,
Gt[4] /= a,
Gt[5] /= a,
Gt[6] /= o,
Gt[7] /= o,
Gt[8] /= o,
Rt.fromMat3(t.array, Gt),
Rt.normalize(t.array, t.array),
t._dirty = !0,
r._dirty = !0
}
),
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
};
var kt = Object.defineProperty;
if (kt) {
var Vt = Ut.prototype;
kt(Vt, "z", {
get: function () {
var e = this.array;
return this._axisZ.set(e[8], e[9], e[10]),
this._axisZ
},
set: function (e) {
var t = this.array;
e = e.array,
t[8] = e[0],
t[9] = e[1],
t[10] = e[2],
this._dirty = !0
}
}),
kt(Vt, "y", {
get: function () {
var e = this.array;
return this._axisY.set(e[4], e[5], e[6]),
this._axisY
},
set: function (e) {
var t = this.array;
e = e.array,
t[4] = e[0],
t[5] = e[1],
t[6] = e[2],
this._dirty = !0
}
}),
kt(Vt, "x", {
get: function () {
var e = this.array;
return this._axisX.set(e[0], e[1], e[2]),
this._axisX
},
set: function (e) {
var t = this.array;
e = e.array,
t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
this._dirty = !0
}
})
}
Ut.adjoint = function (e, t) {
return Ye.adjoint(e.array, t.array),
e._dirty = !0,
e
}
,
Ut.copy = function (e, t) {
return Ye.copy(e.array, t.array),
e._dirty = !0,
e
}
,
Ut.determinant = function (e) {
return Ye.determinant(e.array)
}
,
Ut.identity = function (e) {
return Ye.identity(e.array),
e._dirty = !0,
e
}
,
Ut.ortho = function (e, t, r, i, n, a, o) {
return Ye.ortho(e.array, t, r, i, n, a, o),
e._dirty = !0,
e
}
,
Ut.perspective = function (e, t, r, i, n) {
return Ye.perspective(e.array, t, r, i, n),
e._dirty = !0,
e
}
,
Ut.lookAt = function (e, t, r, i) {
return Ye.lookAt(e.array, t.array, r.array, i.array),
e._dirty = !0,
e
}
,
Ut.invert = function (e, t) {
return Ye.invert(e.array, t.array),
e._dirty = !0,
e
}
,
Ut.multiply = Ut.mul = function (e, t, r) {
return Ye.mul(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Ut.fromQuat = function (e, t) {
return Ye.fromQuat(e.array, t.array),
e._dirty = !0,
e
}
,
Ut.fromRotationTranslation = function (e, t, r) {
return Ye.fromRotationTranslation(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Ut.fromMat2d = function (e, t) {
return e._dirty = !0,
t = t.array,
(e = e.array)[0] = t[0],
e[4] = t[2],
e[12] = t[4],
e[1] = t[1],
e[5] = t[3],
e[13] = t[5],
e
}
,
Ut.rotate = function (e, t, r, i) {
return Ye.rotate(e.array, t.array, r, i.array),
e._dirty = !0,
e
}
,
Ut.rotateX = function (e, t, r) {
return Ye.rotateX(e.array, t.array, r),
e._dirty = !0,
e
}
,
Ut.rotateY = function (e, t, r) {
return Ye.rotateY(e.array, t.array, r),
e._dirty = !0,
e
}
,
Ut.rotateZ = function (e, t, r) {
return Ye.rotateZ(e.array, t.array, r),
e._dirty = !0,
e
}
,
Ut.scale = function (e, t, r) {
return Ye.scale(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Ut.transpose = function (e, t) {
return Ye.transpose(e.array, t.array),
e._dirty = !0,
e
}
,
Ut.translate = function (e, t, r) {
return Ye.translate(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
const Ht = Ut;
var Wt = function (e, t, r, i) {
e = e || 0,
t = t || 0,
r = r || 0,
i = void 0 === i ? 1 : i,
this.array = Rt.fromValues(e, t, r, i),
this._dirty = !0
};
Wt.prototype = {
constructor: Wt,
add: function (e) {
return Rt.add(this.array, this.array, e.array),
this._dirty = !0,
this
},
calculateW: function () {
return Rt.calculateW(this.array, this.array),
this._dirty = !0,
this
},
set: function (e, t, r, i) {
return this.array[0] = e,
this.array[1] = t,
this.array[2] = r,
this.array[3] = i,
this._dirty = !0,
this
},
setArray: function (e) {
return this.array[0] = e[0],
this.array[1] = e[1],
this.array[2] = e[2],
this.array[3] = e[3],
this._dirty = !0,
this
},
clone: function () {
return new Wt(this.x, this.y, this.z, this.w)
},
conjugate: function () {
return Rt.conjugate(this.array, this.array),
this._dirty = !0,
this
},
copy: function (e) {
return Rt.copy(this.array, e.array),
this._dirty = !0,
this
},
dot: function (e) {
return Rt.dot(this.array, e.array)
},
fromMat3: function (e) {
return Rt.fromMat3(this.array, e.array),
this._dirty = !0,
this
},
fromMat4: function () {
var e = Dt.create();
return function (t) {
return Dt.fromMat4(e, t.array),
Dt.transpose(e, e),
Rt.fromMat3(this.array, e),
this._dirty = !0,
this
}
}(),
identity: function () {
return Rt.identity(this.array),
this._dirty = !0,
this
},
invert: function () {
return Rt.invert(this.array, this.array),
this._dirty = !0,
this
},
len: function () {
return Rt.len(this.array)
},
length: function () {
return Rt.length(this.array)
},
lerp: function (e, t, r) {
return Rt.lerp(this.array, e.array, t.array, r),
this._dirty = !0,
this
},
mul: function (e) {
return Rt.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
mulLeft: function (e) {
return Rt.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Rt.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiplyLeft: function (e) {
return Rt.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
normalize: function () {
return Rt.normalize(this.array, this.array),
this._dirty = !0,
this
},
rotateX: function (e) {
return Rt.rotateX(this.array, this.array, e),
this._dirty = !0,
this
},
rotateY: function (e) {
return Rt.rotateY(this.array, this.array, e),
this._dirty = !0,
this
},
rotateZ: function (e) {
return Rt.rotateZ(this.array, this.array, e),
this._dirty = !0,
this
},
rotationTo: function (e, t) {
return Rt.rotationTo(this.array, e.array, t.array),
this._dirty = !0,
this
},
setAxes: function (e, t, r) {
return Rt.setAxes(this.array, e.array, t.array, r.array),
this._dirty = !0,
this
},
setAxisAngle: function (e, t) {
return Rt.setAxisAngle(this.array, e.array, t),
this._dirty = !0,
this
},
slerp: function (e, t, r) {
return Rt.slerp(this.array, e.array, t.array, r),
this._dirty = !0,
this
},
sqrLen: function () {
return Rt.sqrLen(this.array)
},
squaredLength: function () {
return Rt.squaredLength(this.array)
},
fromEuler: function (e, t) {
return Wt.fromEuler(this, e, t)
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
};
var jt = Object.defineProperty;
if (jt) {
var Xt = Wt.prototype;
jt(Xt, "x", {
get: function () {
return this.array[0]
},
set: function (e) {
this.array[0] = e,
this._dirty = !0
}
}),
jt(Xt, "y", {
get: function () {
return this.array[1]
},
set: function (e) {
this.array[1] = e,
this._dirty = !0
}
}),
jt(Xt, "z", {
get: function () {
return this.array[2]
},
set: function (e) {
this.array[2] = e,
this._dirty = !0
}
}),
jt(Xt, "w", {
get: function () {
return this.array[3]
},
set: function (e) {
this.array[3] = e,
this._dirty = !0
}
})
}
Wt.add = function (e, t, r) {
return Rt.add(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Wt.set = function (e, t, r, i, n) {
Rt.set(e.array, t, r, i, n),
e._dirty = !0
}
,
Wt.copy = function (e, t) {
return Rt.copy(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.calculateW = function (e, t) {
return Rt.calculateW(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.conjugate = function (e, t) {
return Rt.conjugate(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.identity = function (e) {
return Rt.identity(e.array),
e._dirty = !0,
e
}
,
Wt.invert = function (e, t) {
return Rt.invert(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.dot = function (e, t) {
return Rt.dot(e.array, t.array)
}
,
Wt.len = function (e) {
return Rt.length(e.array)
}
,
Wt.lerp = function (e, t, r, i) {
return Rt.lerp(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
Wt.slerp = function (e, t, r, i) {
return Rt.slerp(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
Wt.multiply = Wt.mul = function (e, t, r) {
return Rt.multiply(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Wt.rotateX = function (e, t, r) {
return Rt.rotateX(e.array, t.array, r),
e._dirty = !0,
e
}
,
Wt.rotateY = function (e, t, r) {
return Rt.rotateY(e.array, t.array, r),
e._dirty = !0,
e
}
,
Wt.rotateZ = function (e, t, r) {
return Rt.rotateZ(e.array, t.array, r),
e._dirty = !0,
e
}
,
Wt.setAxisAngle = function (e, t, r) {
return Rt.setAxisAngle(e.array, t.array, r),
e._dirty = !0,
e
}
,
Wt.normalize = function (e, t) {
return Rt.normalize(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.squaredLength = Wt.sqrLen = function (e) {
return Rt.sqrLen(e.array)
}
,
Wt.fromMat3 = function (e, t) {
return Rt.fromMat3(e.array, t.array),
e._dirty = !0,
e
}
,
Wt.setAxes = function (e, t, r, i) {
return Rt.setAxes(e.array, t.array, r.array, i.array),
e._dirty = !0,
e
}
,
Wt.rotationTo = function (e, t, r) {
return Rt.rotationTo(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Wt.fromEuler = function (e, t, r) {
e._dirty = !0,
t = t.array;
var i = e.array
, n = Math.cos(t[0] / 2)
, a = Math.cos(t[1] / 2)
, o = Math.cos(t[2] / 2)
, s = Math.sin(t[0] / 2)
, l = Math.sin(t[1] / 2)
, h = Math.sin(t[2] / 2);
switch (r = (r || "XYZ").toUpperCase()) {
case "XYZ":
i[0] = s * a * o + n * l * h,
i[1] = n * l * o - s * a * h,
i[2] = n * a * h + s * l * o,
i[3] = n * a * o - s * l * h;
break;
case "YXZ":
i[0] = s * a * o + n * l * h,
i[1] = n * l * o - s * a * h,
i[2] = n * a * h - s * l * o,
i[3] = n * a * o + s * l * h;
break;
case "ZXY":
i[0] = s * a * o - n * l * h,
i[1] = n * l * o + s * a * h,
i[2] = n * a * h + s * l * o,
i[3] = n * a * o - s * l * h;
break;
case "ZYX":
i[0] = s * a * o - n * l * h,
i[1] = n * l * o + s * a * h,
i[2] = n * a * h - s * l * o,
i[3] = n * a * o + s * l * h;
break;
case "YZX":
i[0] = s * a * o + n * l * h,
i[1] = n * l * o + s * a * h,
i[2] = n * a * h - s * l * o,
i[3] = n * a * o - s * l * h;
break;
case "XZY":
i[0] = s * a * o - n * l * h,
i[1] = n * l * o - s * a * h,
i[2] = n * a * h + s * l * o,
i[3] = n * a * o + s * l * h
}
}
;
const qt = Wt;
var Zt, Yt, Kt, Qt, Jt, $t, er = Qe.set, tr = Qe.copy, rr = function (e, t) {
this.min = e || new vt(1 / 0, 1 / 0, 1 / 0),
this.max = t || new vt(-1 / 0, -1 / 0, -1 / 0),
this.vertices = null
};
rr.prototype = {
constructor: rr,
updateFromVertices: function (e) {
if (e.length > 0) {
var t = this.min
, r = this.max
, i = t.array
, n = r.array;
tr(i, e[0]),
tr(n, e[0]);
for (var a = 1; a < e.length; a++) {
var o = e[a];
o[0] < i[0] && (i[0] = o[0]),
o[1] < i[1] && (i[1] = o[1]),
o[2] < i[2] && (i[2] = o[2]),
o[0] > n[0] && (n[0] = o[0]),
o[1] > n[1] && (n[1] = o[1]),
o[2] > n[2] && (n[2] = o[2])
}
t._dirty = !0,
r._dirty = !0
}
},
union: function (e) {
var t = this.min
, r = this.max;
return Qe.min(t.array, t.array, e.min.array),
Qe.max(r.array, r.array, e.max.array),
t._dirty = !0,
r._dirty = !0,
this
},
intersection: function (e) {
var t = this.min
, r = this.max;
return Qe.max(t.array, t.array, e.min.array),
Qe.min(r.array, r.array, e.max.array),
t._dirty = !0,
r._dirty = !0,
this
},
intersectBoundingBox: function (e) {
var t = this.min.array
, r = this.max.array
, i = e.min.array
, n = e.max.array;
return !(t[0] > n[0] || t[1] > n[1] || t[2] > n[2] || r[0] < i[0] || r[1] < i[1] || r[2] < i[2])
},
containBoundingBox: function (e) {
var t = this.min.array
, r = this.max.array
, i = e.min.array
, n = e.max.array;
return t[0] <= i[0] && t[1] <= i[1] && t[2] <= i[2] && r[0] >= n[0] && r[1] >= n[1] && r[2] >= n[2]
},
containPoint: function (e) {
var t = this.min.array
, r = this.max.array
, i = e.array;
return t[0] <= i[0] && t[1] <= i[1] && t[2] <= i[2] && r[0] >= i[0] && r[1] >= i[1] && r[2] >= i[2]
},
isFinite: function () {
var e = this.min.array
, t = this.max.array;
return isFinite(e[0]) && isFinite(e[1]) && isFinite(e[2]) && isFinite(t[0]) && isFinite(t[1]) && isFinite(t[2])
},
applyTransform: function (e) {
this.transformFrom(this, e)
},
transformFrom: (Zt = Qe.create(),
Yt = Qe.create(),
Kt = Qe.create(),
Qt = Qe.create(),
Jt = Qe.create(),
$t = Qe.create(),
function (e, t) {
var r = e.min.array
, i = e.max.array
, n = t.array;
return Zt[0] = n[0] * r[0],
Zt[1] = n[1] * r[0],
Zt[2] = n[2] * r[0],
Yt[0] = n[0] * i[0],
Yt[1] = n[1] * i[0],
Yt[2] = n[2] * i[0],
Kt[0] = n[4] * r[1],
Kt[1] = n[5] * r[1],
Kt[2] = n[6] * r[1],
Qt[0] = n[4] * i[1],
Qt[1] = n[5] * i[1],
Qt[2] = n[6] * i[1],
Jt[0] = n[8] * r[2],
Jt[1] = n[9] * r[2],
Jt[2] = n[10] * r[2],
$t[0] = n[8] * i[2],
$t[1] = n[9] * i[2],
$t[2] = n[10] * i[2],
r = this.min.array,
i = this.max.array,
r[0] = Math.min(Zt[0], Yt[0]) + Math.min(Kt[0], Qt[0]) + Math.min(Jt[0], $t[0]) + n[12],
r[1] = Math.min(Zt[1], Yt[1]) + Math.min(Kt[1], Qt[1]) + Math.min(Jt[1], $t[1]) + n[13],
r[2] = Math.min(Zt[2], Yt[2]) + Math.min(Kt[2], Qt[2]) + Math.min(Jt[2], $t[2]) + n[14],
i[0] = Math.max(Zt[0], Yt[0]) + Math.max(Kt[0], Qt[0]) + Math.max(Jt[0], $t[0]) + n[12],
i[1] = Math.max(Zt[1], Yt[1]) + Math.max(Kt[1], Qt[1]) + Math.max(Jt[1], $t[1]) + n[13],
i[2] = Math.max(Zt[2], Yt[2]) + Math.max(Kt[2], Qt[2]) + Math.max(Jt[2], $t[2]) + n[14],
this.min._dirty = !0,
this.max._dirty = !0,
this
}
),
applyProjection: function (e) {
var t = this.min.array
, r = this.max.array
, i = e.array
, n = t[0]
, a = t[1]
, o = t[2]
, s = r[0]
, l = r[1]
, h = t[2]
, u = r[0]
, c = r[1]
, d = r[2];
if (1 === i[15])
t[0] = i[0] * n + i[12],
t[1] = i[5] * a + i[13],
r[2] = i[10] * o + i[14],
r[0] = i[0] * u + i[12],
r[1] = i[5] * c + i[13],
t[2] = i[10] * d + i[14];
else {
var f = -1 / o;
t[0] = i[0] * n * f,
t[1] = i[5] * a * f,
r[2] = (i[10] * o + i[14]) * f,
f = -1 / h,
r[0] = i[0] * s * f,
r[1] = i[5] * l * f,
f = -1 / d,
t[2] = (i[10] * d + i[14]) * f
}
return this.min._dirty = !0,
this.max._dirty = !0,
this
},
updateVertices: function () {
var e = this.vertices;
if (!e) {
e = [];
for (var t = 0; t < 8; t++)
e[t] = Qe.fromValues(0, 0, 0);
this.vertices = e
}
var r = this.min.array
, i = this.max.array;
return er(e[0], r[0], r[1], r[2]),
er(e[1], r[0], i[1], r[2]),
er(e[2], i[0], r[1], r[2]),
er(e[3], i[0], i[1], r[2]),
er(e[4], r[0], r[1], i[2]),
er(e[5], r[0], i[1], i[2]),
er(e[6], i[0], r[1], i[2]),
er(e[7], i[0], i[1], i[2]),
this
},
copy: function (e) {
var t = this.min
, r = this.max;
return tr(t.array, e.min.array),
tr(r.array, e.max.array),
t._dirty = !0,
r._dirty = !0,
this
},
clone: function () {
var e = new rr;
return e.copy(this),
e
}
};
const ir = rr;
var nr, ar, or = 0;
const sr = m.extend({
name: "",
position: null,
rotation: null,
scale: null,
worldTransform: null,
localTransform: null,
autoUpdateLocalTransform: !0,
_parent: null,
_scene: null,
_needsUpdateWorldTransform: !0,
_inIterating: !1,
__depth: 0
}, (function () {
this.name || (this.name = (this.type || "NODE") + "_" + or++),
this.position || (this.position = new vt),
this.rotation || (this.rotation = new qt),
this.scale || (this.scale = new vt(1, 1, 1)),
this.worldTransform = new Ht,
this.localTransform = new Ht,
this._children = []
}
), {
target: null,
invisible: !1,
isSkinnedMesh: function () {
return !1
},
isRenderable: function () {
return !1
},
setName: function (e) {
var t = this._scene;
if (t) {
var r = t._nodeRepository;
delete r[this.name],
r[e] = this
}
this.name = e
},
add: function (e) {
var t = e._parent;
if (t !== this) {
t && t.remove(e),
e._parent = this,
this._children.push(e);
var r = this._scene;
r && r !== e.scene && e.traverse(this._addSelfToScene, this),
e._needsUpdateWorldTransform = !0
}
},
remove: function (e) {
var t = this._children
, r = t.indexOf(e);
r < 0 || (t.splice(r, 1),
e._parent = null,
this._scene && e.traverse(this._removeSelfFromScene, this))
},
removeAll: function () {
for (var e = this._children, t = 0; t < e.length; t++)
e[t]._parent = null,
this._scene && e[t].traverse(this._removeSelfFromScene, this);
this._children = []
},
getScene: function () {
return this._scene
},
getParent: function () {
return this._parent
},
_removeSelfFromScene: function (e) {
e._scene.removeFromScene(e),
e._scene = null
},
_addSelfToScene: function (e) {
this._scene.addToScene(e),
e._scene = this._scene
},
isAncestor: function (e) {
for (var t = e._parent; t;) {
if (t === this)
return !0;
t = t._parent
}
return !1
},
children: function () {
return this._children.slice()
},
childAt: function (e) {
return this._children[e]
},
getChildByName: function (e) {
for (var t = this._children, r = 0; r < t.length; r++)
if (t[r].name === e)
return t[r]
},
getDescendantByName: function (e) {
for (var t = this._children, r = 0; r < t.length; r++) {
var i = t[r];
if (i.name === e)
return i;
var n = i.getDescendantByName(e);
if (n)
return n
}
},
queryNode: function (e) {
if (e) {
for (var t = e.split("/"), r = this, i = 0; i < t.length; i++) {
var n = t[i];
if (n) {
for (var a = !1, o = r._children, s = 0; s < o.length; s++) {
var l = o[s];
if (l.name === n) {
r = l,
a = !0;
break
}
}
if (!a)
return
}
}
return r
}
},
getPath: function (e) {
if (!this._parent)
return "/";
for (var t = this._parent, r = this.name; t._parent && (r = t.name + "/" + r,
t._parent != e);)
t = t._parent;
return !t._parent && e ? null : r
},
traverse: function (e, t) {
e.call(t, this);
for (var r = this._children, i = 0, n = r.length; i < n; i++)
r[i].traverse(e, t)
},
eachChild: function (e, t) {
for (var r = this._children, i = 0, n = r.length; i < n; i++) {
var a = r[i];
e.call(t, a, i)
}
},
setLocalTransform: function (e) {
Ye.copy(this.localTransform.array, e.array),
this.decomposeLocalTransform()
},
decomposeLocalTransform: function (e) {
var t = e ? null : this.scale;
this.localTransform.decomposeMatrix(t, this.rotation, this.position)
},
setWorldTransform: function (e) {
Ye.copy(this.worldTransform.array, e.array),
this.decomposeWorldTransform()
},
decomposeWorldTransform: (ar = Ye.create(),
function (e) {
var t = this.localTransform
, r = this.worldTransform;
this._parent ? (Ye.invert(ar, this._parent.worldTransform.array),
Ye.multiply(t.array, ar, r.array)) : Ye.copy(t.array, r.array);
var i = e ? null : this.scale;
t.decomposeMatrix(i, this.rotation, this.position)
}
),
transformNeedsUpdate: function () {
return this.position._dirty || this.rotation._dirty || this.scale._dirty
},
updateLocalTransform: function () {
var e = this.position
, t = this.rotation
, r = this.scale;
if (this.transformNeedsUpdate()) {
var i = this.localTransform.array;
Ye.fromRotationTranslation(i, t.array, e.array),
Ye.scale(i, i, r.array),
t._dirty = !1,
r._dirty = !1,
e._dirty = !1,
this._needsUpdateWorldTransform = !0
}
},
_updateWorldTransformTopDown: function () {
var e = this.localTransform.array
, t = this.worldTransform.array;
this._parent ? Ye.multiplyAffine(t, this._parent.worldTransform.array, e) : Ye.copy(t, e)
},
updateWorldTransform: function () {
for (var e = this; e && e.getParent() && e.getParent().transformNeedsUpdate();)
e = e.getParent();
e.update()
},
update: function (e) {
this.autoUpdateLocalTransform ? this.updateLocalTransform() : e = !0,
(e || this._needsUpdateWorldTransform) && (this._updateWorldTransformTopDown(),
e = !0,
this._needsUpdateWorldTransform = !1);
for (var t = this._children, r = 0, i = t.length; r < i; r++)
t[r].update(e)
},
getBoundingBox: function () {
function e(e) {
return !e.invisible && e.geometry
}
var t = new ir
, r = new Ht
, i = new Ht;
return function (n, a) {
return a = a || new ir,
n = n || e,
this._parent ? Ht.invert(i, this._parent.worldTransform) : Ht.identity(i),
this.traverse((function (e) {
e.geometry && e.geometry.boundingBox && (t.copy(e.geometry.boundingBox),
Ht.multiply(r, i, e.worldTransform),
t.applyTransform(r),
a.union(t))
}
), this, e),
a
}
}(),
getWorldPosition: function (e) {
this.transformNeedsUpdate() && this.updateWorldTransform();
var t = this.worldTransform.array;
if (e) {
var r = e.array;
return r[0] = t[12],
r[1] = t[13],
r[2] = t[14],
e
}
return new vt(t[12], t[13], t[14])
},
clone: function () {
var e = new this.constructor
, t = this._children;
e.setName(this.name),
e.position.copy(this.position),
e.rotation.copy(this.rotation),
e.scale.copy(this.scale);
for (var r = 0; r < t.length; r++)
e.add(t[r].clone());
return e
},
rotateAround: function () {
var e = new vt
, t = new Ht;
return function (r, i, n) {
e.copy(this.position).subtract(r);
var a = this.localTransform;
a.identity(),
a.translate(r),
a.rotate(n, i),
t.fromRotationTranslation(this.rotation, e),
a.multiply(t),
a.scale(this.scale),
this.decomposeLocalTransform(),
this._needsUpdateWorldTransform = !0
}
}(),
lookAt: (nr = new Ht,
function (e, t) {
nr.lookAt(this.position, e, t || this.localTransform.y).invert(),
this.setLocalTransform(nr),
this.target = e
}
)
});
var lr, hr = sr.extend({
material: null,
geometry: null,
mode: 4,
_renderInfo: null
}, {
__program: null,
lightGroup: 0,
renderOrder: 0,
culling: !0,
cullFace: x,
frontFace: w,
frustumCulling: !0,
receiveShadow: !0,
castShadow: !0,
ignorePicking: !1,
ignorePreZ: !1,
ignoreGBuffer: !1,
isRenderable: function () {
return this.geometry && this.material && this.material.shader && !this.invisible && this.geometry.vertexCount > 0
},
beforeRender: function (e) { },
afterRender: function (e, t) { },
getBoundingBox: function (e, t) {
return t = sr.prototype.getBoundingBox.call(this, e, t),
this.geometry && this.geometry.boundingBox && t.union(this.geometry.boundingBox),
t
},
clone: (lr = ["castShadow", "receiveShadow", "mode", "culling", "cullFace", "frontFace", "frustumCulling", "renderOrder", "lineWidth", "ignorePicking", "ignorePreZ", "ignoreGBuffer"],
function () {
var e = sr.prototype.clone.call(this);
e.geometry = this.geometry,
e.material = this.material;
for (var t = 0; t < lr.length; t++) {
var r = lr[t];
e[r] !== this[r] && (e[r] = this[r])
}
return e
}
)
});
hr.POINTS = 0,
hr.LINES = 1,
hr.LINE_LOOP = 2,
hr.LINE_STRIP = 3,
hr.TRIANGLES = 4,
hr.TRIANGLE_STRIP = 5,
hr.TRIANGLE_FAN = 6,
hr.BACK = x,
hr.FRONT = y,
hr.FRONT_AND_BACK = 1032,
hr.CW = b,
hr.CCW = w;
const ur = hr;
var cr, dr, fr, pr, mr, gr = m.extend({
scene: null,
camera: null,
renderer: null
}, (function () {
this._ray = new Mt,
this._ndc = new _e
}
), {
pick: function (e, t, r) {
return this.pickAll(e, t, [], r)[0] || null
},
pickAll: function (e, t, r, i) {
return this.renderer.screenToNDC(e, t, this._ndc),
this.camera.castRay(this._ndc, this._ray),
r = r || [],
this._intersectNode(this.scene, r, i || !1),
r.sort(this._intersectionCompareFunc),
r
},
_intersectNode: function (e, t, r) {
e instanceof ur && e.isRenderable() && (e.ignorePicking && !r || !(4 === e.mode && e.geometry.isUseIndices() || e.geometry.pickByRay || e.geometry.pick) || this._intersectRenderable(e, t));
for (var i = 0; i < e._children.length; i++)
this._intersectNode(e._children[i], t, r)
},
_intersectRenderable: (cr = new vt,
dr = new vt,
fr = new vt,
pr = new Mt,
mr = new Ht,
function (e, t) {
var r = e.isSkinnedMesh();
pr.copy(this._ray),
Ht.invert(mr, e.worldTransform),
r || pr.applyTransform(mr);
var i = e.geometry
, n = r ? e.skeleton.boundingBox : i.boundingBox;
if (!n || pr.intersectBoundingBox(n))
if (i.pick)
i.pick(this._ndc.x, this._ndc.y, this.renderer, this.camera, e, t);
else if (i.pickByRay)
i.pickByRay(pr, e, t);
else {
var a, o, s = e.cullFace === x && e.frontFace === w || e.cullFace === y && e.frontFace === b, l = i.indices, h = i.attributes.position, u = i.attributes.weight, c = i.attributes.joint, d = [];
if (h && h.value && l) {
if (r) {
o = e.skeleton.getSubSkinMatrices(e.__uid__, e.joints);
for (var f = 0; f < e.joints.length; f++) {
d[f] = d[f] || [];
for (var p = 0; p < 16; p++)
d[f][p] = o[16 * f + p]
}
var m = []
, g = []
, _ = []
, v = []
, T = []
, S = i.attributes.skinnedPosition;
for (S && S.value || (i.createAttribute("skinnedPosition", "f", 3),
(S = i.attributes.skinnedPosition).init(i.vertexCount)),
f = 0; f < i.vertexCount; f++) {
for (h.get(f, m),
u.get(f, g),
c.get(f, _),
g[3] = 1 - g[0] - g[1] - g[2],
Qe.set(v, 0, 0, 0),
p = 0; p < 4; p++)
_[p] >= 0 && g[p] > 1e-4 && (Qe.transformMat4(T, m, d[_[p]]),
Qe.scaleAndAdd(v, v, T, g[p]));
S.set(f, v)
}
}
for (f = 0; f < l.length; f += 3) {
var M = l[f]
, A = l[f + 1]
, E = l[f + 2]
, C = r ? i.attributes.skinnedPosition : h;
if (C.get(M, cr.array),
C.get(A, dr.array),
C.get(E, fr.array),
a = s ? pr.intersectTriangle(cr, dr, fr, e.culling) : pr.intersectTriangle(cr, fr, dr, e.culling)) {
var D = new vt;
r ? vt.copy(D, a) : vt.transformMat4(D, a, e.worldTransform),
t.push(new gr.Intersection(a, D, e, [M, A, E], f / 3, vt.dist(D, this._ray.origin)))
}
}
}
}
}
),
_intersectionCompareFunc: function (e, t) {
return e.distance - t.distance
}
});
gr.Intersection = function (e, t, r, i, n, a) {
this.point = e,
this.pointWorld = t,
this.target = r,
this.triangle = i,
this.triangleIndex = n,
this.distance = a
}
;
const _r = gr;
var vr = "__dt__"
, yr = function () {
this._contextId = 0,
this._caches = [],
this._context = {}
};
(yr.prototype = {
use: function (e, t) {
var r = this._caches;
r[e] || (r[e] = {},
t && (r[e] = t())),
this._contextId = e,
this._context = r[e]
},
put: function (e, t) {
this._context[e] = t
},
get: function (e) {
return this._context[e]
},
dirty: function (e) {
var t = vr + (e = e || "");
this.put(t, !0)
},
dirtyAll: function (e) {
for (var t = vr + (e = e || ""), r = this._caches, i = 0; i < r.length; i++)
r[i] && (r[i][t] = !0)
},
fresh: function (e) {
var t = vr + (e = e || "");
this.put(t, !1)
},
freshAll: function (e) {
for (var t = vr + (e = e || ""), r = this._caches, i = 0; i < r.length; i++)
r[i] && (r[i][t] = !1)
},
isDirty: function (e) {
var t = vr + (e = e || "")
, r = this._context;
return !r.hasOwnProperty(t) || !0 === r[t]
},
deleteContext: function (e) {
delete this._caches[e],
this._context = {}
},
delete: function (e) {
delete this._context[e]
},
clearAll: function () {
this._caches = {}
},
getContext: function () {
return this._context
},
eachContext: function (e, t) {
Object.keys(this._caches).forEach((function (r) {
e && e.call(t, r)
}
))
},
miss: function (e) {
return !this._context.hasOwnProperty(e)
}
}).constructor = yr;
const xr = yr;
var br = m.extend({
width: 512,
height: 512,
type: T,
format: A,
wrapS: N,
wrapT: N,
minFilter: O,
magFilter: C,
useMipmap: !0,
anisotropic: 1,
flipY: !0,
sRGB: !0,
unpackAlignment: 4,
premultiplyAlpha: !1,
dynamic: !1,
NPOT: !1,
__used: 0
}, (function () {
this._cache = new xr
}
), {
getWebGLTexture: function (e) {
var t = e.gl
, r = this._cache;
return r.use(e.__uid__),
r.miss("webgl_texture") && r.put("webgl_texture", t.createTexture()),
this.dynamic ? this.update(e) : r.isDirty() && (this.update(e),
r.fresh()),
r.get("webgl_texture")
},
bind: function () { },
unbind: function () { },
dirty: function () {
this._cache && this._cache.dirtyAll()
},
update: function (e) { },
updateCommon: function (e) {
var t = e.gl;
t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL, this.flipY),
t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.premultiplyAlpha),
t.pixelStorei(t.UNPACK_ALIGNMENT, this.unpackAlignment),
this.format === M && (this.useMipmap = !1);
var r = e.getGLExtension("EXT_sRGB");
this.format !== br.SRGB || r || (this.format = br.RGB),
this.format !== br.SRGB_ALPHA || r || (this.format = br.RGBA),
this.NPOT = !this.isPowerOfTwo()
},
getAvailableWrapS: function () {
return this.NPOT ? I : this.wrapS
},
getAvailableWrapT: function () {
return this.NPOT ? I : this.wrapT
},
getAvailableMinFilter: function () {
var e = this.minFilter;
return this.NPOT || !this.useMipmap ? e === D || e === P ? E : e === O || e === L ? C : e : e
},
getAvailableMagFilter: function () {
return this.magFilter
},
nextHighestPowerOfTwo: function (e) {
--e;
for (var t = 1; t < 32; t <<= 1)
e |= e >> t;
return e + 1
},
dispose: function (e) {
var t = this._cache;
t.use(e.__uid__);
var r = t.get("webgl_texture");
r && e.gl.deleteTexture(r),
t.deleteContext(e.__uid__)
},
isRenderable: function () { },
isPowerOfTwo: function () { }
});
Object.defineProperty(br.prototype, "width", {
get: function () {
return this._width
},
set: function (e) {
this._width = e
}
}),
Object.defineProperty(br.prototype, "height", {
get: function () {
return this._height
},
set: function (e) {
this._height = e
}
}),
br.BYTE = 5120,
br.UNSIGNED_BYTE = T,
br.SHORT = 5122,
br.UNSIGNED_SHORT = 5123,
br.INT = 5124,
br.UNSIGNED_INT = 5125,
br.FLOAT = S,
br.HALF_FLOAT = 36193,
br.UNSIGNED_INT_24_8_WEBGL = 34042,
br.DEPTH_COMPONENT = M,
br.DEPTH_STENCIL = 34041,
br.ALPHA = 6406,
br.RGB = 6407,
br.RGBA = A,
br.LUMINANCE = 6409,
br.LUMINANCE_ALPHA = 6410,
br.SRGB = 35904,
br.SRGB_ALPHA = 35906,
br.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776,
br.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777,
br.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778,
br.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779,
br.NEAREST = E,
br.LINEAR = C,
br.NEAREST_MIPMAP_NEAREST = D,
br.LINEAR_MIPMAP_NEAREST = L,
br.NEAREST_MIPMAP_LINEAR = P,
br.LINEAR_MIPMAP_LINEAR = O,
br.REPEAT = N,
br.CLAMP_TO_EDGE = I,
br.MIRRORED_REPEAT = 33648;
const wr = br;
var Tr = ur.extend({
skeleton: null,
joints: null
}, (function () {
this.joints || (this.joints = [])
}
), {
offsetMatrix: null,
isInstancedMesh: function () {
return !1
},
isSkinnedMesh: function () {
return !!(this.skeleton && this.joints && this.joints.length > 0)
},
clone: function () {
var e = ur.prototype.clone.call(this);
return e.skeleton = this.skeleton,
this.joints && (e.joints = this.joints.slice()),
e
}
});
Tr.POINTS = 0,
Tr.LINES = 1,
Tr.LINE_LOOP = 2,
Tr.LINE_STRIP = 3,
Tr.TRIANGLES = 4,
Tr.TRIANGLE_STRIP = 5,
Tr.TRIANGLE_FAN = 6,
Tr.BACK = x,
Tr.FRONT = y,
Tr.FRONT_AND_BACK = 1032,
Tr.CW = b,
Tr.CCW = w;
const Sr = Tr;
const Mr = {
isPowerOfTwo: function (e) {
return 0 == (e & e - 1)
},
nextPowerOfTwo: function (e) {
return e--,
e |= e >> 1,
e |= e >> 2,
e |= e >> 4,
e |= e >> 8,
e |= e >> 16,
++e
},
nearestPowerOfTwo: function (e) {
return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
}
};
var Ar = Mr.isPowerOfTwo;
function Er(e) {
return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
}
var Cr = wr.extend((function () {
return {
image: null,
pixels: null,
mipmaps: [],
convertToPOT: !1
}
}
), {
textureType: "texture2D",
update: function (e) {
var t = e.gl;
t.bindTexture(t.TEXTURE_2D, this._cache.get("webgl_texture")),
this.updateCommon(e);
var r = this.format
, i = this.type
, n = !(!this.convertToPOT || this.mipmaps.length || !this.image || this.wrapS !== wr.REPEAT && this.wrapT !== wr.REPEAT || !this.NPOT);
t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, n ? this.wrapS : this.getAvailableWrapS()),
t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, n ? this.wrapT : this.getAvailableWrapT()),
t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, n ? this.magFilter : this.getAvailableMagFilter()),
t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, n ? this.minFilter : this.getAvailableMinFilter());
var a = e.getGLExtension("EXT_texture_filter_anisotropic");
if (a && this.anisotropic > 1 && t.texParameterf(t.TEXTURE_2D, a.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic),
36193 === i && (e.getGLExtension("OES_texture_half_float") || (i = S)),
this.mipmaps.length)
for (var o = this.width, s = this.height, l = 0; l < this.mipmaps.length; l++) {
var h = this.mipmaps[l];
this._updateTextureData(t, h, l, o, s, r, i, !1),
o /= 2,
s /= 2
}
else
this._updateTextureData(t, this, 0, this.width, this.height, r, i, n),
!this.useMipmap || this.NPOT && !n || t.generateMipmap(t.TEXTURE_2D);
t.bindTexture(t.TEXTURE_2D, null)
},
_updateTextureData: function (e, t, r, i, n, a, o, s) {
if (t.image) {
var l = t.image;
s && (this._potCanvas = function (e, t) {
var r = Er(e.width)
, i = Er(e.height);
return (t = t || document.createElement("canvas")).width = r,
t.height = i,
t.getContext("2d").drawImage(e.image, 0, 0, r, i),
t
}(this, this._potCanvas),
l = this._potCanvas),
e.texImage2D(e.TEXTURE_2D, r, a, a, o, l)
} else
a <= wr.COMPRESSED_RGBA_S3TC_DXT5_EXT && a >= wr.COMPRESSED_RGB_S3TC_DXT1_EXT ? e.compressedTexImage2D(e.TEXTURE_2D, r, a, i, n, 0, t.pixels) : e.texImage2D(e.TEXTURE_2D, r, a, i, n, 0, a, o, t.pixels)
},
generateMipmap: function (e) {
var t = e.gl;
this.useMipmap && !this.NPOT && (t.bindTexture(t.TEXTURE_2D, this._cache.get("webgl_texture")),
t.generateMipmap(t.TEXTURE_2D))
},
isPowerOfTwo: function () {
return Ar(this.width) && Ar(this.height)
},
isRenderable: function () {
return this.image ? this.image.width > 0 && this.image.height > 0 : !(!this.width || !this.height)
},
bind: function (e) {
e.gl.bindTexture(e.gl.TEXTURE_2D, this.getWebGLTexture(e))
},
unbind: function (e) {
e.gl.bindTexture(e.gl.TEXTURE_2D, null)
},
load: function (e, t) {
var r = U.createImage();
t && (r.crossOrigin = t);
var i = this;
return r.onload = function () {
i.dirty(),
i.trigger("success", i)
}
,
r.onerror = function () {
i.trigger("error", i)
}
,
r.src = e,
this.image = r,
this
}
});
Object.defineProperty(Cr.prototype, "width", {
get: function () {
return this.image ? this.image.width : this._width
},
set: function (e) {
this.image ? console.warn("Texture from image can't set width") : (this._width !== e && this.dirty(),
this._width = e)
}
}),
Object.defineProperty(Cr.prototype, "height", {
get: function () {
return this.image ? this.image.height : this._height
},
set: function (e) {
this.image ? console.warn("Texture from image can't set height") : (this._height !== e && this.dirty(),
this._height = e)
}
});
const Dr = Cr;
function Lr(e) {
return {
byte: U.Int8Array,
ubyte: U.Uint8Array,
short: U.Int16Array,
ushort: U.Uint16Array
}[e] || U.Float32Array
}
function Pr(e) {
return "attr_" + e
}
function Or(e, t, r, i) {
switch (this.name = e,
this.type = t,
this.size = r,
this.semantic = i || "",
this.value = null,
r) {
case 1:
this.get = function (e) {
return this.value[e]
}
,
this.set = function (e, t) {
this.value[e] = t
}
,
this.copy = function (e, t) {
this.value[e] = this.value[e]
}
;
break;
case 2:
this.get = function (e, t) {
var r = this.value;
return t[0] = r[2 * e],
t[1] = r[2 * e + 1],
t
}
,
this.set = function (e, t) {
var r = this.value;
r[2 * e] = t[0],
r[2 * e + 1] = t[1]
}
,
this.copy = function (e, t) {
var r = this.value;
t *= 2,
r[e *= 2] = r[t],
r[e + 1] = r[t + 1]
}
;
break;
case 3:
this.get = function (e, t) {
var r = 3 * e
, i = this.value;
return t[0] = i[r],
t[1] = i[r + 1],
t[2] = i[r + 2],
t
}
,
this.set = function (e, t) {
var r = 3 * e
, i = this.value;
i[r] = t[0],
i[r + 1] = t[1],
i[r + 2] = t[2]
}
,
this.copy = function (e, t) {
var r = this.value;
t *= 3,
r[e *= 3] = r[t],
r[e + 1] = r[t + 1],
r[e + 2] = r[t + 2]
}
;
break;
case 4:
this.get = function (e, t) {
var r = this.value
, i = 4 * e;
return t[0] = r[i],
t[1] = r[i + 1],
t[2] = r[i + 2],
t[3] = r[i + 3],
t
}
,
this.set = function (e, t) {
var r = this.value
, i = 4 * e;
r[i] = t[0],
r[i + 1] = t[1],
r[i + 2] = t[2],
r[i + 3] = t[3]
}
,
this.copy = function (e, t) {
var r = this.value;
t *= 4,
r[e *= 4] = r[t],
r[e + 1] = r[t + 1],
r[e + 2] = r[t + 2],
r[e + 3] = r[t + 3]
}
}
}
function Nr(e, t, r, i, n) {
this.name = e,
this.type = t,
this.buffer = r,
this.size = i,
this.semantic = n,
this.symbol = "",
this.needsRemove = !1
}
function Ir(e) {
this.buffer = e,
this.count = 0
}
Or.prototype.init = function (e) {
if (!this.value || this.value.length !== e * this.size) {
var t = Lr(this.type);
this.value = new t(e * this.size)
}
}
,
Or.prototype.fromArray = function (e) {
var t, r = Lr(this.type);
if (e[0] && e[0].length) {
var i = 0
, n = this.size;
t = new r(e.length * n);
for (var a = 0; a < e.length; a++)
for (var o = 0; o < n; o++)
t[i++] = e[a][o]
} else
t = new r(e);
this.value = t
}
,
Or.prototype.clone = function (e) {
var t = new Or(this.name, this.type, this.size, this.semantic);
return e && console.warn("todo"),
t
}
;
var Rr = m.extend((function () {
return {
attributes: {},
indices: null,
dynamic: !0,
_enabledAttributes: null,
__used: 0
}
}
), (function () {
this._cache = new xr,
this._attributeList = Object.keys(this.attributes),
this.__vaoCache = {}
}
), {
mainAttribute: "",
pick: null,
pickByRay: null,
dirty: function () {
for (var e = this.getEnabledAttributes(), t = 0; t < e.length; t++)
this.dirtyAttribute(e[t]);
this.dirtyIndices(),
this._enabledAttributes = null,
this._cache.dirty("any")
},
dirtyIndices: function () {
this._cache.dirtyAll("indices")
},
dirtyAttribute: function (e) {
this._cache.dirtyAll(Pr(e)),
this._cache.dirtyAll("attributes")
},
getTriangleIndices: function (e, t) {
if (e < this.triangleCount && e >= 0) {
t || (t = []);
var r = this.indices;
return t[0] = r[3 * e],
t[1] = r[3 * e + 1],
t[2] = r[3 * e + 2],
t
}
},
setTriangleIndices: function (e, t) {
var r = this.indices;
r[3 * e] = t[0],
r[3 * e + 1] = t[1],
r[3 * e + 2] = t[2]
},
isUseIndices: function () {
return !!this.indices
},
initIndicesFromArray: function (e) {
var t, r = this.vertexCount > 65535 ? U.Uint32Array : U.Uint16Array;
if (e[0] && e[0].length) {
var i = 0;
t = new r(3 * e.length);
for (var n = 0; n < e.length; n++)
for (var a = 0; a < 3; a++)
t[i++] = e[n][a]
} else
t = new r(e);
this.indices = t
},
createAttribute: function (e, t, r, i) {
var n = new Or(e, t, r, i);
return this.attributes[e] && this.removeAttribute(e),
this.attributes[e] = n,
this._attributeList.push(e),
n
},
removeAttribute: function (e) {
var t = this._attributeList
, r = t.indexOf(e);
return r >= 0 && (t.splice(r, 1),
delete this.attributes[e],
!0)
},
getAttribute: function (e) {
return this.attributes[e]
},
getEnabledAttributes: function () {
var e = this._enabledAttributes
, t = this._attributeList;
if (e)
return e;
for (var r = [], i = this.vertexCount, n = 0; n < t.length; n++) {
var a = t[n]
, o = this.attributes[a];
o.value && o.value.length === i * o.size && r.push(a)
}
return this._enabledAttributes = r,
r
},
getBufferChunks: function (e) {
var t = this._cache;
t.use(e.__uid__);
var r = t.isDirty("attributes")
, i = t.isDirty("indices");
if (r || i) {
this._updateBuffer(e.gl, r, i);
for (var n = this.getEnabledAttributes(), a = 0; a < n.length; a++)
t.fresh(Pr(n[a]));
t.fresh("attributes"),
t.fresh("indices")
}
return t.fresh("any"),
t.get("chunks")
},
_updateBuffer: function (e, t, r) {
var i = this._cache
, n = i.get("chunks")
, a = !1;
n || ((n = [])[0] = {
attributeBuffers: [],
indicesBuffer: null
},
i.put("chunks", n),
a = !0);
var o = n[0]
, s = o.attributeBuffers
, l = o.indicesBuffer;
if (t || a) {
var h = this.getEnabledAttributes()
, u = {};
if (!a)
for (var c = 0; c < s.length; c++)
u[s[c].name] = s[c];
for (var d = 0; d < h.length; d++) {
var f, p, m = h[d], g = this.attributes[m];
a || (f = u[m]),
p = f ? f.buffer : e.createBuffer(),
i.isDirty(Pr(m)) && (e.bindBuffer(e.ARRAY_BUFFER, p),
e.bufferData(e.ARRAY_BUFFER, g.value, this.dynamic ? e.DYNAMIC_DRAW : e.STATIC_DRAW)),
s[d] = new Nr(m, g.type, p, g.size, g.semantic)
}
for (c = d; c < s.length; c++)
e.deleteBuffer(s[c].buffer);
s.length = d
}
this.isUseIndices() && (r || a) && (l || (l = new Ir(e.createBuffer()),
o.indicesBuffer = l),
l.count = this.indices.length,
e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, l.buffer),
e.bufferData(e.ELEMENT_ARRAY_BUFFER, this.indices, this.dynamic ? e.DYNAMIC_DRAW : e.STATIC_DRAW))
},
dispose: function (e) {
var t = this._cache;
t.use(e.__uid__);
var r = t.get("chunks");
if (r)
for (var i = 0; i < r.length; i++) {
for (var n = r[i], a = 0; a < n.attributeBuffers.length; a++) {
var o = n.attributeBuffers[a];
e.gl.deleteBuffer(o.buffer)
}
n.indicesBuffer && e.gl.deleteBuffer(n.indicesBuffer.buffer)
}
if (this.__vaoCache) {
var s = e.getGLExtension("OES_vertex_array_object");
for (var l in this.__vaoCache) {
var h = this.__vaoCache[l].vao;
h && s.deleteVertexArrayOES(h)
}
}
this.__vaoCache = {},
t.deleteContext(e.__uid__)
}
});
Object.defineProperty && (Object.defineProperty(Rr.prototype, "vertexCount", {
enumerable: !1,
get: function () {
var e = this.attributes[this.mainAttribute];
return e || (e = this.attributes[this._attributeList[0]]),
e && e.value ? e.value.length / e.size : 0
}
}),
Object.defineProperty(Rr.prototype, "triangleCount", {
enumerable: !1,
get: function () {
var e = this.indices;
return e ? e.length / 3 : 0
}
})),
Rr.STATIC_DRAW = 35044,
Rr.DYNAMIC_DRAW = 35048,
Rr.STREAM_DRAW = 35040,
Rr.AttributeBuffer = Nr,
Rr.IndicesBuffer = Ir,
Rr.Attribute = Or;
const Br = Rr;
var Fr = Qe.create
, zr = Qe.add
, Gr = Qe.set
, Ur = Br.Attribute
, kr = Br.extend((function () {
return {
attributes: {
position: new Ur("position", "float", 3, "POSITION"),
texcoord0: new Ur("texcoord0", "float", 2, "TEXCOORD_0"),
texcoord1: new Ur("texcoord1", "float", 2, "TEXCOORD_1"),
normal: new Ur("normal", "float", 3, "NORMAL"),
tangent: new Ur("tangent", "float", 4, "TANGENT"),
color: new Ur("color", "float", 4, "COLOR"),
weight: new Ur("weight", "float", 3, "WEIGHT"),
joint: new Ur("joint", "float", 4, "JOINT"),
barycentric: new Ur("barycentric", "float", 3, null)
},
boundingBox: null
}
}
), {
mainAttribute: "position",
updateBoundingBox: function () {
var e = this.boundingBox;
e || (e = this.boundingBox = new ir);
var t = this.attributes.position.value;
if (t && t.length) {
var r = e.min
, i = e.max
, n = r.array
, a = i.array;
Qe.set(n, t[0], t[1], t[2]),
Qe.set(a, t[0], t[1], t[2]);
for (var o = 3; o < t.length;) {
var s = t[o++]
, l = t[o++]
, h = t[o++];
s < n[0] && (n[0] = s),
l < n[1] && (n[1] = l),
h < n[2] && (n[2] = h),
s > a[0] && (a[0] = s),
l > a[1] && (a[1] = l),
h > a[2] && (a[2] = h)
}
r._dirty = !0,
i._dirty = !0
}
},
generateVertexNormals: function () {
if (this.vertexCount) {
var e = this.indices
, t = this.attributes
, r = t.position.value
, i = t.normal.value;
if (i && i.length === r.length)
for (var n = 0; n < i.length; n++)
i[n] = 0;
else
i = t.normal.value = new U.Float32Array(r.length);
for (var a, o, s, l = Fr(), h = Fr(), u = Fr(), c = Fr(), d = Fr(), f = Fr(), p = e ? e.length : this.vertexCount, m = 0; m < p;)
for (e ? (a = e[m++],
o = e[m++],
s = e[m++]) : (a = m++,
o = m++,
s = m++),
Gr(l, r[3 * a], r[3 * a + 1], r[3 * a + 2]),
Gr(h, r[3 * o], r[3 * o + 1], r[3 * o + 2]),
Gr(u, r[3 * s], r[3 * s + 1], r[3 * s + 2]),
Qe.sub(c, l, h),
Qe.sub(d, h, u),
Qe.cross(f, c, d),
n = 0; n < 3; n++)
i[3 * a + n] = i[3 * a + n] + f[n],
i[3 * o + n] = i[3 * o + n] + f[n],
i[3 * s + n] = i[3 * s + n] + f[n];
for (n = 0; n < i.length;)
Gr(f, i[n], i[n + 1], i[n + 2]),
Qe.normalize(f, f),
i[n++] = f[0],
i[n++] = f[1],
i[n++] = f[2];
this.dirty()
}
},
generateFaceNormals: function () {
if (this.vertexCount) {
this.isUniqueVertex() || this.generateUniqueVertex();
var e = this.indices
, t = this.attributes
, r = t.position.value
, i = t.normal.value
, n = Fr()
, a = Fr()
, o = Fr()
, s = Fr()
, l = Fr()
, h = Fr();
i || (i = t.normal.value = new Float32Array(r.length));
for (var u, c, d, f = e ? e.length : this.vertexCount, p = 0; p < f;) {
e ? (u = e[p++],
c = e[p++],
d = e[p++]) : (u = p++,
c = p++,
d = p++),
Gr(n, r[3 * u], r[3 * u + 1], r[3 * u + 2]),
Gr(a, r[3 * c], r[3 * c + 1], r[3 * c + 2]),
Gr(o, r[3 * d], r[3 * d + 1], r[3 * d + 2]),
Qe.sub(s, n, a),
Qe.sub(l, a, o),
Qe.cross(h, s, l),
Qe.normalize(h, h);
for (var m = 0; m < 3; m++)
i[3 * u + m] = h[m],
i[3 * c + m] = h[m],
i[3 * d + m] = h[m]
}
this.dirty()
}
},
generateTangents: function () {
if (this.vertexCount) {
var e = this.vertexCount
, t = this.attributes;
t.tangent.value || (t.tangent.value = new Float32Array(4 * e));
var r = t.texcoord0.value
, i = t.position.value
, n = t.tangent.value
, a = t.normal.value;
if (r) {
for (var o = [], s = [], l = 0; l < e; l++)
o[l] = [0, 0, 0],
s[l] = [0, 0, 0];
var h, u, c, d = [0, 0, 0], f = [0, 0, 0], p = this.indices, m = p ? p.length : this.vertexCount;
for (l = 0; l < m;) {
p ? (h = p[l++],
u = p[l++],
c = p[l++]) : (h = l++,
u = l++,
c = l++);
var g = r[2 * h]
, _ = r[2 * u]
, v = r[2 * c]
, y = r[2 * h + 1]
, x = r[2 * u + 1]
, b = r[2 * c + 1]
, w = i[3 * h]
, T = i[3 * u]
, S = i[3 * c]
, M = i[3 * h + 1]
, A = i[3 * u + 1]
, E = i[3 * c + 1]
, C = i[3 * h + 2]
, D = T - w
, L = S - w
, P = A - M
, O = E - M
, N = i[3 * u + 2] - C
, I = i[3 * c + 2] - C
, R = _ - g
, B = v - g
, F = x - y
, z = b - y
, G = 1 / (R * z - F * B);
d[0] = (z * D - F * L) * G,
d[1] = (z * P - F * O) * G,
d[2] = (z * N - F * I) * G,
f[0] = (R * L - B * D) * G,
f[1] = (R * O - B * P) * G,
f[2] = (R * I - B * N) * G,
zr(o[h], o[h], d),
zr(o[u], o[u], d),
zr(o[c], o[c], d),
zr(s[h], s[h], f),
zr(s[u], s[u], f),
zr(s[c], s[c], f)
}
var U = Fr()
, k = Fr()
, V = Fr();
for (l = 0; l < e; l++) {
V[0] = a[3 * l],
V[1] = a[3 * l + 1],
V[2] = a[3 * l + 2];
var H = o[l];
Qe.scale(U, V, Qe.dot(V, H)),
Qe.sub(U, H, U),
Qe.normalize(U, U),
Qe.cross(k, V, H),
n[4 * l] = U[0],
n[4 * l + 1] = U[1],
n[4 * l + 2] = U[2],
n[4 * l + 3] = Qe.dot(k, s[l]) < 0 ? -1 : 1
}
this.dirty()
} else
console.warn("Geometry without texcoords can't generate tangents.")
}
},
isUniqueVertex: function () {
return !this.isUseIndices() || this.vertexCount === this.indices.length
},
generateUniqueVertex: function () {
if (this.vertexCount && this.indices) {
this.indices.length > 65535 && (this.indices = new U.Uint32Array(this.indices));
for (var e = this.attributes, t = this.indices, r = this.getEnabledAttributes(), i = {}, n = 0; n < r.length; n++)
i[l = r[n]] = e[l].value,
e[l].init(this.indices.length);
for (var a = 0, o = 0; o < t.length; o++) {
var s = t[o];
for (n = 0; n < r.length; n++)
for (var l, h = e[l = r[n]].value, u = e[l].size, c = 0; c < u; c++)
h[a * u + c] = i[l][s * u + c];
t[o] = a,
a++
}
this.dirty()
}
},
generateBarycentric: function () {
if (this.vertexCount) {
this.isUniqueVertex() || this.generateUniqueVertex();
var e = this.attributes
, t = e.barycentric.value
, r = this.indices;
if (!t || t.length !== 3 * r.length) {
t = e.barycentric.value = new Float32Array(3 * r.length);
for (var i = 0; i < (r ? r.length : this.vertexCount / 3);)
for (var n = 0; n < 3; n++)
t[3 * (r ? r[i++] : 3 * i + n) + n] = 1;
this.dirty()
}
}
},
applyTransform: function (e) {
var t = this.attributes
, r = t.position.value
, i = t.normal.value
, n = t.tangent.value;
e = e.array;
var a = Ye.create();
Ye.invert(a, e),
Ye.transpose(a, a);
var o = Qe.transformMat4
, s = Qe.forEach;
s(r, 3, 0, null, o, e),
i && s(i, 3, 0, null, o, a),
n && s(n, 4, 0, null, o, a),
this.boundingBox && this.updateBoundingBox()
},
dispose: function (e) {
var t = this._cache;
t.use(e.__uid__);
var r = t.get("chunks");
if (r)
for (var i = 0; i < r.length; i++) {
for (var n = r[i], a = 0; a < n.attributeBuffers.length; a++) {
var o = n.attributeBuffers[a];
e.gl.deleteBuffer(o.buffer)
}
n.indicesBuffer && e.gl.deleteBuffer(n.indicesBuffer.buffer)
}
if (this.__vaoCache) {
var s = e.getGLExtension("OES_vertex_array_object");
for (var l in this.__vaoCache) {
var h = this.__vaoCache[l].vao;
h && s.deleteVertexArrayOES(h)
}
}
this.__vaoCache = {},
t.deleteContext(e.__uid__)
}
});
kr.STATIC_DRAW = Br.STATIC_DRAW,
kr.DYNAMIC_DRAW = Br.DYNAMIC_DRAW,
kr.STREAM_DRAW = Br.STREAM_DRAW,
kr.AttributeBuffer = Br.AttributeBuffer,
kr.IndicesBuffer = Br.IndicesBuffer,
kr.Attribute = Ur;
const Vr = kr;
var Hr = "@export clay.header."
, Wr = "@end"
, jr = ":unconfigurable;";
const Xr = [Hr + "directional_light", "uniform vec3 directionalLightDirection[DIRECTIONAL_LIGHT_COUNT]" + jr, "uniform vec3 directionalLightColor[DIRECTIONAL_LIGHT_COUNT]" + jr, Wr, Hr + "ambient_light", "uniform vec3 ambientLightColor[AMBIENT_LIGHT_COUNT]" + jr, Wr, Hr + "ambient_sh_light", "uniform vec3 ambientSHLightColor[AMBIENT_SH_LIGHT_COUNT]" + jr, "uniform vec3 ambientSHLightCoefficients[AMBIENT_SH_LIGHT_COUNT * 9]" + jr, "vec3 calcAmbientSHLight(int idx, vec3 N) {\n int offset = 9 * idx;\n return ambientSHLightCoefficients[0]\n + ambientSHLightCoefficients[1] * N.x\n + ambientSHLightCoefficients[2] * N.y\n + ambientSHLightCoefficients[3] * N.z\n + ambientSHLightCoefficients[4] * N.x * N.z\n + ambientSHLightCoefficients[5] * N.z * N.y\n + ambientSHLightCoefficients[6] * N.y * N.x\n + ambientSHLightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + ambientSHLightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}", Wr, Hr + "ambient_cubemap_light", "uniform vec3 ambientCubemapLightColor[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, "uniform samplerCube ambientCubemapLightCubemap[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, "uniform sampler2D ambientCubemapLightBRDFLookup[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, Wr, Hr + "point_light", "uniform vec3 pointLightPosition[POINT_LIGHT_COUNT]" + jr, "uniform float pointLightRange[POINT_LIGHT_COUNT]" + jr, "uniform vec3 pointLightColor[POINT_LIGHT_COUNT]" + jr, Wr, Hr + "spot_light", "uniform vec3 spotLightPosition[SPOT_LIGHT_COUNT]" + jr, "uniform vec3 spotLightDirection[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightRange[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightUmbraAngleCosine[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightPenumbraAngleCosine[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightFalloffFactor[SPOT_LIGHT_COUNT]" + jr, "uniform vec3 spotLightColor[SPOT_LIGHT_COUNT]" + jr, Wr].join("\n");
Xe.import(Xr);
const qr = sr.extend((function () {
return {
color: [1, 1, 1],
intensity: 1,
castShadow: !0,
shadowResolution: 512,
group: 0
}
}
), {
type: "",
clone: function () {
var e = sr.prototype.clone.call(this);
return e.color = Array.prototype.slice.call(this.color),
e.intensity = this.intensity,
e.castShadow = this.castShadow,
e.shadowResolution = this.shadowResolution,
e
}
});
var Zr, Yr, Kr, Qr, Jr = function (e, t) {
this.normal = e || new vt(0, 1, 0),
this.distance = t || 0
};
Jr.prototype = {
constructor: Jr,
distanceToPoint: function (e) {
return Qe.dot(e.array, this.normal.array) - this.distance
},
projectPoint: function (e, t) {
t || (t = new vt);
var r = this.distanceToPoint(e);
return Qe.scaleAndAdd(t.array, e.array, this.normal.array, -r),
t._dirty = !0,
t
},
normalize: function () {
var e = 1 / Qe.len(this.normal.array);
Qe.scale(this.normal.array, e),
this.distance *= e
},
intersectFrustum: function (e) {
for (var t = e.vertices, r = this.normal.array, i = Qe.dot(t[0].array, r) > this.distance, n = 1; n < 8; n++)
if (Qe.dot(t[n].array, r) > this.distance != i)
return !0
},
intersectLine: (Qr = Qe.create(),
function (e, t, r) {
var i = this.distanceToPoint(e)
, n = this.distanceToPoint(t);
if (i > 0 && n > 0 || i < 0 && n < 0)
return null;
var a = this.normal.array
, o = this.distance
, s = e.array;
Qe.sub(Qr, t.array, e.array),
Qe.normalize(Qr, Qr);
var l = Qe.dot(a, Qr);
if (0 === l)
return null;
r || (r = new vt);
var h = (Qe.dot(a, s) - o) / l;
return Qe.scaleAndAdd(r.array, s, Qr, -h),
r._dirty = !0,
r
}
),
applyTransform: (Zr = Ye.create(),
Yr = Et.create(),
Kr = Et.create(),
Kr[3] = 1,
function (e) {
e = e.array,
Qe.scale(Kr, this.normal.array, this.distance),
Et.transformMat4(Kr, Kr, e),
this.distance = Qe.dot(Kr, this.normal.array),
Ye.invert(Zr, e),
Ye.transpose(Zr, Zr),
Yr[3] = 0,
Qe.copy(Yr, this.normal.array),
Et.transformMat4(Yr, Yr, Zr),
Qe.copy(this.normal.array, Yr)
}
),
copy: function (e) {
Qe.copy(this.normal.array, e.normal.array),
this.normal._dirty = !0,
this.distance = e.distance
},
clone: function () {
var e = new Jr;
return e.copy(this),
e
}
};
const $r = Jr;
var ei, ti = Qe.set, ri = Qe.copy, ii = Qe.transformMat4, ni = Math.min, ai = Math.max, oi = function () {
this.planes = [];
for (var e = 0; e < 6; e++)
this.planes.push(new $r);
for (this.boundingBox = new ir,
this.vertices = [],
e = 0; e < 8; e++)
this.vertices[e] = Qe.fromValues(0, 0, 0)
};
oi.prototype = {
setFromProjection: function (e) {
var t = this.planes
, r = e.array
, i = r[0]
, n = r[1]
, a = r[2]
, o = r[3]
, s = r[4]
, l = r[5]
, h = r[6]
, u = r[7]
, c = r[8]
, d = r[9]
, f = r[10]
, p = r[11]
, m = r[12]
, g = r[13]
, _ = r[14]
, v = r[15];
ti(t[0].normal.array, o - i, u - s, p - c),
t[0].distance = -(v - m),
t[0].normalize(),
ti(t[1].normal.array, o + i, u + s, p + c),
t[1].distance = -(v + m),
t[1].normalize(),
ti(t[2].normal.array, o + n, u + l, p + d),
t[2].distance = -(v + g),
t[2].normalize(),
ti(t[3].normal.array, o - n, u - l, p - d),
t[3].distance = -(v - g),
t[3].normalize(),
ti(t[4].normal.array, o - a, u - h, p - f),
t[4].distance = -(v - _),
t[4].normalize(),
ti(t[5].normal.array, o + a, u + h, p + f),
t[5].distance = -(v + _),
t[5].normalize();
var y = this.boundingBox
, x = this.vertices;
if (0 === v) {
var b = l / i
, w = -_ / (f - 1)
, T = -_ / (f + 1)
, S = -T / l
, M = -w / l;
y.min.set(-S * b, -S, T),
y.max.set(S * b, S, w),
ti(x[0], -S * b, -S, T),
ti(x[1], -S * b, S, T),
ti(x[2], S * b, -S, T),
ti(x[3], S * b, S, T),
ti(x[4], -M * b, -M, w),
ti(x[5], -M * b, M, w),
ti(x[6], M * b, -M, w),
ti(x[7], M * b, M, w)
} else {
var A = (-1 - m) / i
, E = (1 - m) / i
, C = (1 - g) / l
, D = (-1 - g) / l
, L = (-1 - _) / f
, P = (1 - _) / f;
y.min.set(Math.min(A, E), Math.min(D, C), Math.min(P, L)),
y.max.set(Math.max(E, A), Math.max(C, D), Math.max(L, P));
var O = y.min.array
, N = y.max.array;
ti(x[0], O[0], O[1], O[2]),
ti(x[1], O[0], N[1], O[2]),
ti(x[2], N[0], O[1], O[2]),
ti(x[3], N[0], N[1], O[2]),
ti(x[4], O[0], O[1], N[2]),
ti(x[5], O[0], N[1], N[2]),
ti(x[6], N[0], O[1], N[2]),
ti(x[7], N[0], N[1], N[2])
}
},
getTransformedBoundingBox: (ei = Qe.create(),
function (e, t) {
var r = this.vertices
, i = t.array
, n = e.min
, a = e.max
, o = n.array
, s = a.array
, l = r[0];
ii(ei, l, i),
ri(o, ei),
ri(s, ei);
for (var h = 1; h < 8; h++)
l = r[h],
ii(ei, l, i),
o[0] = ni(ei[0], o[0]),
o[1] = ni(ei[1], o[1]),
o[2] = ni(ei[2], o[2]),
s[0] = ai(ei[0], s[0]),
s[1] = ai(ei[1], s[1]),
s[2] = ai(ei[2], s[2]);
return n._dirty = !0,
a._dirty = !0,
e
}
)
};
const si = oi;
var li;
const hi = sr.extend((function () {
return {
projectionMatrix: new Ht,
invProjectionMatrix: new Ht,
viewMatrix: new Ht,
frustum: new si
}
}
), (function () {
this.update(!0)
}
), {
update: function (e) {
sr.prototype.update.call(this, e),
Ht.invert(this.viewMatrix, this.worldTransform),
this.updateProjectionMatrix(),
Ht.invert(this.invProjectionMatrix, this.projectionMatrix),
this.frustum.setFromProjection(this.projectionMatrix)
},
setViewMatrix: function (e) {
Ht.copy(this.viewMatrix, e),
Ht.invert(this.worldTransform, e),
this.decomposeWorldTransform()
},
decomposeProjectionMatrix: function () { },
setProjectionMatrix: function (e) {
Ht.copy(this.projectionMatrix, e),
Ht.invert(this.invProjectionMatrix, e),
this.decomposeProjectionMatrix()
},
updateProjectionMatrix: function () { },
castRay: (li = Et.create(),
function (e, t) {
var r = void 0 !== t ? t : new Mt
, i = e.array[0]
, n = e.array[1];
return Et.set(li, i, n, -1, 1),
Et.transformMat4(li, li, this.invProjectionMatrix.array),
Et.transformMat4(li, li, this.worldTransform.array),
Qe.scale(r.origin.array, li, 1 / li[3]),
Et.set(li, i, n, 1, 1),
Et.transformMat4(li, li, this.invProjectionMatrix.array),
Et.transformMat4(li, li, this.worldTransform.array),
Qe.scale(li, li, 1 / li[3]),
Qe.sub(r.direction.array, li, r.origin.array),
Qe.normalize(r.direction.array, r.direction.array),
r.direction._dirty = !0,
r.origin._dirty = !0,
r
}
)
});
var ui, ci, di = Ye.create(), fi = Ye.create(), pi = {};
function mi(e) {
var t = []
, r = Object.keys(e);
r.sort();
for (var i = 0; i < r.length; i++) {
var n = r[i];
t.push(n + " " + e[n])
}
var a = t.join("\n");
if (pi[a])
return pi[a];
var o = f.genGUID();
return pi[a] = o,
o
}
function gi() {
this.opaque = [],
this.transparent = [],
this._opaqueCount = 0,
this._transparentCount = 0
}
function _i(e, t) {
if (t.castShadow && !e.castShadow)
return !0
}
gi.prototype.startCount = function () {
this._opaqueCount = 0,
this._transparentCount = 0
}
,
gi.prototype.add = function (e, t) {
t ? this.transparent[this._transparentCount++] = e : this.opaque[this._opaqueCount++] = e
}
,
gi.prototype.endCount = function () {
this.transparent.length = this._transparentCount,
this.opaque.length = this._opaqueCount
}
;
const vi = sr.extend((function () {
return {
material: null,
lights: [],
viewBoundingBoxLastFrame: new ir,
shadowUniforms: {},
_cameraList: [],
_lightUniforms: {},
_previousLightNumber: {},
_lightNumber: {},
_lightProgramKeys: {},
_nodeRepository: {},
_renderLists: new W(20)
}
}
), (function () {
this._scene = this
}
), {
addToScene: function (e) {
e instanceof hi ? (this._cameraList.length > 0 && console.warn("Found multiple camera in one scene. Use the fist one."),
this._cameraList.push(e)) : e instanceof qr && this.lights.push(e),
e.name && (this._nodeRepository[e.name] = e)
},
removeFromScene: function (e) {
var t;
e instanceof hi ? (t = this._cameraList.indexOf(e)) >= 0 && this._cameraList.splice(t, 1) : e instanceof qr && (t = this.lights.indexOf(e)) >= 0 && this.lights.splice(t, 1),
e.name && delete this._nodeRepository[e.name]
},
getNode: function (e) {
return this._nodeRepository[e]
},
setMainCamera: function (e) {
var t = this._cameraList.indexOf(e);
t >= 0 && this._cameraList.splice(t, 1),
this._cameraList.unshift(e)
},
getMainCamera: function () {
return this._cameraList[0]
},
getLights: function () {
return this.lights
},
updateLights: function () {
var e = this.lights;
this._previousLightNumber = this._lightNumber;
for (var t = {}, r = 0; r < e.length; r++) {
var i = e[r];
if (!i.invisible) {
var n = i.group;
t[n] || (t[n] = {}),
t[n][i.type] = t[n][i.type] || 0,
t[n][i.type]++
}
}
for (var a in this._lightNumber = t,
t)
this._lightProgramKeys[a] = mi(t[a]);
this._updateLightUniforms()
},
cloneNode: function (e) {
var t = e.clone()
, r = {};
return function e(t, i) {
r[t.__uid__] = i;
for (var n = 0; n < t._children.length; n++)
e(t._children[n], i._children[n])
}(e, t),
t.traverse((function (e) {
e.skeleton && (e.skeleton = e.skeleton.clone(r)),
e.material && (e.material = e.material.clone())
}
)),
t
},
updateRenderList: function (e, t) {
var r = e.__uid__
, i = this._renderLists.get(r);
i || (i = new gi,
this._renderLists.put(r, i)),
i.startCount(),
t && (this.viewBoundingBoxLastFrame.min.set(1 / 0, 1 / 0, 1 / 0),
this.viewBoundingBoxLastFrame.max.set(-1 / 0, -1 / 0, -1 / 0));
var n = this.material && this.material.transparent || !1;
return this._doUpdateRenderList(this, e, n, i, t),
i.endCount(),
i
},
getRenderList: function (e) {
return this._renderLists.get(e.__uid__)
},
_doUpdateRenderList: function (e, t, r, i, n) {
if (!e.invisible)
for (var a = 0; a < e._children.length; a++) {
var o = e._children[a];
if (o.isRenderable()) {
var s = o.isSkinnedMesh() ? di : o.worldTransform.array
, l = o.geometry;
Ye.multiplyAffine(fi, t.viewMatrix.array, s),
(n && !l.boundingBox || !this.isFrustumCulled(o, t, fi)) && i.add(o, o.material.transparent || r)
}
o._children.length > 0 && this._doUpdateRenderList(o, t, r, i, n)
}
},
isFrustumCulled: (ui = new ir,
ci = new Ht,
function (e, t, r) {
var i = e.boundingBox;
if (i || (i = e.skeleton && e.skeleton.boundingBox ? e.skeleton.boundingBox : e.geometry.boundingBox),
!i)
return !1;
if (ci.array = r,
ui.transformFrom(i, ci),
e.castShadow && this.viewBoundingBoxLastFrame.union(ui),
e.frustumCulling) {
if (!ui.intersectBoundingBox(t.frustum.boundingBox))
return !0;
ci.array = t.projectionMatrix.array,
ui.max.array[2] > 0 && ui.min.array[2] < 0 && (ui.max.array[2] = -1e-20),
ui.applyProjection(ci);
var n = ui.min.array
, a = ui.max.array;
if (a[0] < -1 || n[0] > 1 || a[1] < -1 || n[1] > 1 || a[2] < -1 || n[2] > 1)
return !0
}
return !1
}
),
_updateLightUniforms: function () {
var e = this.lights;
e.sort(_i);
var t = this._lightUniforms;
for (var r in t)
for (var i in t[r])
t[r][i].value.length = 0;
for (var n = 0; n < e.length; n++) {
var a = e[n];
if (!a.invisible)
for (var i in r = a.group,
a.uniformTemplates) {
var o = a.uniformTemplates[i]
, s = o.value(a);
if (null != s) {
t[r] || (t[r] = {}),
t[r][i] || (t[r][i] = {
type: "",
value: []
});
var l = t[r][i];
switch (l.type = o.type + "v",
o.type) {
case "1i":
case "1f":
case "t":
l.value.push(s);
break;
case "2f":
case "3f":
case "4f":
for (var h = 0; h < s.length; h++)
l.value.push(s[h]);
break;
default:
console.error("Unkown light uniform type " + o.type)
}
}
}
}
},
getLightGroups: function () {
var e = [];
for (var t in this._lightNumber)
e.push(t);
return e
},
getNumberChangedLightGroups: function () {
var e = [];
for (var t in this._lightNumber)
this.isLightNumberChanged(t) && e.push(t);
return e
},
isLightNumberChanged: function (e) {
var t = this._previousLightNumber
, r = this._lightNumber;
for (var i in r[e]) {
if (!t[e])
return !0;
if (r[e][i] !== t[e][i])
return !0
}
for (var i in t[e]) {
if (!r[e])
return !0;
if (r[e][i] !== t[e][i])
return !0
}
return !1
},
getLightsNumbers: function (e) {
return this._lightNumber[e]
},
getProgramKey: function (e) {
return this._lightProgramKeys[e]
},
setLightUniforms: function () {
function e(e, t, r) {
for (var i in e) {
var n = e[i];
if ("tv" === n.type) {
if (!t.hasUniform(i))
continue;
for (var a = [], o = 0; o < n.value.length; o++) {
var s = n.value[o]
, l = t.takeCurrentTextureSlot(r, s);
a.push(l)
}
t.setUniform(r.gl, "1iv", i, a)
} else
t.setUniform(r.gl, n.type, i, n.value)
}
}
return function (t, r, i) {
e(this._lightUniforms[r], t, i),
e(this.shadowUniforms, t, i)
}
}(),
dispose: function () {
this.material = null,
this._opaqueList = [],
this._transparentList = [],
this.lights = [],
this._lightUniforms = {},
this._lightNumber = {},
this._nodeRepository = {}
}
});
var yi = function (e) {
this.value = e
}
, xi = function () {
function e() {
this._len = 0
}
return e.prototype.insert = function (e) {
var t = new yi(e);
return this.insertEntry(t),
t
}
,
e.prototype.insertEntry = function (e) {
this.head ? (this.tail.next = e,
e.prev = this.tail,
e.next = null,
this.tail = e) : this.head = this.tail = e,
this._len++
}
,
e.prototype.remove = function (e) {
var t = e.prev
, r = e.next;
t ? t.next = r : this.head = r,
r ? r.prev = t : this.tail = t,
e.next = e.prev = null,
this._len--
}
,
e.prototype.len = function () {
return this._len
}
,
e.prototype.clear = function () {
this.head = this.tail = null,
this._len = 0
}
,
e
}();
const bi = function () {
function e(e) {
this._list = new xi,
this._maxSize = 10,
this._map = {},
this._maxSize = e
}
return e.prototype.put = function (e, t) {
var r = this._list
, i = this._map
, n = null;
if (null == i[e]) {
var a = r.len()
, o = this._lastRemovedEntry;
if (a >= this._maxSize && a > 0) {
var s = r.head;
r.remove(s),
delete i[s.key],
n = s.value,
this._lastRemovedEntry = s
}
o ? o.value = t : o = new yi(t),
o.key = e,
r.insertEntry(o),
i[e] = o
}
return n
}
,
e.prototype.get = function (e) {
var t = this._map[e]
, r = this._list;
if (null != t)
return t !== r.tail && (r.remove(t),
r.insertEntry(t)),
t.value
}
,
e.prototype.clear = function () {
this._list.clear(),
this._map = {}
}
,
e.prototype.len = function () {
return this._list.len()
}
,
e
}();
var wi = Mr.isPowerOfTwo
, Ti = ["px", "nx", "py", "ny", "pz", "nz"]
, Si = wr.extend((function () {
return {
image: {
px: null,
nx: null,
py: null,
ny: null,
pz: null,
nz: null
},
pixels: {
px: null,
nx: null,
py: null,
ny: null,
pz: null,
nz: null
},
mipmaps: []
}
}
), {
textureType: "textureCube",
update: function (e) {
var t = e.gl;
t.bindTexture(t.TEXTURE_CUBE_MAP, this._cache.get("webgl_texture")),
this.updateCommon(e);
var r = this.format
, i = this.type;
t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_WRAP_S, this.getAvailableWrapS()),
t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_WRAP_T, this.getAvailableWrapT()),
t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()),
t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MIN_FILTER, this.getAvailableMinFilter());
var n = e.getGLExtension("EXT_texture_filter_anisotropic");
if (n && this.anisotropic > 1 && t.texParameterf(t.TEXTURE_CUBE_MAP, n.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic),
36193 === i && (e.getGLExtension("OES_texture_half_float") || (i = S)),
this.mipmaps.length)
for (var a = this.width, o = this.height, s = 0; s < this.mipmaps.length; s++) {
var l = this.mipmaps[s];
this._updateTextureData(t, l, s, a, o, r, i),
a /= 2,
o /= 2
}
else
this._updateTextureData(t, this, 0, this.width, this.height, r, i),
!this.NPOT && this.useMipmap && t.generateMipmap(t.TEXTURE_CUBE_MAP);
t.bindTexture(t.TEXTURE_CUBE_MAP, null)
},
_updateTextureData: function (e, t, r, i, n, a, o) {
for (var s = 0; s < 6; s++) {
var l = Ti[s]
, h = t.image && t.image[l];
h ? e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X + s, r, a, a, o, h) : e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X + s, r, a, i, n, 0, a, o, t.pixels && t.pixels[l])
}
},
generateMipmap: function (e) {
var t = e.gl;
this.useMipmap && !this.NPOT && (t.bindTexture(t.TEXTURE_CUBE_MAP, this._cache.get("webgl_texture")),
t.generateMipmap(t.TEXTURE_CUBE_MAP))
},
bind: function (e) {
e.gl.bindTexture(e.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(e))
},
unbind: function (e) {
e.gl.bindTexture(e.gl.TEXTURE_CUBE_MAP, null)
},
isPowerOfTwo: function () {
return this.image.px ? wi(this.image.px.width) && wi(this.image.px.height) : wi(this.width) && wi(this.height)
},
isRenderable: function () {
return this.image.px ? Mi(this.image.px) && Mi(this.image.nx) && Mi(this.image.py) && Mi(this.image.ny) && Mi(this.image.pz) && Mi(this.image.nz) : !(!this.width || !this.height)
},
load: function (e, t) {
var r = 0
, i = this;
return f.each(e, (function (e, n) {
var a = U.createImage();
t && (a.crossOrigin = t),
a.onload = function () {
0 == --r && (i.dirty(),
i.trigger("success", i))
}
,
a.onerror = function () {
r--
}
,
r++,
a.src = e,
i.image[n] = a
}
)),
this
}
});
function Mi(e) {
return e.width > 0 && e.height > 0
}
Object.defineProperty(Si.prototype, "width", {
get: function () {
return this.image && this.image.px ? this.image.px.width : this._width
},
set: function (e) {
this.image && this.image.px ? console.warn("Texture from image can't set width") : (this._width !== e && this.dirty(),
this._width = e)
}
}),
Object.defineProperty(Si.prototype, "height", {
get: function () {
return this.image && this.image.px ? this.image.px.height : this._height
},
set: function (e) {
this.image && this.image.px ? console.warn("Texture from image can't set height") : (this._height !== e && this.dirty(),
this._height = e)
}
});
const Ai = Si
, Ei = hi.extend({
fov: 50,
aspect: 1,
near: .1,
far: 2e3
}, {
updateProjectionMatrix: function () {
var e = this.fov / 180 * Math.PI;
this.projectionMatrix.perspective(e, this.aspect, this.near, this.far)
},
decomposeProjectionMatrix: function () {
var e = this.projectionMatrix.array
, t = 2 * Math.atan(1 / e[5]);
this.fov = t / Math.PI * 180,
this.aspect = e[5] / e[0],
this.near = e[14] / (e[10] - 1),
this.far = e[14] / (e[10] + 1)
},
clone: function () {
var e = hi.prototype.clone.call(this);
return e.fov = this.fov,
e.aspect = this.aspect,
e.near = this.near,
e.far = this.far,
e
}
});
var Ci = "framebuffer"
, Di = "renderbuffer"
, Li = "renderbuffer_width"
, Pi = "renderbuffer_height"
, Oi = "renderbuffer_attached"
, Ni = "depthtexture_attached"
, Ii = 36160
, Ri = 36161
, Bi = 36096
, Fi = m.extend({
depthBuffer: !0,
viewport: null,
_width: 0,
_height: 0,
_textures: null,
_boundRenderer: null
}, (function () {
this._cache = new xr,
this._textures = {}
}
), {
getTextureWidth: function () {
return this._width
},
getTextureHeight: function () {
return this._height
},
bind: function (e) {
if (e.__currentFrameBuffer) {
if (e.__currentFrameBuffer === this)
return;
console.warn("Renderer already bound with another framebuffer. Unbind it first")
}
e.__currentFrameBuffer = this;
var t = e.gl;
t.bindFramebuffer(Ii, this._getFrameBufferGL(e)),
this._boundRenderer = e;
var r = this._cache;
r.put("viewport", e.viewport);
var i, n, a = !1;
for (var o in this._textures) {
a = !0;
var s = this._textures[o];
s && (i = s.texture.width,
n = s.texture.height,
this._doAttach(e, s.texture, o, s.target))
}
this._width = i,
this._height = n,
!a && this.depthBuffer && console.error("Must attach texture before bind, or renderbuffer may have incorrect width and height."),
this.viewport ? e.setViewport(this.viewport) : e.setViewport(0, 0, i, n, 1);
var l = r.get("attached_textures");
if (l)
for (var o in l)
if (!this._textures[o]) {
var h = l[o];
this._doDetach(t, o, h)
}
if (!r.get(Ni) && this.depthBuffer) {
r.miss(Di) && r.put(Di, t.createRenderbuffer());
var u = r.get(Di);
i === r.get(Li) && n === r.get(Pi) || (t.bindRenderbuffer(Ri, u),
t.renderbufferStorage(Ri, t.DEPTH_COMPONENT16, i, n),
r.put(Li, i),
r.put(Pi, n),
t.bindRenderbuffer(Ri, null)),
r.get(Oi) || (t.framebufferRenderbuffer(Ii, Bi, Ri, u),
r.put(Oi, !0))
}
},
unbind: function (e) {
e.__currentFrameBuffer = null,
e.gl.bindFramebuffer(Ii, null),
this._boundRenderer = null,
this._cache.use(e.__uid__);
var t = this._cache.get("viewport");
t && e.setViewport(t),
this.updateMipmap(e)
},
updateMipmap: function (e) {
var t = e.gl;
for (var r in this._textures) {
var i = this._textures[r];
if (i) {
var n = i.texture;
if (!n.NPOT && n.useMipmap && n.minFilter === wr.LINEAR_MIPMAP_LINEAR) {
var a = "textureCube" === n.textureType ? 34067 : 3553;
t.bindTexture(a, n.getWebGLTexture(e)),
t.generateMipmap(a),
t.bindTexture(a, null)
}
}
}
},
checkStatus: function (e) {
return e.checkFramebufferStatus(Ii)
},
_getFrameBufferGL: function (e) {
var t = this._cache;
return t.use(e.__uid__),
t.miss(Ci) && t.put(Ci, e.gl.createFramebuffer()),
t.get(Ci)
},
attach: function (e, t, r) {
if (!e.width)
throw new Error("The texture attached to color buffer is not a valid.");
t = t || 36064,
r = r || 3553;
var i, n = this._boundRenderer;
if (n && n.gl) {
var a = this._cache;
a.use(n.__uid__),
i = a.get("attached_textures")
}
var o = this._textures[t];
if (!o || o.target !== r || o.texture !== e || !i || null == i[t]) {
var s = !0;
n && (s = this._doAttach(n, e, t, r),
this.viewport || n.setViewport(0, 0, e.width, e.height, 1)),
s && (this._textures[t] = this._textures[t] || {},
this._textures[t].texture = e,
this._textures[t].target = r)
}
},
_doAttach: function (e, t, r, i) {
var n = e.gl
, a = t.getWebGLTexture(e)
, o = this._cache.get("attached_textures");
if (o && o[r]) {
var s = o[r];
if (s.texture === t && s.target === i)
return
}
var l = !0;
if (((r = +r) === Bi || r === R) && (e.getGLExtension("WEBGL_depth_texture") || (console.error("Depth texture is not supported by the browser"),
l = !1),
t.format !== M && 34041 !== t.format && (console.error("The texture attached to depth buffer is not a valid."),
l = !1),
l)) {
var h = this._cache.get(Di);
h && (n.framebufferRenderbuffer(Ii, Bi, Ri, null),
n.deleteRenderbuffer(h),
this._cache.put(Di, !1)),
this._cache.put(Oi, !1),
this._cache.put(Ni, !0)
}
return n.framebufferTexture2D(Ii, r, i, a, 0),
o || (o = {},
this._cache.put("attached_textures", o)),
o[r] = o[r] || {},
o[r].texture = t,
o[r].target = i,
l
},
_doDetach: function (e, t, r) {
e.framebufferTexture2D(Ii, t, r, null, 0);
var i = this._cache.get("attached_textures");
i && i[t] && (i[t] = null),
t !== Bi && t !== R || this._cache.put(Ni, !1)
},
detach: function (e, t) {
this._textures[e] = null,
this._boundRenderer && (this._cache.use(this._boundRenderer.__uid__),
this._doDetach(this._boundRenderer.gl, e, t))
},
dispose: function (e) {
var t = e.gl
, r = this._cache;
r.use(e.__uid__);
var i = r.get(Di);
i && t.deleteRenderbuffer(i);
var n = r.get(Ci);
n && t.deleteFramebuffer(n),
r.deleteContext(e.__uid__),
this._textures = {}
}
});
Fi.DEPTH_ATTACHMENT = Bi,
Fi.COLOR_ATTACHMENT0 = 36064,
Fi.STENCIL_ATTACHMENT = 36128,
Fi.DEPTH_STENCIL_ATTACHMENT = R;
const zi = Fi;
var Gi = ["px", "nx", "py", "ny", "pz", "nz"];
const Ui = m.extend((function () {
var e = {
position: new vt,
far: 1e3,
near: .1,
texture: null,
shadowMapPass: null
}
, t = e._cameras = {
px: new Ei({
fov: 90
}),
nx: new Ei({
fov: 90
}),
py: new Ei({
fov: 90
}),
ny: new Ei({
fov: 90
}),
pz: new Ei({
fov: 90
}),
nz: new Ei({
fov: 90
})
};
return t.px.lookAt(vt.POSITIVE_X, vt.NEGATIVE_Y),
t.nx.lookAt(vt.NEGATIVE_X, vt.NEGATIVE_Y),
t.py.lookAt(vt.POSITIVE_Y, vt.POSITIVE_Z),
t.ny.lookAt(vt.NEGATIVE_Y, vt.NEGATIVE_Z),
t.pz.lookAt(vt.POSITIVE_Z, vt.NEGATIVE_Y),
t.nz.lookAt(vt.NEGATIVE_Z, vt.NEGATIVE_Y),
e._frameBuffer = new zi,
e
}
), {
getCamera: function (e) {
return this._cameras[e]
},
render: function (e, t, r) {
var i = e.gl;
r || t.update();
for (var n = this.texture.width, a = 2 * Math.atan(n / (n - .5)) / Math.PI * 180, o = 0; o < 6; o++) {
var s = Gi[o]
, l = this._cameras[s];
if (vt.copy(l.position, this.position),
l.far = this.far,
l.near = this.near,
l.fov = a,
this.shadowMapPass) {
l.update();
var h = t.getBoundingBox();
h.applyTransform(l.viewMatrix),
t.viewBoundingBoxLastFrame.copy(h),
this.shadowMapPass.render(e, t, l, !0)
}
this._frameBuffer.attach(this.texture, i.COLOR_ATTACHMENT0, i.TEXTURE_CUBE_MAP_POSITIVE_X + o),
this._frameBuffer.bind(e),
e.render(t, l, !0),
this._frameBuffer.unbind(e)
}
},
dispose: function (e) {
this._frameBuffer.dispose(e)
}
})
, ki = Vr.extend({
dynamic: !1,
widthSegments: 1,
heightSegments: 1
}, (function () {
this.build()
}
), {
build: function () {
for (var e = this.heightSegments, t = this.widthSegments, r = this.attributes, i = [], n = [], a = [], o = [], s = 0; s <= e; s++)
for (var l = s / e, h = 0; h <= t; h++) {
var u = h / t;
if (i.push([2 * u - 1, 2 * l - 1, 0]),
n && n.push([u, l]),
a && a.push([0, 0, 1]),
h < t && s < e) {
var c = h + s * (t + 1);
o.push([c, c + 1, c + t + 1]),
o.push([c + t + 1, c + 1, c + t + 2])
}
}
r.position.fromArray(i),
r.texcoord0.fromArray(n),
r.normal.fromArray(a),
this.initIndicesFromArray(o),
this.boundingBox = new ir,
this.boundingBox.min.set(-1, -1, 0),
this.boundingBox.max.set(1, 1, 0)
}
});
var Vi = new Ht;
function Hi(e, t, r) {
Vi.identity();
var i = new ki({
widthSegments: t,
heightSegments: r
});
switch (e) {
case "px":
Ht.translate(Vi, Vi, vt.POSITIVE_X),
Ht.rotateY(Vi, Vi, Math.PI / 2);
break;
case "nx":
Ht.translate(Vi, Vi, vt.NEGATIVE_X),
Ht.rotateY(Vi, Vi, -Math.PI / 2);
break;
case "py":
Ht.translate(Vi, Vi, vt.POSITIVE_Y),
Ht.rotateX(Vi, Vi, -Math.PI / 2);
break;
case "ny":
Ht.translate(Vi, Vi, vt.NEGATIVE_Y),
Ht.rotateX(Vi, Vi, Math.PI / 2);
break;
case "pz":
Ht.translate(Vi, Vi, vt.POSITIVE_Z);
break;
case "nz":
Ht.translate(Vi, Vi, vt.NEGATIVE_Z),
Ht.rotateY(Vi, Vi, Math.PI)
}
return i.applyTransform(Vi),
i
}
const Wi = Vr.extend({
dynamic: !1,
widthSegments: 1,
heightSegments: 1,
depthSegments: 1,
inside: !1
}, (function () {
this.build()
}
), {
build: function () {
var e = {
px: Hi("px", this.depthSegments, this.heightSegments),
nx: Hi("nx", this.depthSegments, this.heightSegments),
py: Hi("py", this.widthSegments, this.depthSegments),
ny: Hi("ny", this.widthSegments, this.depthSegments),
pz: Hi("pz", this.widthSegments, this.heightSegments),
nz: Hi("nz", this.widthSegments, this.heightSegments)
}
, t = ["position", "texcoord0", "normal"]
, r = 0
, i = 0;
for (var n in e)
r += e[n].vertexCount,
i += e[n].indices.length;
for (var a = 0; a < t.length; a++)
this.attributes[t[a]].init(r);
this.indices = new U.Uint16Array(i);
var o = 0
, s = 0;
for (var n in e) {
var l = e[n];
for (a = 0; a < t.length; a++)
for (var h = t[a], u = l.attributes[h].value, c = l.attributes[h].size, d = "normal" === h, f = 0; f < u.length; f++) {
var p = u[f];
this.inside && d && (p = -p),
this.attributes[h].value[f + c * s] = p
}
var m = l.indices.length;
for (f = 0; f < l.indices.length; f++)
this.indices[f + o] = s + l.indices[this.inside ? m - f - 1 : f];
o += l.indices.length,
s += l.vertexCount
}
this.boundingBox = new ir,
this.boundingBox.max.set(1, 1, 1),
this.boundingBox.min.set(-1, -1, -1)
}
});
Xe.import("@export clay.skybox.vertex\n#define SHADER_NAME skybox\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\n#define PI 3.1415926\nuniform mat4 viewInverse : VIEWINVERSE;\n#ifdef EQUIRECTANGULAR\nuniform sampler2D environmentMap;\n#else\nuniform samplerCube environmentMap;\n#endif\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(v_WorldPosition - eyePos);\n#ifdef EQUIRECTANGULAR\n float phi = acos(V.y);\n float theta = atan(-V.x, V.z) + PI * 0.5;\n vec2 uv = vec2(theta / 2.0 / PI, phi / PI);\n vec4 texel = decodeHDR(texture2D(environmentMap, fract(uv)));\n#else\n #if defined(LOD) || defined(SUPPORT_TEXTURE_LOD)\n vec4 texel = decodeHDR(textureCubeLodEXT(environmentMap, V, lod));\n #else\n vec4 texel = decodeHDR(textureCube(environmentMap, V));\n #endif\n#endif\n#ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n#endif\n#ifdef TONEMAPPING\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n#ifdef SRGB_ENCODE\n texel = linearTosRGB(texel);\n#endif\n gl_FragColor = encodeHDR(vec4(texel.rgb, 1.0));\n}\n@end");
const ji = Sr.extend((function () {
var e = new Xe({
vertex: Xe.source("clay.skybox.vertex"),
fragment: Xe.source("clay.skybox.fragment")
})
, t = new le({
shader: e,
depthMask: !1
});
return {
scene: null,
geometry: new Wi,
material: t,
environmentMap: null,
culling: !1,
_dummyCamera: new Ei
}
}
), (function () {
var e = this.scene;
e && this.attachScene(e),
this.environmentMap && this.setEnvironmentMap(this.environmentMap)
}
), {
attachScene: function (e) {
this.scene && this.detachScene(),
e.skybox = this,
this.scene = e,
e.on("beforerender", this._beforeRenderScene, this)
},
detachScene: function () {
this.scene && (this.scene.off("beforerender", this._beforeRenderScene),
this.scene.skybox = null),
this.scene = null
},
dispose: function (e) {
this.detachScene(),
this.geometry.dispose(e)
},
setEnvironmentMap: function (e) {
"texture2D" === e.textureType ? (this.material.define("EQUIRECTANGULAR"),
e.minFilter = wr.LINEAR) : this.material.undefine("EQUIRECTANGULAR"),
this.material.set("environmentMap", e)
},
getEnvironmentMap: function () {
return this.material.get("environmentMap")
},
_beforeRenderScene: function (e, t, r) {
this.renderSkybox(e, r)
},
renderSkybox: function (e, t) {
var r = this._dummyCamera;
r.aspect = e.getViewportAspect(),
r.fov = t.fov || 50,
r.updateProjectionMatrix(),
Ht.invert(r.invProjectionMatrix, r.projectionMatrix),
r.worldTransform.copy(t.worldTransform),
r.viewMatrix.copy(t.viewMatrix),
this.position.copy(t.getWorldPosition()),
this.update(),
e.gl.disable(e.gl.BLEND),
this.material.get("lod") > 0 ? this.material.define("fragment", "LOD") : this.material.undefine("fragment", "LOD"),
e.renderPass([this], r)
}
})
, Xi = ji;
function qi(e) {
return e.charCodeAt(0) + (e.charCodeAt(1) << 8) + (e.charCodeAt(2) << 16) + (e.charCodeAt(3) << 24)
}
var Zi = qi("DXT1")
, Yi = qi("DXT3")
, Ki = qi("DXT5");
const Qi = function (e, t) {
var r = new Int32Array(e, 0, 31);
if (542327876 !== r[0])
return null;
if (4 & !r(20))
return null;
var i, n, a = r(21), o = r[4], s = r[3], l = 512 & r[28], h = 131072 & r[2];
switch (a) {
case Zi:
i = 8,
n = wr.COMPRESSED_RGB_S3TC_DXT1_EXT;
break;
case Yi:
i = 16,
n = wr.COMPRESSED_RGBA_S3TC_DXT3_EXT;
break;
case Ki:
i = 16,
n = wr.COMPRESSED_RGBA_S3TC_DXT5_EXT;
break;
default:
return null
}
var u = r[1] + 4
, c = l ? 6 : 1
, d = 1;
h && (d = Math.max(1, r[7]));
for (var f = [], p = 0; p < c; p++) {
var m = o
, g = s;
f[p] = new Dr({
width: m,
height: g,
format: n
});
for (var _ = [], v = 0; v < d; v++) {
var y = Math.max(4, m) / 4 * Math.max(4, g) / 4 * i
, x = new Uint8Array(e, u, y);
u += y,
m *= .5,
g *= .5,
_[v] = x
}
f[p].pixels = _[0],
h && (f[p].mipmaps = _)
}
if (!t)
return f[0];
t.width = f[0].width,
t.height = f[0].height,
t.format = f[0].format,
t.pixels = f[0].pixels,
t.mipmaps = f[0].mipmaps
};
var Ji = String.fromCharCode;
function $i(e, t, r, i) {
if (e[3] > 0) {
var n = Math.pow(2, e[3] - 128 - 8 + i);
t[r + 0] = e[0] * n,
t[r + 1] = e[1] * n,
t[r + 2] = e[2] * n
} else
t[r + 0] = 0,
t[r + 1] = 0,
t[r + 2] = 0;
return t[r + 3] = 1,
t
}
function en(e, t, r, i) {
for (var n, a, o = 0, s = 0, l = i; l > 0;)
if (e[s][0] = t[r++],
e[s][1] = t[r++],
e[s][2] = t[r++],
e[s][3] = t[r++],
1 === e[s][0] && 1 === e[s][1] && 1 === e[s][2]) {
for (var h = e[s][3] << o >>> 0; h > 0; h--)
n = e[s - 1],
(a = e[s])[0] = n[0],
a[1] = n[1],
a[2] = n[2],
a[3] = n[3],
s++,
l--;
o += 8
} else
s++,
l--,
o = 0;
return r
}
function tn(e, t, r, i) {
if (i < 8 | i > 32767)
return en(e, t, r, i);
if (2 != (n = t[r++]))
return en(e, t, r - 1, i);
if (e[0][1] = t[r++],
e[0][2] = t[r++],
n = t[r++],
(e[0][2] << 8 >>> 0 | n) >>> 0 !== i)
return null;
for (var n = 0; n < 4; n++)
for (var a = 0; a < i;) {
var o = t[r++];
if (o > 128) {
o = (127 & o) >>> 0;
for (var s = t[r++]; o--;)
e[a++][n] = s
} else
for (; o--;)
e[a++][n] = t[r++]
}
return r
}
const rn = function (e, t, r) {
null == r && (r = 0);
var i = new Uint8Array(e)
, n = i.length;
if ("#?" === function (e, t, r) {
for (var i = "", n = 0; n < 2; n++)
i += Ji(e[n]);
return i
}(i)) {
for (var a = 2; a < n && ("\n" !== Ji(i[a]) || "\n" !== Ji(i[a + 1])); a++)
;
if (!(a >= n)) {
a += 2;
for (var o = ""; a < n; a++) {
var s = Ji(i[a]);
if ("\n" === s)
break;
o += s
}
var l = o.split(" ")
, h = parseInt(l[1])
, u = parseInt(l[3]);
if (u && h) {
for (var c = a + 1, d = [], f = 0; f < u; f++) {
d[f] = [];
for (var p = 0; p < 4; p++)
d[f][p] = 0
}
for (var m = new Float32Array(u * h * 4), g = 0, _ = 0; _ < h; _++) {
if (!(c = tn(d, i, c, u)))
return null;
for (f = 0; f < u; f++)
$i(d[f], m, g, r),
g += 4
}
return t || (t = new Dr),
t.width = u,
t.height = h,
t.pixels = m,
t.type = wr.FLOAT,
t
}
}
}
};
var nn = {
loadTexture: function (e, t, r, i) {
var n;
if ("function" == typeof t ? (i = r = t,
t = {}) : t = t || {},
"string" == typeof e) {
if (e.match(/.hdr$/) || "hdr" === t.fileType)
return n = new Dr({
width: 0,
height: 0,
sRGB: !1
}),
nn._fetchTexture(e, (function (e) {
rn(e, n, t.exposure),
n.dirty(),
r && r(n)
}
), i),
n;
e.match(/.dds$/) || "dds" === t.fileType ? (n = new Dr({
width: 0,
height: 0
}),
nn._fetchTexture(e, (function (e) {
Qi(e, n),
n.dirty(),
r && r(n)
}
), i)) : ((n = new Dr).load(e),
n.success(r),
n.error(i))
} else
"object" == typeof e && void 0 !== e.px && ((n = new Ai).load(e),
n.success(r),
n.error(i));
return n
},
loadPanorama: function (e, t, r, i, n, a) {
var o = this;
"function" == typeof i ? (a = n = i,
i = {}) : i = i || {},
nn.loadTexture(t, i, (function (t) {
t.flipY = i.flipY || !1,
o.panoramaToCubeMap(e, t, r, i),
t.dispose(e),
n && n(r)
}
), a)
},
panoramaToCubeMap: function (e, t, r, i) {
var n = new Ui
, a = new Xi({
scene: new vi
});
return a.setEnvironmentMap(t),
(i = i || {}).encodeRGBM && a.material.define("fragment", "RGBM_ENCODE"),
r.sRGB = t.sRGB,
n.texture = r,
n.render(e, a.scene),
n.texture = null,
n.dispose(e),
r
},
heightToNormal: function (e, t) {
var r = document.createElement("canvas")
, i = r.width = e.width
, n = r.height = e.height
, a = r.getContext("2d");
a.drawImage(e, 0, 0, i, n),
t = t || !1;
for (var o = a.getImageData(0, 0, i, n), s = a.createImageData(i, n), l = 0; l < o.data.length; l += 4) {
if (t) {
var h = o.data[l]
, u = o.data[l + 1]
, c = o.data[l + 2];
if (Math.abs(h - u) + Math.abs(u - c) > 20)
return console.warn("Given image is not a height map"),
e
}
var d, f, p, m;
l % (4 * i) == 0 ? (d = o.data[l],
p = o.data[l + 4]) : l % (4 * i) == 4 * (i - 1) ? (d = o.data[l - 4],
p = o.data[l]) : (d = o.data[l - 4],
p = o.data[l + 4]),
l < 4 * i ? (f = o.data[l],
m = o.data[l + 4 * i]) : l > i * (n - 1) * 4 ? (f = o.data[l - 4 * i],
m = o.data[l]) : (f = o.data[l - 4 * i],
m = o.data[l + 4 * i]),
s.data[l] = d - p + 127,
s.data[l + 1] = f - m + 127,
s.data[l + 2] = 255,
s.data[l + 3] = 255
}
return a.putImageData(s, 0, 0),
r
},
isHeightImage: function (e, t, r) {
if (!e || !e.width || !e.height)
return !1;
var i = document.createElement("canvas")
, n = i.getContext("2d")
, a = t || 32;
r = r || 20,
i.width = i.height = a,
n.drawImage(e, 0, 0, a, a);
for (var o = n.getImageData(0, 0, a, a), s = 0; s < o.data.length; s += 4) {
var l = o.data[s]
, h = o.data[s + 1]
, u = o.data[s + 2];
if (Math.abs(l - h) + Math.abs(h - u) > r)
return !1
}
return !0
},
_fetchTexture: function (e, t, r) {
U.request.get({
url: e,
responseType: "arraybuffer",
onload: t,
onerror: r
})
},
createChessboard: function (e, t, r, i) {
e = e || 512,
t = t || 64,
r = r || "black",
i = i || "white";
var n = Math.ceil(e / t)
, a = document.createElement("canvas");
a.width = e,
a.height = e;
var o = a.getContext("2d");
o.fillStyle = i,
o.fillRect(0, 0, e, e),
o.fillStyle = r;
for (var s = 0; s < n; s++)
for (var l = 0; l < n; l++)
(l % 2 ? s % 2 : s % 2 - 1) && o.fillRect(s * t, l * t, t, t);
return new Dr({
image: a,
anisotropic: 8
})
},
createBlank: function (e) {
var t = document.createElement("canvas");
t.width = 1,
t.height = 1;
var r = t.getContext("2d");
return r.fillStyle = e,
r.fillRect(0, 0, 1, 1),
new Dr({
image: t
})
}
};
const an = nn;
var on = ["mousedown", "mouseup", "mousemove", "mouseover", "mouseout", "click", "dblclick", "contextmenu"];
function sn(e) {
return "_on" + e
}
var ln = function (e) {
var t = this;
this._texture = new Dr({
anisotropic: 32,
flipY: !1,
surface: this,
dispose: function (e) {
t.dispose(),
Dr.prototype.dispose.call(this, e)
}
}),
on.forEach((function (e) {
this[sn(e)] = function (t) {
t.triangle && this._meshes.forEach((function (r) {
this.dispatchEvent(e, r, t.triangle, t.point)
}
), this)
}
}
), this),
this._meshes = [],
e && this.setECharts(e),
this.onupdate = null
};
ln.prototype = {
constructor: ln,
getTexture: function () {
return this._texture
},
setECharts: function (e) {
this._chart = e;
var t = e.getDom();
if (t instanceof HTMLCanvasElement) {
var r = this
, i = e.getZr()
, n = i.__oldRefreshImmediately || i.refreshImmediately;
i.refreshImmediately = function () {
n.call(this),
r._texture.dirty(),
r.onupdate && r.onupdate()
}
,
i.__oldRefreshImmediately = n
} else
console.error("ECharts must init on canvas if it is used as texture."),
t = document.createElement("canvas");
this._texture.image = t,
this._texture.dirty(),
this.onupdate && this.onupdate()
},
dispatchEvent: function () {
var e = new vt
, t = new vt
, r = new vt
, i = new _e
, n = new _e
, a = new _e
, o = new _e
, s = new vt;
return function (l, h, u, c) {
var d = h.geometry
, f = d.attributes.position
, p = d.attributes.texcoord0
, m = vt.dot
, g = vt.cross;
f.get(u[0], e.array),
f.get(u[1], t.array),
f.get(u[2], r.array),
p.get(u[0], i.array),
p.get(u[1], n.array),
p.get(u[2], a.array),
g(s, t, r);
var _ = m(e, s)
, v = m(c, s) / _;
g(s, r, e);
var y = m(c, s) / _;
g(s, e, t);
var x = m(c, s) / _;
_e.scale(o, i, v),
_e.scaleAndAdd(o, o, n, y),
_e.scaleAndAdd(o, o, a, x);
var b = o.x * this._chart.getWidth()
, w = o.y * this._chart.getHeight();
this._chart.getZr().handler.dispatch(l, {
zrX: b,
zrY: w
})
}
}(),
attachToMesh: function (e) {
this._meshes.indexOf(e) >= 0 || (on.forEach((function (t) {
e.on(t, this[sn(t)], this)
}
), this),
this._meshes.push(e))
},
detachFromMesh: function (e) {
var t = this._meshes.indexOf(e);
t >= 0 && this._meshes.splice(t, 1),
on.forEach((function (t) {
e.off(t, this[sn(t)])
}
), this)
},
dispose: function () {
this._meshes.forEach((function (e) {
this.detachFromMesh(e)
}
), this)
}
};
const hn = ln
, un = hi.extend({
left: -1,
right: 1,
near: -1,
far: 1,
top: 1,
bottom: -1
}, {
updateProjectionMatrix: function () {
this.projectionMatrix.ortho(this.left, this.right, this.bottom, this.top, this.near, this.far)
},
decomposeProjectionMatrix: function () {
var e = this.projectionMatrix.array;
this.left = (-1 - e[12]) / e[0],
this.right = (1 - e[12]) / e[0],
this.top = (1 - e[13]) / e[5],
this.bottom = (-1 - e[13]) / e[5],
this.near = -(-1 - e[14]) / e[10],
this.far = -(1 - e[14]) / e[10]
},
clone: function () {
var e = hi.prototype.clone.call(this);
return e.left = this.left,
e.right = this.right,
e.near = this.near,
e.far = this.far,
e.top = this.top,
e.bottom = this.bottom,
e
}
});
Xe.import("\n@export clay.compositor.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end");
var cn = new ki
, dn = new Sr({
geometry: cn,
frustumCulling: !1
})
, fn = new un;
const pn = m.extend((function () {
return {
fragment: "",
outputs: null,
material: null,
blendWithPrevious: !1,
clearColor: !1,
clearDepth: !0
}
}
), (function () {
var e = new Xe(Xe.source("clay.compositor.vertex"), this.fragment)
, t = new le({
shader: e
});
t.enableTexturesAll(),
this.material = t
}
), {
setUniform: function (e, t) {
this.material.setUniform(e, t)
},
getUniform: function (e) {
var t = this.material.uniforms[e];
if (t)
return t.value
},
attachOutput: function (e, t) {
this.outputs || (this.outputs = {}),
t = t || 36064,
this.outputs[t] = e
},
detachOutput: function (e) {
for (var t in this.outputs)
this.outputs[t] === e && (this.outputs[t] = null)
},
bind: function (e, t) {
if (this.outputs)
for (var r in this.outputs) {
var i = this.outputs[r];
i && t.attach(i, r)
}
t && t.bind(e)
},
unbind: function (e, t) {
t.unbind(e)
},
render: function (e, t) {
var r = e.gl;
if (t) {
this.bind(e, t);
var i = e.getGLExtension("EXT_draw_buffers");
if (i && this.outputs) {
var n = [];
for (var a in this.outputs)
(a = +a) >= r.COLOR_ATTACHMENT0 && a <= r.COLOR_ATTACHMENT0 + 8 && n.push(a);
i.drawBuffersEXT(n)
}
}
this.trigger("beforerender", this, e);
var o = this.clearDepth ? r.DEPTH_BUFFER_BIT : 0;
if (r.depthMask(!0),
this.clearColor) {
o |= r.COLOR_BUFFER_BIT,
r.colorMask(!0, !0, !0, !0);
var s = this.clearColor;
Array.isArray(s) && r.clearColor(s[0], s[1], s[2], s[3])
}
r.clear(o),
this.blendWithPrevious ? (r.enable(r.BLEND),
this.material.transparent = !0) : (r.disable(r.BLEND),
this.material.transparent = !1),
this.renderQuad(e),
this.trigger("afterrender", this, e),
t && this.unbind(e, t)
},
renderQuad: function (e) {
dn.material = this.material,
e.renderPass([dn], fn)
},
dispose: function (e) { }
});
var mn = {}
, gn = ["px", "nx", "py", "ny", "pz", "nz"];
mn.prefilterEnvironmentMap = function (e, t, r, i, n) {
n && i || (i = mn.generateNormalDistribution(),
n = mn.integrateBRDF(e, i));
var a = (r = r || {}).width || 64
, o = r.height || 64
, s = r.type || t.type
, l = new Ai({
width: a,
height: o,
type: s,
flipY: !1,
mipmaps: []
});
l.isPowerOfTwo() || console.warn("Width and height must be power of two to enable mipmap.");
var h = Math.min(a, o)
, u = Math.log(h) / Math.log(2) + 1
, c = new le({
shader: new Xe({
vertex: Xe.source("clay.skybox.vertex"),
fragment: "#define SHADER_NAME prefilter\n#define SAMPLE_NUMBER 1024\n#define PI 3.14159265358979\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform sampler2D normalDistribution;\nuniform float roughness : 0.5;\nvarying vec2 v_Texcoord;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\nvec3 importanceSampleNormal(float i, float roughness, vec3 N) {\n vec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb;\n vec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nvoid main() {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(v_WorldPosition - eyePos);\n vec3 N = V;\n vec3 prefilteredColor = vec3(0.0);\n float totalWeight = 0.0;\n float fMaxSampleNumber = float(SAMPLE_NUMBER);\n for (int i = 0; i < SAMPLE_NUMBER; i++) {\n vec3 H = importanceSampleNormal(float(i) / fMaxSampleNumber, roughness, N);\n vec3 L = reflect(-V, H);\n float NoL = clamp(dot(N, L), 0.0, 1.0);\n if (NoL > 0.0) {\n prefilteredColor += decodeHDR(textureCube(environmentMap, L)).rgb * NoL;\n totalWeight += NoL;\n }\n }\n gl_FragColor = encodeHDR(vec4(prefilteredColor / totalWeight, 1.0));\n}\n"
})
});
c.set("normalDistribution", i),
r.encodeRGBM && c.define("fragment", "RGBM_ENCODE"),
r.decodeRGBM && c.define("fragment", "RGBM_DECODE");
var d, f = new vi;
if ("texture2D" === t.textureType) {
var p = new Ai({
width: a,
height: o,
type: s === wr.FLOAT ? wr.HALF_FLOAT : s
});
an.panoramaToCubeMap(e, t, p, {
encodeRGBM: r.decodeRGBM
}),
t = p
}
(d = new ji({
scene: f,
material: c
})).material.set("environmentMap", t);
var m = new Ui({
texture: l
});
r.encodeRGBM && (s = l.type = wr.UNSIGNED_BYTE);
for (var g = new Dr({
width: a,
height: o,
type: s
}), _ = new zi({
depthBuffer: !1
}), v = U[s === wr.UNSIGNED_BYTE ? "Uint8Array" : "Float32Array"], y = 0; y < u; y++) {
l.mipmaps[y] = {
pixels: {}
},
d.material.set("roughness", y / (u - 1));
for (var x = g.width, b = 2 * Math.atan(x / (x - .5)) / Math.PI * 180, w = 0; w < gn.length; w++) {
var T = new v(g.width * g.height * 4);
_.attach(g),
_.bind(e);
var S = m.getCamera(gn[w]);
S.fov = b,
e.render(f, S),
e.gl.readPixels(0, 0, g.width, g.height, wr.RGBA, s, T),
_.unbind(e),
l.mipmaps[y].pixels[gn[w]] = T
}
g.width /= 2,
g.height /= 2,
g.dirty()
}
return _.dispose(e),
g.dispose(e),
d.dispose(e),
i.dispose(e),
{
environmentMap: l,
brdfLookup: n,
normalDistribution: i,
maxMipmapLevel: u
}
}
,
mn.integrateBRDF = function (e, t) {
t = t || mn.generateNormalDistribution();
var r = new zi({
depthBuffer: !1
})
, i = new pn({
fragment: "#define SAMPLE_NUMBER 1024\n#define PI 3.14159265358979\nuniform sampler2D normalDistribution;\nuniform vec2 viewportSize : [512, 256];\nconst vec3 N = vec3(0.0, 0.0, 1.0);\nconst float fSampleNumber = float(SAMPLE_NUMBER);\nvec3 importanceSampleNormal(float i, float roughness, vec3 N) {\n vec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb;\n vec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nfloat G_Smith(float roughness, float NoV, float NoL) {\n float k = roughness * roughness / 2.0;\n float G1V = NoV / (NoV * (1.0 - k) + k);\n float G1L = NoL / (NoL * (1.0 - k) + k);\n return G1L * G1V;\n}\nvoid main() {\n vec2 uv = gl_FragCoord.xy / viewportSize;\n float NoV = uv.x;\n float roughness = uv.y;\n vec3 V;\n V.x = sqrt(1.0 - NoV * NoV);\n V.y = 0.0;\n V.z = NoV;\n float A = 0.0;\n float B = 0.0;\n for (int i = 0; i < SAMPLE_NUMBER; i++) {\n vec3 H = importanceSampleNormal(float(i) / fSampleNumber, roughness, N);\n vec3 L = reflect(-V, H);\n float NoL = clamp(L.z, 0.0, 1.0);\n float NoH = clamp(H.z, 0.0, 1.0);\n float VoH = clamp(dot(V, H), 0.0, 1.0);\n if (NoL > 0.0) {\n float G = G_Smith(roughness, NoV, NoL);\n float G_Vis = G * VoH / (NoH * NoV);\n float Fc = pow(1.0 - VoH, 5.0);\n A += (1.0 - Fc) * G_Vis;\n B += Fc * G_Vis;\n }\n }\n gl_FragColor = vec4(vec2(A, B) / fSampleNumber, 0.0, 1.0);\n}\n"
})
, n = new Dr({
width: 512,
height: 256,
type: wr.HALF_FLOAT,
wrapS: wr.CLAMP_TO_EDGE,
wrapT: wr.CLAMP_TO_EDGE,
minFilter: wr.NEAREST,
magFilter: wr.NEAREST,
useMipmap: !1
});
return i.setUniform("normalDistribution", t),
i.setUniform("viewportSize", [512, 256]),
i.attachOutput(n),
i.render(e, r),
r.dispose(e),
n
}
,
mn.generateNormalDistribution = function (e, t) {
for (var r = new Dr({
width: e = e || 256,
height: t = t || 1024,
type: wr.FLOAT,
minFilter: wr.NEAREST,
magFilter: wr.NEAREST,
wrapS: wr.CLAMP_TO_EDGE,
wrapT: wr.CLAMP_TO_EDGE,
useMipmap: !1
}), i = new Float32Array(t * e * 4), n = [], a = 0; a < e; a++) {
for (var o = a / e, s = o * o, l = 0; l < t; l++) {
var h = (l << 16 | l >>> 16) >>> 0;
h = (((16711935 & (h = ((252645135 & (h = ((858993459 & (h = ((1431655765 & h) << 1 | (2863311530 & h) >>> 1) >>> 0)) << 2 | (3435973836 & h) >>> 2) >>> 0)) << 4 | (4042322160 & h) >>> 4) >>> 0)) << 8 | (4278255360 & h) >>> 8) >>> 0) / 4294967296;
var u = Math.sqrt((1 - h) / (1 + (s * s - 1) * h));
n[l] = u
}
for (l = 0; l < t; l++) {
var c = 4 * (l * e + a)
, d = (u = n[l],
Math.sqrt(1 - u * u))
, f = l / t
, p = 2 * Math.PI * f;
i[c] = d * Math.cos(p),
i[c + 1] = u,
i[c + 2] = d * Math.sin(p),
i[c + 3] = 1
}
}
return r.pixels = i,
r
}
;
const _n = mn
, vn = qr.extend({
cubemap: null,
castShadow: !1,
_normalDistribution: null,
_brdfLookup: null
}, {
type: "AMBIENT_CUBEMAP_LIGHT",
prefilter: function (e, t) {
if (e.getGLExtension("EXT_shader_texture_lod")) {
this._brdfLookup || (this._normalDistribution = _n.generateNormalDistribution(),
this._brdfLookup = _n.integrateBRDF(e, this._normalDistribution));
var r = this.cubemap;
if (!r.__prefiltered) {
var i = _n.prefilterEnvironmentMap(e, r, {
encodeRGBM: !0,
width: t,
height: t
}, this._normalDistribution, this._brdfLookup);
this.cubemap = i.environmentMap,
this.cubemap.__prefiltered = !0,
r.dispose(e)
}
} else
console.warn("Device not support textureCubeLodEXT")
},
getBRDFLookup: function () {
return this._brdfLookup
},
uniformTemplates: {
ambientCubemapLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
},
ambientCubemapLightCubemap: {
type: "t",
value: function (e) {
return e.cubemap
}
},
ambientCubemapLightBRDFLookup: {
type: "t",
value: function (e) {
return e._brdfLookup
}
}
}
})
, yn = qr.extend({
castShadow: !1,
coefficients: []
}, (function () {
this._coefficientsTmpArr = new U.Float32Array(27)
}
), {
type: "AMBIENT_SH_LIGHT",
uniformTemplates: {
ambientSHLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
},
ambientSHLightCoefficients: {
type: "3f",
value: function (e) {
for (var t = e._coefficientsTmpArr, r = 0; r < e.coefficients.length; r++)
t[r] = e.coefficients[r];
return t
}
}
}
});
var xn = {}
, bn = ["px", "nx", "py", "ny", "pz", "nz"];
function wn(e, t) {
var r = e[0]
, i = e[1]
, n = e[2];
return 0 === t ? 1 : 1 === t ? r : 2 === t ? i : 3 === t ? n : 4 === t ? r * n : 5 === t ? i * n : 6 === t ? r * i : 7 === t ? 3 * n * n - 1 : r * r - i * i
}
var Tn = {
px: [2, 1, 0, -1, -1, 1],
nx: [2, 1, 0, 1, -1, -1],
py: [0, 2, 1, 1, -1, -1],
ny: [0, 2, 1, 1, 1, 1],
pz: [0, 1, 2, -1, -1, -1],
nz: [0, 1, 2, 1, -1, 1]
};
xn.projectEnvironmentMap = function (e, t, r) {
var i;
(r = r || {}).lod = r.lod || 0;
var n = new vi
, a = 64;
"texture2D" === t.textureType ? i = new Xi({
scene: n,
environmentMap: t
}) : (a = t.image && t.image.px ? t.image.px.width : t.width,
i = new ji({
scene: n,
environmentMap: t
}));
var o = Math.ceil(a / Math.pow(2, r.lod))
, s = Math.ceil(a / Math.pow(2, r.lod))
, l = new Dr({
width: o,
height: s
})
, h = new zi;
i.material.define("fragment", "RGBM_ENCODE"),
r.decodeRGBM && i.material.define("fragment", "RGBM_DECODE"),
i.material.set("lod", r.lod);
for (var u = new Ui({
texture: l
}), c = {}, d = 0; d < bn.length; d++) {
c[bn[d]] = new Uint8Array(o * s * 4);
var f = u.getCamera(bn[d]);
f.fov = 90,
h.attach(l),
h.bind(e),
e.render(n, f),
e.gl.readPixels(0, 0, o, s, wr.RGBA, wr.UNSIGNED_BYTE, c[bn[d]]),
h.unbind(e)
}
return i.dispose(e),
h.dispose(e),
l.dispose(e),
function (e, t, r, i) {
for (var n = new U.Float32Array(27), a = Qe.create(), o = Qe.create(), s = Qe.create(), l = 0; l < 9; l++) {
for (var h = Qe.create(), u = 0; u < bn.length; u++) {
for (var c = t[bn[u]], d = Qe.create(), f = 0, p = 0, m = Tn[bn[u]], g = 0; g < i; g++)
for (var _ = 0; _ < r; _++) {
a[0] = _ / (r - 1) * 2 - 1,
a[1] = g / (i - 1) * 2 - 1,
a[2] = -1,
Qe.normalize(a, a),
s[0] = a[m[0]] * m[3],
s[1] = a[m[1]] * m[4],
s[2] = a[m[2]] * m[5],
o[0] = c[p++] / 255,
o[1] = c[p++] / 255,
o[2] = c[p++] / 255;
var v = c[p++] / 255 * 8.12;
o[0] *= v,
o[1] *= v,
o[2] *= v,
Qe.scaleAndAdd(d, d, o, wn(s, l) * -a[2]),
f += -a[2]
}
Qe.scaleAndAdd(h, h, d, 1 / f)
}
n[3 * l] = h[0] / 6,
n[3 * l + 1] = h[1] / 6,
n[3 * l + 2] = h[2] / 6
}
return n
}(0, c, o, s)
}
;
const Sn = xn
, Mn = function () {
for (var e = 0, t = arguments.length; e < t; e++)
if (null != arguments[e])
return arguments[e]
}
, An = function (e, t) {
return null != t.dataIndexInside ? t.dataIndexInside : null != t.dataIndex ? i.util.isArray(t.dataIndex) ? i.util.map(t.dataIndex, (function (t) {
return e.indexOfRawIndex(t)
}
)) : e.indexOfRawIndex(t.dataIndex) : null != t.name ? i.util.isArray(t.name) ? i.util.map(t.name, (function (t) {
return e.indexOfName(t)
}
)) : e.indexOfName(t.name) : void 0
}
, En = Vr.extend({
dynamic: !1,
widthSegments: 40,
heightSegments: 20,
phiStart: 0,
phiLength: 2 * Math.PI,
thetaStart: 0,
thetaLength: Math.PI,
radius: 1
}, (function () {
this.build()
}
), {
build: function () {
var e = this.heightSegments
, t = this.widthSegments
, r = this.attributes.position
, i = this.attributes.texcoord0
, n = this.attributes.normal
, a = (t + 1) * (e + 1);
r.init(a),
i.init(a),
n.init(a);
var o, s, l, h, u, c, d, f, p, m, g, _ = a > 65535 ? Uint32Array : Uint16Array, v = this.indices = new _(t * e * 6), y = this.radius, x = this.phiStart, b = this.phiLength, w = this.thetaStart, T = this.thetaLength, S = [], M = [], A = 0, E = 1 / (y = this.radius);
for (d = 0; d <= e; d++)
for (c = 0; c <= t; c++)
h = c / t,
u = d / e,
o = -y * Math.cos(x + h * b) * Math.sin(w + u * T),
s = y * Math.cos(w + u * T),
l = y * Math.sin(x + h * b) * Math.sin(w + u * T),
S[0] = o,
S[1] = s,
S[2] = l,
M[0] = h,
M[1] = u,
r.set(A, S),
i.set(A, M),
S[0] *= E,
S[1] *= E,
S[2] *= E,
n.set(A, S),
A++;
var C = t + 1
, D = 0;
for (d = 0; d < e; d++)
for (c = 0; c < t; c++)
p = d * C + c,
f = d * C + c + 1,
g = (d + 1) * C + c + 1,
m = (d + 1) * C + c,
v[D++] = f,
v[D++] = p,
v[D++] = g,
v[D++] = p,
v[D++] = m,
v[D++] = g;
this.boundingBox = new ir,
this.boundingBox.max.set(y, y, y),
this.boundingBox.min.set(-y, -y, -y)
}
})
, Cn = qr.extend({
castShadow: !1
}, {
type: "AMBIENT_LIGHT",
uniformTemplates: {
ambientLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
}
}
})
, Dn = qr.extend({
shadowBias: .001,
shadowSlopeScale: 2,
shadowCascade: 1,
cascadeSplitLogFactor: .2
}, {
type: "DIRECTIONAL_LIGHT",
uniformTemplates: {
directionalLightDirection: {
type: "3f",
value: function (e) {
return e.__dir = e.__dir || new vt,
e.__dir.copy(e.worldTransform.z).normalize().negate().array
}
},
directionalLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
}
},
clone: function () {
var e = qr.prototype.clone.call(this);
return e.shadowBias = this.shadowBias,
e.shadowSlopeScale = this.shadowSlopeScale,
e
}
})
, Ln = qr.extend({
range: 100,
castShadow: !1
}, {
type: "POINT_LIGHT",
uniformTemplates: {
pointLightPosition: {
type: "3f",
value: function (e) {
return e.getWorldPosition().array
}
},
pointLightRange: {
type: "1f",
value: function (e) {
return e.range
}
},
pointLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
}
},
clone: function () {
var e = qr.prototype.clone.call(this);
return e.range = this.range,
e
}
})
, Pn = qr.extend({
range: 20,
umbraAngle: 30,
penumbraAngle: 45,
falloffFactor: 2,
shadowBias: .001,
shadowSlopeScale: 2
}, {
type: "SPOT_LIGHT",
uniformTemplates: {
spotLightPosition: {
type: "3f",
value: function (e) {
return e.getWorldPosition().array
}
},
spotLightRange: {
type: "1f",
value: function (e) {
return e.range
}
},
spotLightUmbraAngleCosine: {
type: "1f",
value: function (e) {
return Math.cos(e.umbraAngle * Math.PI / 180)
}
},
spotLightPenumbraAngleCosine: {
type: "1f",
value: function (e) {
return Math.cos(e.penumbraAngle * Math.PI / 180)
}
},
spotLightFalloffFactor: {
type: "1f",
value: function (e) {
return e.falloffFactor
}
},
spotLightDirection: {
type: "3f",
value: function (e) {
return e.__dir = e.__dir || new vt,
e.__dir.copy(e.worldTransform.z).negate().array
}
},
spotLightColor: {
type: "3f",
value: function (e) {
var t = e.color
, r = e.intensity;
return [t[0] * r, t[1] * r, t[2] * r]
}
}
},
clone: function () {
var e = qr.prototype.clone.call(this);
return e.range = this.range,
e.umbraAngle = this.umbraAngle,
e.penumbraAngle = this.penumbraAngle,
e.falloffFactor = this.falloffFactor,
e.shadowBias = this.shadowBias,
e.shadowSlopeScale = this.shadowSlopeScale,
e
}
});
var On = function (e, t, r, i) {
e = e || 0,
t = t || 0,
r = r || 0,
i = i || 0,
this.array = Et.fromValues(e, t, r, i),
this._dirty = !0
};
On.prototype = {
constructor: On,
add: function (e) {
return Et.add(this.array, this.array, e.array),
this._dirty = !0,
this
},
set: function (e, t, r, i) {
return this.array[0] = e,
this.array[1] = t,
this.array[2] = r,
this.array[3] = i,
this._dirty = !0,
this
},
setArray: function (e) {
return this.array[0] = e[0],
this.array[1] = e[1],
this.array[2] = e[2],
this.array[3] = e[3],
this._dirty = !0,
this
},
clone: function () {
return new On(this.x, this.y, this.z, this.w)
},
copy: function (e) {
return Et.copy(this.array, e.array),
this._dirty = !0,
this
},
dist: function (e) {
return Et.dist(this.array, e.array)
},
distance: function (e) {
return Et.distance(this.array, e.array)
},
div: function (e) {
return Et.div(this.array, this.array, e.array),
this._dirty = !0,
this
},
divide: function (e) {
return Et.divide(this.array, this.array, e.array),
this._dirty = !0,
this
},
dot: function (e) {
return Et.dot(this.array, e.array)
},
len: function () {
return Et.len(this.array)
},
length: function () {
return Et.length(this.array)
},
lerp: function (e, t, r) {
return Et.lerp(this.array, e.array, t.array, r),
this._dirty = !0,
this
},
min: function (e) {
return Et.min(this.array, this.array, e.array),
this._dirty = !0,
this
},
max: function (e) {
return Et.max(this.array, this.array, e.array),
this._dirty = !0,
this
},
mul: function (e) {
return Et.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Et.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
negate: function () {
return Et.negate(this.array, this.array),
this._dirty = !0,
this
},
normalize: function () {
return Et.normalize(this.array, this.array),
this._dirty = !0,
this
},
random: function (e) {
return Et.random(this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return Et.scale(this.array, this.array, e),
this._dirty = !0,
this
},
scaleAndAdd: function (e, t) {
return Et.scaleAndAdd(this.array, this.array, e.array, t),
this._dirty = !0,
this
},
sqrDist: function (e) {
return Et.sqrDist(this.array, e.array)
},
squaredDistance: function (e) {
return Et.squaredDistance(this.array, e.array)
},
sqrLen: function () {
return Et.sqrLen(this.array)
},
squaredLength: function () {
return Et.squaredLength(this.array)
},
sub: function (e) {
return Et.sub(this.array, this.array, e.array),
this._dirty = !0,
this
},
subtract: function (e) {
return Et.subtract(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformMat4: function (e) {
return Et.transformMat4(this.array, this.array, e.array),
this._dirty = !0,
this
},
transformQuat: function (e) {
return Et.transformQuat(this.array, this.array, e.array),
this._dirty = !0,
this
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
};
var Nn = Object.defineProperty;
if (Nn) {
var In = On.prototype;
Nn(In, "x", {
get: function () {
return this.array[0]
},
set: function (e) {
this.array[0] = e,
this._dirty = !0
}
}),
Nn(In, "y", {
get: function () {
return this.array[1]
},
set: function (e) {
this.array[1] = e,
this._dirty = !0
}
}),
Nn(In, "z", {
get: function () {
return this.array[2]
},
set: function (e) {
this.array[2] = e,
this._dirty = !0
}
}),
Nn(In, "w", {
get: function () {
return this.array[3]
},
set: function (e) {
this.array[3] = e,
this._dirty = !0
}
})
}
On.add = function (e, t, r) {
return Et.add(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.set = function (e, t, r, i, n) {
Et.set(e.array, t, r, i, n),
e._dirty = !0
}
,
On.copy = function (e, t) {
return Et.copy(e.array, t.array),
e._dirty = !0,
e
}
,
On.distance = On.dist = function (e, t) {
return Et.distance(e.array, t.array)
}
,
On.divide = On.div = function (e, t, r) {
return Et.divide(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.dot = function (e, t) {
return Et.dot(e.array, t.array)
}
,
On.len = function (e) {
return Et.length(e.array)
}
,
On.lerp = function (e, t, r, i) {
return Et.lerp(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
On.min = function (e, t, r) {
return Et.min(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.max = function (e, t, r) {
return Et.max(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.multiply = On.mul = function (e, t, r) {
return Et.multiply(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.negate = function (e, t) {
return Et.negate(e.array, t.array),
e._dirty = !0,
e
}
,
On.normalize = function (e, t) {
return Et.normalize(e.array, t.array),
e._dirty = !0,
e
}
,
On.random = function (e, t) {
return Et.random(e.array, t),
e._dirty = !0,
e
}
,
On.scale = function (e, t, r) {
return Et.scale(e.array, t.array, r),
e._dirty = !0,
e
}
,
On.scaleAndAdd = function (e, t, r, i) {
return Et.scaleAndAdd(e.array, t.array, r.array, i),
e._dirty = !0,
e
}
,
On.squaredDistance = On.sqrDist = function (e, t) {
return Et.sqrDist(e.array, t.array)
}
,
On.squaredLength = On.sqrLen = function (e) {
return Et.sqrLen(e.array)
}
,
On.subtract = On.sub = function (e, t, r) {
return Et.subtract(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.transformMat4 = function (e, t, r) {
return Et.transformMat4(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
On.transformQuat = function (e, t, r) {
return Et.transformQuat(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
const Rn = On;
var Bn = {
create: function () {
var e = new ce(4);
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e
},
clone: function (e) {
var t = new ce(4);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t[3] = e[3],
t
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e
},
identity: function (e) {
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e
},
transpose: function (e, t) {
if (e === t) {
var r = t[1];
e[1] = t[2],
e[2] = r
} else
e[0] = t[0],
e[1] = t[2],
e[2] = t[1],
e[3] = t[3];
return e
},
invert: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = r * a - n * i;
return o ? (o = 1 / o,
e[0] = a * o,
e[1] = -i * o,
e[2] = -n * o,
e[3] = r * o,
e) : null
},
adjoint: function (e, t) {
var r = t[0];
return e[0] = t[3],
e[1] = -t[1],
e[2] = -t[2],
e[3] = r,
e
},
determinant: function (e) {
return e[0] * e[3] - e[2] * e[1]
},
multiply: function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = r[0]
, l = r[1]
, h = r[2]
, u = r[3];
return e[0] = i * s + a * l,
e[1] = n * s + o * l,
e[2] = i * h + a * u,
e[3] = n * h + o * u,
e
}
};
Bn.mul = Bn.multiply,
Bn.rotate = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = Math.sin(r)
, l = Math.cos(r);
return e[0] = i * l + a * s,
e[1] = n * l + o * s,
e[2] = i * -s + a * l,
e[3] = n * -s + o * l,
e
}
,
Bn.scale = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = r[0]
, l = r[1];
return e[0] = i * s,
e[1] = n * s,
e[2] = a * l,
e[3] = o * l,
e
}
,
Bn.frob = function (e) {
return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2))
}
,
Bn.LDU = function (e, t, r, i) {
return e[2] = i[2] / i[0],
r[0] = i[0],
r[1] = i[1],
r[3] = i[3] - e[2] * r[1],
[e, t, r]
}
;
const Fn = Bn;
var zn = function () {
this.array = Fn.create(),
this._dirty = !0
};
zn.prototype = {
constructor: zn,
setArray: function (e) {
for (var t = 0; t < this.array.length; t++)
this.array[t] = e[t];
return this._dirty = !0,
this
},
clone: function () {
return (new zn).copy(this)
},
copy: function (e) {
return Fn.copy(this.array, e.array),
this._dirty = !0,
this
},
adjoint: function () {
return Fn.adjoint(this.array, this.array),
this._dirty = !0,
this
},
determinant: function () {
return Fn.determinant(this.array)
},
identity: function () {
return Fn.identity(this.array),
this._dirty = !0,
this
},
invert: function () {
return Fn.invert(this.array, this.array),
this._dirty = !0,
this
},
mul: function (e) {
return Fn.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
mulLeft: function (e) {
return Fn.mul(this.array, e.array, this.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Fn.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiplyLeft: function (e) {
return Fn.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
rotate: function (e) {
return Fn.rotate(this.array, this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return Fn.scale(this.array, this.array, e.array),
this._dirty = !0,
this
},
transpose: function () {
return Fn.transpose(this.array, this.array),
this._dirty = !0,
this
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
},
zn.adjoint = function (e, t) {
return Fn.adjoint(e.array, t.array),
e._dirty = !0,
e
}
,
zn.copy = function (e, t) {
return Fn.copy(e.array, t.array),
e._dirty = !0,
e
}
,
zn.determinant = function (e) {
return Fn.determinant(e.array)
}
,
zn.identity = function (e) {
return Fn.identity(e.array),
e._dirty = !0,
e
}
,
zn.invert = function (e, t) {
return Fn.invert(e.array, t.array),
e._dirty = !0,
e
}
,
zn.multiply = zn.mul = function (e, t, r) {
return Fn.mul(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
zn.rotate = function (e, t, r) {
return Fn.rotate(e.array, t.array, r),
e._dirty = !0,
e
}
,
zn.scale = function (e, t, r) {
return Fn.scale(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
zn.transpose = function (e, t) {
return Fn.transpose(e.array, t.array),
e._dirty = !0,
e
}
;
const Gn = zn;
var Un = {
create: function () {
var e = new ce(6);
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e[4] = 0,
e[5] = 0,
e
},
clone: function (e) {
var t = new ce(6);
return t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
t[3] = e[3],
t[4] = e[4],
t[5] = e[5],
t
},
copy: function (e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e[4] = t[4],
e[5] = t[5],
e
},
identity: function (e) {
return e[0] = 1,
e[1] = 0,
e[2] = 0,
e[3] = 1,
e[4] = 0,
e[5] = 0,
e
},
invert: function (e, t) {
var r = t[0]
, i = t[1]
, n = t[2]
, a = t[3]
, o = t[4]
, s = t[5]
, l = r * a - i * n;
return l ? (l = 1 / l,
e[0] = a * l,
e[1] = -i * l,
e[2] = -n * l,
e[3] = r * l,
e[4] = (n * s - a * o) * l,
e[5] = (i * o - r * s) * l,
e) : null
},
determinant: function (e) {
return e[0] * e[3] - e[1] * e[2]
},
multiply: function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = r[0]
, u = r[1]
, c = r[2]
, d = r[3]
, f = r[4]
, p = r[5];
return e[0] = i * h + a * u,
e[1] = n * h + o * u,
e[2] = i * c + a * d,
e[3] = n * c + o * d,
e[4] = i * f + a * p + s,
e[5] = n * f + o * p + l,
e
}
};
Un.mul = Un.multiply,
Un.rotate = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = Math.sin(r)
, u = Math.cos(r);
return e[0] = i * u + a * h,
e[1] = n * u + o * h,
e[2] = i * -h + a * u,
e[3] = n * -h + o * u,
e[4] = s,
e[5] = l,
e
}
,
Un.scale = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = r[0]
, u = r[1];
return e[0] = i * h,
e[1] = n * h,
e[2] = a * u,
e[3] = o * u,
e[4] = s,
e[5] = l,
e
}
,
Un.translate = function (e, t, r) {
var i = t[0]
, n = t[1]
, a = t[2]
, o = t[3]
, s = t[4]
, l = t[5]
, h = r[0]
, u = r[1];
return e[0] = i,
e[1] = n,
e[2] = a,
e[3] = o,
e[4] = i * h + a * u + s,
e[5] = n * h + o * u + l,
e
}
,
Un.frob = function (e) {
return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + 1)
}
;
const kn = Un;
var Vn = function () {
this.array = kn.create(),
this._dirty = !0
};
Vn.prototype = {
constructor: Vn,
setArray: function (e) {
for (var t = 0; t < this.array.length; t++)
this.array[t] = e[t];
return this._dirty = !0,
this
},
clone: function () {
return (new Vn).copy(this)
},
copy: function (e) {
return kn.copy(this.array, e.array),
this._dirty = !0,
this
},
determinant: function () {
return kn.determinant(this.array)
},
identity: function () {
return kn.identity(this.array),
this._dirty = !0,
this
},
invert: function () {
return kn.invert(this.array, this.array),
this._dirty = !0,
this
},
mul: function (e) {
return kn.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
mulLeft: function (e) {
return kn.mul(this.array, e.array, this.array),
this._dirty = !0,
this
},
multiply: function (e) {
return kn.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiplyLeft: function (e) {
return kn.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
rotate: function (e) {
return kn.rotate(this.array, this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return kn.scale(this.array, this.array, e.array),
this._dirty = !0,
this
},
translate: function (e) {
return kn.translate(this.array, this.array, e.array),
this._dirty = !0,
this
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
},
Vn.copy = function (e, t) {
return kn.copy(e.array, t.array),
e._dirty = !0,
e
}
,
Vn.determinant = function (e) {
return kn.determinant(e.array)
}
,
Vn.identity = function (e) {
return kn.identity(e.array),
e._dirty = !0,
e
}
,
Vn.invert = function (e, t) {
return kn.invert(e.array, t.array),
e._dirty = !0,
e
}
,
Vn.multiply = Vn.mul = function (e, t, r) {
return kn.mul(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Vn.rotate = function (e, t, r) {
return kn.rotate(e.array, t.array, r),
e._dirty = !0,
e
}
,
Vn.scale = function (e, t, r) {
return kn.scale(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Vn.translate = function (e, t, r) {
return kn.translate(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
const Hn = Vn;
var Wn = function () {
this.array = Dt.create(),
this._dirty = !0
};
Wn.prototype = {
constructor: Wn,
setArray: function (e) {
for (var t = 0; t < this.array.length; t++)
this.array[t] = e[t];
return this._dirty = !0,
this
},
adjoint: function () {
return Dt.adjoint(this.array, this.array),
this._dirty = !0,
this
},
clone: function () {
return (new Wn).copy(this)
},
copy: function (e) {
return Dt.copy(this.array, e.array),
this._dirty = !0,
this
},
determinant: function () {
return Dt.determinant(this.array)
},
fromMat2d: function (e) {
return Dt.fromMat2d(this.array, e.array),
this._dirty = !0,
this
},
fromMat4: function (e) {
return Dt.fromMat4(this.array, e.array),
this._dirty = !0,
this
},
fromQuat: function (e) {
return Dt.fromQuat(this.array, e.array),
this._dirty = !0,
this
},
identity: function () {
return Dt.identity(this.array),
this._dirty = !0,
this
},
invert: function () {
return Dt.invert(this.array, this.array),
this._dirty = !0,
this
},
mul: function (e) {
return Dt.mul(this.array, this.array, e.array),
this._dirty = !0,
this
},
mulLeft: function (e) {
return Dt.mul(this.array, e.array, this.array),
this._dirty = !0,
this
},
multiply: function (e) {
return Dt.multiply(this.array, this.array, e.array),
this._dirty = !0,
this
},
multiplyLeft: function (e) {
return Dt.multiply(this.array, e.array, this.array),
this._dirty = !0,
this
},
rotate: function (e) {
return Dt.rotate(this.array, this.array, e),
this._dirty = !0,
this
},
scale: function (e) {
return Dt.scale(this.array, this.array, e.array),
this._dirty = !0,
this
},
translate: function (e) {
return Dt.translate(this.array, this.array, e.array),
this._dirty = !0,
this
},
normalFromMat4: function (e) {
return Dt.normalFromMat4(this.array, e.array),
this._dirty = !0,
this
},
transpose: function () {
return Dt.transpose(this.array, this.array),
this._dirty = !0,
this
},
toString: function () {
return "[" + Array.prototype.join.call(this.array, ",") + "]"
},
toArray: function () {
return Array.prototype.slice.call(this.array)
}
},
Wn.adjoint = function (e, t) {
return Dt.adjoint(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.copy = function (e, t) {
return Dt.copy(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.determinant = function (e) {
return Dt.determinant(e.array)
}
,
Wn.identity = function (e) {
return Dt.identity(e.array),
e._dirty = !0,
e
}
,
Wn.invert = function (e, t) {
return Dt.invert(e.array, t.array),
e
}
,
Wn.multiply = Wn.mul = function (e, t, r) {
return Dt.mul(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Wn.fromMat2d = function (e, t) {
return Dt.fromMat2d(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.fromMat4 = function (e, t) {
return Dt.fromMat4(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.fromQuat = function (e, t) {
return Dt.fromQuat(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.normalFromMat4 = function (e, t) {
return Dt.normalFromMat4(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.rotate = function (e, t, r) {
return Dt.rotate(e.array, t.array, r),
e._dirty = !0,
e
}
,
Wn.scale = function (e, t, r) {
return Dt.scale(e.array, t.array, r.array),
e._dirty = !0,
e
}
,
Wn.transpose = function (e, t) {
return Dt.transpose(e.array, t.array),
e._dirty = !0,
e
}
,
Wn.translate = function (e, t, r) {
return Dt.translate(e.array, t.array, r.array),
e._dirty = !0,
e
}
;
const jn = Wn;
var Xn = {
linear: function (e) {
return e
},
quadraticIn: function (e) {
return e * e
},
quadraticOut: function (e) {
return e * (2 - e)
},
quadraticInOut: function (e) {
return (e *= 2) < 1 ? .5 * e * e : -.5 * (--e * (e - 2) - 1)
},
cubicIn: function (e) {
return e * e * e
},
cubicOut: function (e) {
return --e * e * e + 1
},
cubicInOut: function (e) {
return (e *= 2) < 1 ? .5 * e * e * e : .5 * ((e -= 2) * e * e + 2)
},
quarticIn: function (e) {
return e * e * e * e
},
quarticOut: function (e) {
return 1 - --e * e * e * e
},
quarticInOut: function (e) {
return (e *= 2) < 1 ? .5 * e * e * e * e : -.5 * ((e -= 2) * e * e * e - 2)
},
quinticIn: function (e) {
return e * e * e * e * e
},
quinticOut: function (e) {
return --e * e * e * e * e + 1
},
quinticInOut: function (e) {
return (e *= 2) < 1 ? .5 * e * e * e * e * e : .5 * ((e -= 2) * e * e * e * e + 2)
},
sinusoidalIn: function (e) {
return 1 - Math.cos(e * Math.PI / 2)
},
sinusoidalOut: function (e) {
return Math.sin(e * Math.PI / 2)
},
sinusoidalInOut: function (e) {
return .5 * (1 - Math.cos(Math.PI * e))
},
exponentialIn: function (e) {
return 0 === e ? 0 : Math.pow(1024, e - 1)
},
exponentialOut: function (e) {
return 1 === e ? 1 : 1 - Math.pow(2, -10 * e)
},
exponentialInOut: function (e) {
return 0 === e ? 0 : 1 === e ? 1 : (e *= 2) < 1 ? .5 * Math.pow(1024, e - 1) : .5 * (2 - Math.pow(2, -10 * (e - 1)))
},
circularIn: function (e) {
return 1 - Math.sqrt(1 - e * e)
},
circularOut: function (e) {
return Math.sqrt(1 - --e * e)
},
circularInOut: function (e) {
return (e *= 2) < 1 ? -.5 * (Math.sqrt(1 - e * e) - 1) : .5 * (Math.sqrt(1 - (e -= 2) * e) + 1)
},
elasticIn: function (e) {
var t, r = .1;
return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1,
t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI),
-r * Math.pow(2, 10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4))
},
elasticOut: function (e) {
var t, r = .1;
return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1,
t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI),
r * Math.pow(2, -10 * e) * Math.sin((e - t) * (2 * Math.PI) / .4) + 1)
},
elasticInOut: function (e) {
var t, r = .1;
return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1,
t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI),
(e *= 2) < 1 ? r * Math.pow(2, 10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4) * -.5 : r * Math.pow(2, -10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4) * .5 + 1)
},
backIn: function (e) {
var t = 1.70158;
return e * e * ((t + 1) * e - t)
},
backOut: function (e) {
var t = 1.70158;
return --e * e * ((t + 1) * e + t) + 1
},
backInOut: function (e) {
var t = 2.5949095;
return (e *= 2) < 1 ? e * e * ((t + 1) * e - t) * .5 : .5 * ((e -= 2) * e * ((t + 1) * e + t) + 2)
},
bounceIn: function (e) {
return 1 - Xn.bounceOut(1 - e)
},
bounceOut: function (e) {
return e < 1 / 2.75 ? 7.5625 * e * e : e < 2 / 2.75 ? 7.5625 * (e -= 1.5 / 2.75) * e + .75 : e < 2.5 / 2.75 ? 7.5625 * (e -= 2.25 / 2.75) * e + .9375 : 7.5625 * (e -= 2.625 / 2.75) * e + .984375
},
bounceInOut: function (e) {
return e < .5 ? .5 * Xn.bounceIn(2 * e) : .5 * Xn.bounceOut(2 * e - 1) + .5
}
};
const qn = Xn
, Zn = function () {
function e(e) {
this._initialized = !1,
this._startTime = 0,
this._pausedTime = 0,
this._paused = !1,
this._life = e.life || 1e3,
this._delay = e.delay || 0,
this.loop = null != e.loop && e.loop,
this.gap = e.gap || 0,
this.easing = e.easing || "linear",
this.onframe = e.onframe,
this.ondestroy = e.ondestroy,
this.onrestart = e.onrestart
}
return e.prototype.step = function (e, t) {
if (this._initialized || (this._startTime = e + this._delay,
this._initialized = !0),
!this._paused) {
var r = (e - this._startTime - this._pausedTime) / this._life;
r < 0 && (r = 0),
r = Math.min(r, 1);
var i = this.easing
, n = "string" == typeof i ? qn[i] : i
, a = "function" == typeof n ? n(r) : r;
if (this.onframe && this.onframe(a),
1 === r) {
if (!this.loop)
return !0;
this._restart(e),
this.onrestart && this.onrestart()
}
return !1
}
this._pausedTime += t
}
,
e.prototype._restart = function (e) {
var t = (e - this._startTime - this._pausedTime) % this._life;
this._startTime = e - t + this.gap,
this._pausedTime = 0
}
,
e.prototype.pause = function () {
this._paused = !0
}
,
e.prototype.resume = function () {
this._paused = !1
}
,
e
}();
var Yn = {
transparent: [0, 0, 0, 0],
aliceblue: [240, 248, 255, 1],
antiquewhite: [250, 235, 215, 1],
aqua: [0, 255, 255, 1],
aquamarine: [127, 255, 212, 1],
azure: [240, 255, 255, 1],
beige: [245, 245, 220, 1],
bisque: [255, 228, 196, 1],
black: [0, 0, 0, 1],
blanchedalmond: [255, 235, 205, 1],
blue: [0, 0, 255, 1],
blueviolet: [138, 43, 226, 1],
brown: [165, 42, 42, 1],
burlywood: [222, 184, 135, 1],
cadetblue: [95, 158, 160, 1],
chartreuse: [127, 255, 0, 1],
chocolate: [210, 105, 30, 1],
coral: [255, 127, 80, 1],
cornflowerblue: [100, 149, 237, 1],
cornsilk: [255, 248, 220, 1],
crimson: [220, 20, 60, 1],
cyan: [0, 255, 255, 1],
darkblue: [0, 0, 139, 1],
darkcyan: [0, 139, 139, 1],
darkgoldenrod: [184, 134, 11, 1],
darkgray: [169, 169, 169, 1],
darkgreen: [0, 100, 0, 1],
darkgrey: [169, 169, 169, 1],
darkkhaki: [189, 183, 107, 1],
darkmagenta: [139, 0, 139, 1],
darkolivegreen: [85, 107, 47, 1],
darkorange: [255, 140, 0, 1],
darkorchid: [153, 50, 204, 1],
darkred: [139, 0, 0, 1],
darksalmon: [233, 150, 122, 1],
darkseagreen: [143, 188, 143, 1],
darkslateblue: [72, 61, 139, 1],
darkslategray: [47, 79, 79, 1],
darkslategrey: [47, 79, 79, 1],
darkturquoise: [0, 206, 209, 1],
darkviolet: [148, 0, 211, 1],
deeppink: [255, 20, 147, 1],
deepskyblue: [0, 191, 255, 1],
dimgray: [105, 105, 105, 1],
dimgrey: [105, 105, 105, 1],
dodgerblue: [30, 144, 255, 1],
firebrick: [178, 34, 34, 1],
floralwhite: [255, 250, 240, 1],
forestgreen: [34, 139, 34, 1],
fuchsia: [255, 0, 255, 1],
gainsboro: [220, 220, 220, 1],
ghostwhite: [248, 248, 255, 1],
gold: [255, 215, 0, 1],
goldenrod: [218, 165, 32, 1],
gray: [128, 128, 128, 1],
green: [0, 128, 0, 1],
greenyellow: [173, 255, 47, 1],
grey: [128, 128, 128, 1],
honeydew: [240, 255, 240, 1],
hotpink: [255, 105, 180, 1],
indianred: [205, 92, 92, 1],
indigo: [75, 0, 130, 1],
ivory: [255, 255, 240, 1],
khaki: [240, 230, 140, 1],
lavender: [230, 230, 250, 1],
lavenderblush: [255, 240, 245, 1],
lawngreen: [124, 252, 0, 1],
lemonchiffon: [255, 250, 205, 1],
lightblue: [173, 216, 230, 1],
lightcoral: [240, 128, 128, 1],
lightcyan: [224, 255, 255, 1],
lightgoldenrodyellow: [250, 250, 210, 1],
lightgray: [211, 211, 211, 1],
lightgreen: [144, 238, 144, 1],
lightgrey: [211, 211, 211, 1],
lightpink: [255, 182, 193, 1],
lightsalmon: [255, 160, 122, 1],
lightseagreen: [32, 178, 170, 1],
lightskyblue: [135, 206, 250, 1],
lightslategray: [119, 136, 153, 1],
lightslategrey: [119, 136, 153, 1],
lightsteelblue: [176, 196, 222, 1],
lightyellow: [255, 255, 224, 1],
lime: [0, 255, 0, 1],
limegreen: [50, 205, 50, 1],
linen: [250, 240, 230, 1],
magenta: [255, 0, 255, 1],
maroon: [128, 0, 0, 1],
mediumaquamarine: [102, 205, 170, 1],
mediumblue: [0, 0, 205, 1],
mediumorchid: [186, 85, 211, 1],
mediumpurple: [147, 112, 219, 1],
mediumseagreen: [60, 179, 113, 1],
mediumslateblue: [123, 104, 238, 1],
mediumspringgreen: [0, 250, 154, 1],
mediumturquoise: [72, 209, 204, 1],
mediumvioletred: [199, 21, 133, 1],
midnightblue: [25, 25, 112, 1],
mintcream: [245, 255, 250, 1],
mistyrose: [255, 228, 225, 1],
moccasin: [255, 228, 181, 1],
navajowhite: [255, 222, 173, 1],
navy: [0, 0, 128, 1],
oldlace: [253, 245, 230, 1],
olive: [128, 128, 0, 1],
olivedrab: [107, 142, 35, 1],
orange: [255, 165, 0, 1],
orangered: [255, 69, 0, 1],
orchid: [218, 112, 214, 1],
palegoldenrod: [238, 232, 170, 1],
palegreen: [152, 251, 152, 1],
paleturquoise: [175, 238, 238, 1],
palevioletred: [219, 112, 147, 1],
papayawhip: [255, 239, 213, 1],
peachpuff: [255, 218, 185, 1],
peru: [205, 133, 63, 1],
pink: [255, 192, 203, 1],
plum: [221, 160, 221, 1],
powderblue: [176, 224, 230, 1],
purple: [128, 0, 128, 1],
red: [255, 0, 0, 1],
rosybrown: [188, 143, 143, 1],
royalblue: [65, 105, 225, 1],
saddlebrown: [139, 69, 19, 1],
salmon: [250, 128, 114, 1],
sandybrown: [244, 164, 96, 1],
seagreen: [46, 139, 87, 1],
seashell: [255, 245, 238, 1],
sienna: [160, 82, 45, 1],
silver: [192, 192, 192, 1],
skyblue: [135, 206, 235, 1],
slateblue: [106, 90, 205, 1],
slategray: [112, 128, 144, 1],
slategrey: [112, 128, 144, 1],
snow: [255, 250, 250, 1],
springgreen: [0, 255, 127, 1],
steelblue: [70, 130, 180, 1],
tan: [210, 180, 140, 1],
teal: [0, 128, 128, 1],
thistle: [216, 191, 216, 1],
tomato: [255, 99, 71, 1],
turquoise: [64, 224, 208, 1],
violet: [238, 130, 238, 1],
wheat: [245, 222, 179, 1],
white: [255, 255, 255, 1],
whitesmoke: [245, 245, 245, 1],
yellow: [255, 255, 0, 1],
yellowgreen: [154, 205, 50, 1]
};
function Kn(e) {
return (e = Math.round(e)) < 0 ? 0 : e > 255 ? 255 : e
}
function Qn(e) {
return e < 0 ? 0 : e > 1 ? 1 : e
}
function Jn(e) {
var t = e;
return t.length && "%" === t.charAt(t.length - 1) ? Kn(parseFloat(t) / 100 * 255) : Kn(parseInt(t, 10))
}
function $n(e) {
var t = e;
return t.length && "%" === t.charAt(t.length - 1) ? Qn(parseFloat(t) / 100) : Qn(parseFloat(t))
}
function ea(e, t, r) {
return r < 0 ? r += 1 : r > 1 && (r -= 1),
6 * r < 1 ? e + (t - e) * r * 6 : 2 * r < 1 ? t : 3 * r < 2 ? e + (t - e) * (2 / 3 - r) * 6 : e
}
function ta(e, t, r, i, n) {
return e[0] = t,
e[1] = r,
e[2] = i,
e[3] = n,
e
}
function ra(e, t) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e
}
var ia = new bi(20)
, na = null;
function aa(e, t) {
na && ra(na, t),
na = ia.put(e, na || t.slice())
}
function oa(e, t) {
if (e) {
t = t || [];
var r = ia.get(e);
if (r)
return ra(t, r);
var i = (e += "").replace(/ /g, "").toLowerCase();
if (i in Yn)
return ra(t, Yn[i]),
aa(e, t),
t;
var n, a = i.length;
if ("#" === i.charAt(0))
return 4 === a || 5 === a ? (n = parseInt(i.slice(1, 4), 16)) >= 0 && n <= 4095 ? (ta(t, (3840 & n) >> 4 | (3840 & n) >> 8, 240 & n | (240 & n) >> 4, 15 & n | (15 & n) << 4, 5 === a ? parseInt(i.slice(4), 16) / 15 : 1),
aa(e, t),
t) : void ta(t, 0, 0, 0, 1) : 7 === a || 9 === a ? (n = parseInt(i.slice(1, 7), 16)) >= 0 && n <= 16777215 ? (ta(t, (16711680 & n) >> 16, (65280 & n) >> 8, 255 & n, 9 === a ? parseInt(i.slice(7), 16) / 255 : 1),
aa(e, t),
t) : void ta(t, 0, 0, 0, 1) : void 0;
var o = i.indexOf("(")
, s = i.indexOf(")");
if (-1 !== o && s + 1 === a) {
var l = i.substr(0, o)
, h = i.substr(o + 1, s - (o + 1)).split(",")
, u = 1;
switch (l) {
case "rgba":
if (4 !== h.length)
return 3 === h.length ? ta(t, +h[0], +h[1], +h[2], 1) : ta(t, 0, 0, 0, 1);
u = $n(h.pop());
case "rgb":
return 3 !== h.length ? void ta(t, 0, 0, 0, 1) : (ta(t, Jn(h[0]), Jn(h[1]), Jn(h[2]), u),
aa(e, t),
t);
case "hsla":
return 4 !== h.length ? void ta(t, 0, 0, 0, 1) : (h[3] = $n(h[3]),
sa(h, t),
aa(e, t),
t);
case "hsl":
return 3 !== h.length ? void ta(t, 0, 0, 0, 1) : (sa(h, t),
aa(e, t),
t);
default:
return
}
}
ta(t, 0, 0, 0, 1)
}
}
function sa(e, t) {
var r = (parseFloat(e[0]) % 360 + 360) % 360 / 360
, i = $n(e[1])
, n = $n(e[2])
, a = n <= .5 ? n * (i + 1) : n + i - n * i
, o = 2 * n - a;
return ta(t = t || [], Kn(255 * ea(o, a, r + 1 / 3)), Kn(255 * ea(o, a, r)), Kn(255 * ea(o, a, r - 1 / 3)), 1),
4 === e.length && (t[3] = e[3]),
t
}
var la = Object.prototype.toString
, ha = Array.prototype
, ua = ha.forEach
, ca = ha.filter
, da = ha.slice
, fa = ha.map
, pa = function () { }
.constructor
, ma = pa ? pa.prototype : null;
function ga(e, t) {
if (Object.assign)
Object.assign(e, t);
else
for (var r in t)
t.hasOwnProperty(r) && (e[r] = t[r]);
return e
}
function _a(e, t, r) {
if (e = "prototype" in e ? e.prototype : e,
t = "prototype" in t ? t.prototype : t,
Object.getOwnPropertyNames)
for (var i = Object.getOwnPropertyNames(t), n = 0; n < i.length; n++) {
var a = i[n];
"constructor" !== a && (r ? null != t[a] : null == e[a]) && (e[a] = t[a])
}
else
!function (e, t, r) {
for (var i = ba(t), n = 0; n < i.length; n++) {
var a = i[n];
(r ? null != t[a] : null == e[a]) && (e[a] = t[a])
}
}(e, t, r)
}
function va(e) {
return !!e && "string" != typeof e && "number" == typeof e.length
}
function ya(e, t, r) {
if (e && t)
if (e.forEach && e.forEach === ua)
e.forEach(t, r);
else if (e.length === +e.length)
for (var i = 0, n = e.length; i < n; i++)
t.call(r, e[i], i, e);
else
for (var a in e)
e.hasOwnProperty(a) && t.call(r, e[a], a, e)
}
function xa(e, t, r) {
if (!e)
return [];
if (!t)
return Sa(e);
if (e.map && e.map === fa)
return e.map(t, r);
for (var i = [], n = 0, a = e.length; n < a; n++)
i.push(t.call(r, e[n], n, e));
return i
}
function ba(e) {
if (!e)
return [];
if (Object.keys)
return Object.keys(e);
var t = [];
for (var r in e)
e.hasOwnProperty(r) && t.push(r);
return t
}
function wa(e) {
for (var t = [], r = 1; r < arguments.length; r++)
t[r - 1] = arguments[r];
return function () {
return e.apply(this, t.concat(da.call(arguments)))
}
}
function Ta(e, t) {
return null != e ? e : t
}
function Sa(e) {
for (var t = [], r = 1; r < arguments.length; r++)
t[r - 1] = arguments[r];
return da.apply(e, t)
}
ma && "function" == typeof ma.bind && ma.call.bind(ma.bind);
var Ma = function () {
function e(t) {
this.data = {};
var r, i = (r = t,
Array.isArray ? Array.isArray(r) : "[object Array]" === la.call(r));
this.data = {};
var n = this;
function a(e, t) {
i ? n.set(e, t) : n.set(t, e)
}
t instanceof e ? t.each(a) : t && ya(t, a)
}
return e.prototype.get = function (e) {
return this.data.hasOwnProperty(e) ? this.data[e] : null
}
,
e.prototype.set = function (e, t) {
return this.data[e] = t
}
,
e.prototype.each = function (e, t) {
for (var r in this.data)
this.data.hasOwnProperty(r) && e.call(t, this.data[r], r)
}
,
e.prototype.keys = function () {
return ba(this.data)
}
,
e.prototype.removeKey = function (e) {
delete this.data[e]
}
,
e
}();
function Aa(e, t) {
for (var r = new e.constructor(e.length + t.length), i = 0; i < e.length; i++)
r[i] = e[i];
var n = e.length;
for (i = 0; i < t.length; i++)
r[i + n] = t[i];
return r
}
var Ea = Array.prototype.slice;
function Ca(e, t, r) {
return (t - e) * r + e
}
function Da(e, t, r, i) {
for (var n = t.length, a = 0; a < n; a++)
e[a] = Ca(t[a], r[a], i)
}
function La(e, t, r, i) {
for (var n = t.length, a = 0; a < n; a++)
e[a] = t[a] + r[a] * i;
return e
}
function Pa(e, t, r, i) {
for (var n = t.length, a = n && t[0].length, o = 0; o < n; o++) {
e[o] || (e[o] = []);
for (var s = 0; s < a; s++)
e[o][s] = t[o][s] + r[o][s] * i
}
return e
}
function Oa(e, t, r) {
var i = e
, n = t;
if (i.push && n.push) {
var a = i.length
, o = n.length;
if (a !== o)
if (a > o)
i.length = o;
else
for (var s = a; s < o; s++)
i.push(1 === r ? n[s] : Ea.call(n[s]));
var l = i[0] && i[0].length;
for (s = 0; s < i.length; s++)
if (1 === r)
isNaN(i[s]) && (i[s] = n[s]);
else
for (var h = 0; h < l; h++)
isNaN(i[s][h]) && (i[s][h] = n[s][h])
}
}
function Na(e, t) {
var r = e.length;
if (r !== t.length)
return !1;
for (var i = 0; i < r; i++)
if (e[i] !== t[i])
return !1;
return !0
}
function Ia(e, t, r, i, n, a, o) {
var s = .5 * (r - e)
, l = .5 * (i - t);
return (2 * (t - r) + s + l) * o + (-3 * (t - r) - 2 * s - l) * a + s * n + t
}
function Ra(e, t, r, i, n, a, o, s) {
for (var l = t.length, h = 0; h < l; h++)
e[h] = Ia(t[h], r[h], i[h], n[h], a, o, s)
}
function Ba(e) {
if (va(e)) {
var t = e.length;
if (va(e[0])) {
for (var r = [], i = 0; i < t; i++)
r.push(Ea.call(e[i]));
return r
}
return Ea.call(e)
}
return e
}
function Fa(e) {
return e[0] = Math.floor(e[0]),
e[1] = Math.floor(e[1]),
e[2] = Math.floor(e[2]),
"rgba(" + e.join(",") + ")"
}
var za = [0, 0, 0, 0]
, Ga = function () {
function e(e) {
this.keyframes = [],
this.maxTime = 0,
this.arrDim = 0,
this.interpolable = !0,
this._needsSort = !1,
this._isAllValueEqual = !0,
this._lastFrame = 0,
this._lastFramePercent = 0,
this.propName = e
}
return e.prototype.isFinished = function () {
return this._finished
}
,
e.prototype.setFinished = function () {
this._finished = !0,
this._additiveTrack && this._additiveTrack.setFinished()
}
,
e.prototype.needsAnimate = function () {
return !this._isAllValueEqual && this.keyframes.length >= 2 && this.interpolable
}
,
e.prototype.getAdditiveTrack = function () {
return this._additiveTrack
}
,
e.prototype.addKeyframe = function (e, t) {
e >= this.maxTime ? this.maxTime = e : this._needsSort = !0;
var r = this.keyframes
, i = r.length;
if (this.interpolable)
if (va(t)) {
var n = function (e) {
return va(e && e[0]) ? 2 : 1
}(t);
if (i > 0 && this.arrDim !== n)
return void (this.interpolable = !1);
if (1 === n && "number" != typeof t[0] || 2 === n && "number" != typeof t[0][0])
return void (this.interpolable = !1);
if (i > 0) {
var a = r[i - 1];
this._isAllValueEqual && (1 === n && Na(t, a.value) || (this._isAllValueEqual = !1))
}
this.arrDim = n
} else {
if (this.arrDim > 0)
return void (this.interpolable = !1);
if ("string" == typeof t) {
var o = oa(t);
o ? (t = o,
this.isValueColor = !0) : this.interpolable = !1
} else if ("number" != typeof t || isNaN(t))
return void (this.interpolable = !1);
this._isAllValueEqual && i > 0 && (a = r[i - 1],
(this.isValueColor && !Na(a.value, t) || a.value !== t) && (this._isAllValueEqual = !1))
}
var s = {
time: e,
value: t,
percent: 0
};
return this.keyframes.push(s),
s
}
,
e.prototype.prepare = function (e) {
var t = this.keyframes;
this._needsSort && t.sort((function (e, t) {
return e.time - t.time
}
));
for (var r = this.arrDim, i = t.length, n = t[i - 1], a = 0; a < i; a++)
t[a].percent = t[a].time / this.maxTime,
r > 0 && a !== i - 1 && Oa(t[a].value, n.value, r);
if (e && this.needsAnimate() && e.needsAnimate() && r === e.arrDim && this.isValueColor === e.isValueColor && !e._finished) {
this._additiveTrack = e;
var o = t[0].value;
for (a = 0; a < i; a++)
0 === r ? this.isValueColor ? t[a].additiveValue = La([], t[a].value, o, -1) : t[a].additiveValue = t[a].value - o : 1 === r ? t[a].additiveValue = La([], t[a].value, o, -1) : 2 === r && (t[a].additiveValue = Pa([], t[a].value, o, -1))
}
}
,
e.prototype.step = function (e, t) {
if (!this._finished) {
this._additiveTrack && this._additiveTrack._finished && (this._additiveTrack = null);
var r, i = null != this._additiveTrack, n = i ? "additiveValue" : "value", a = this.keyframes, o = this.keyframes.length, s = this.propName, l = this.arrDim, h = this.isValueColor;
if (t < 0)
r = 0;
else if (t < this._lastFramePercent) {
for (r = Math.min(this._lastFrame + 1, o - 1); r >= 0 && !(a[r].percent <= t); r--)
;
r = Math.min(r, o - 2)
} else {
for (r = this._lastFrame; r < o && !(a[r].percent > t); r++)
;
r = Math.min(r - 1, o - 2)
}
var u = a[r + 1]
, c = a[r];
if (c && u) {
this._lastFrame = r,
this._lastFramePercent = t;
var d = u.percent - c.percent;
if (0 !== d) {
var f = (t - c.percent) / d
, p = i ? this._additiveValue : h ? za : e[s];
if ((l > 0 || h) && !p && (p = this._additiveValue = []),
this.useSpline) {
var m = a[r][n]
, g = a[0 === r ? r : r - 1][n]
, _ = a[r > o - 2 ? o - 1 : r + 1][n]
, v = a[r > o - 3 ? o - 1 : r + 2][n];
if (l > 0)
1 === l ? Ra(p, g, m, _, v, f, f * f, f * f * f) : function (e, t, r, i, n, a, o, s) {
for (var l = t.length, h = t[0].length, u = 0; u < l; u++) {
e[u] || (e[1] = []);
for (var c = 0; c < h; c++)
e[u][c] = Ia(t[u][c], r[u][c], i[u][c], n[u][c], a, o, s)
}
}(p, g, m, _, v, f, f * f, f * f * f);
else if (h)
Ra(p, g, m, _, v, f, f * f, f * f * f),
i || (e[s] = Fa(p));
else {
var y = void 0;
y = this.interpolable ? Ia(g, m, _, v, f, f * f, f * f * f) : _,
i ? this._additiveValue = y : e[s] = y
}
} else
l > 0 ? 1 === l ? Da(p, c[n], u[n], f) : function (e, t, r, i) {
for (var n = t.length, a = n && t[0].length, o = 0; o < n; o++) {
e[o] || (e[o] = []);
for (var s = 0; s < a; s++)
e[o][s] = Ca(t[o][s], r[o][s], i)
}
}(p, c[n], u[n], f) : h ? (Da(p, c[n], u[n], f),
i || (e[s] = Fa(p))) : (y = void 0,
y = this.interpolable ? Ca(c[n], u[n], f) : function (e, t, r) {
return r > .5 ? t : e
}(c[n], u[n], f),
i ? this._additiveValue = y : e[s] = y);
i && this._addToTarget(e)
}
}
}
}
,
e.prototype._addToTarget = function (e) {
var t = this.arrDim
, r = this.propName
, i = this._additiveValue;
0 === t ? this.isValueColor ? (oa(e[r], za),
La(za, za, i, 1),
e[r] = Fa(za)) : e[r] = e[r] + i : 1 === t ? La(e[r], e[r], i, 1) : 2 === t && Pa(e[r], e[r], i, 1)
}
,
e
}();
const Ua = function () {
function e(e, t, r) {
this._tracks = {},
this._trackKeys = [],
this._delay = 0,
this._maxTime = 0,
this._paused = !1,
this._started = 0,
this._clip = null,
this._target = e,
this._loop = t,
t && r ? function () {
for (var e = [], t = 0; t < arguments.length; t++)
e[t] = arguments[t];
"undefined" != typeof console && console.error.apply(console, e)
}("Can' use additive animation on looped animation.") : this._additiveAnimators = r
}
return e.prototype.getTarget = function () {
return this._target
}
,
e.prototype.changeTarget = function (e) {
this._target = e
}
,
e.prototype.when = function (e, t) {
return this.whenWithKeys(e, t, ba(t))
}
,
e.prototype.whenWithKeys = function (e, t, r) {
for (var i = this._tracks, n = 0; n < r.length; n++) {
var a = r[n]
, o = i[a];
if (!o) {
o = i[a] = new Ga(a);
var s = void 0
, l = this._getAdditiveTrack(a);
if (l) {
var h = l.keyframes[l.keyframes.length - 1];
s = h && h.value,
l.isValueColor && s && (s = Fa(s))
} else
s = this._target[a];
if (null == s)
continue;
0 !== e && o.addKeyframe(0, Ba(s)),
this._trackKeys.push(a)
}
o.addKeyframe(e, Ba(t[a]))
}
return this._maxTime = Math.max(this._maxTime, e),
this
}
,
e.prototype.pause = function () {
this._clip.pause(),
this._paused = !0
}
,
e.prototype.resume = function () {
this._clip.resume(),
this._paused = !1
}
,
e.prototype.isPaused = function () {
return !!this._paused
}
,
e.prototype._doneCallback = function () {
this._setTracksFinished(),
this._clip = null;
var e = this._doneList;
if (e)
for (var t = e.length, r = 0; r < t; r++)
e[r].call(this)
}
,
e.prototype._abortedCallback = function () {
this._setTracksFinished();
var e = this.animation
, t = this._abortedList;
if (e && e.removeClip(this._clip),
this._clip = null,
t)
for (var r = 0; r < t.length; r++)
t[r].call(this)
}
,
e.prototype._setTracksFinished = function () {
for (var e = this._tracks, t = this._trackKeys, r = 0; r < t.length; r++)
e[t[r]].setFinished()
}
,
e.prototype._getAdditiveTrack = function (e) {
var t, r = this._additiveAnimators;
if (r)
for (var i = 0; i < r.length; i++) {
var n = r[i].getTrack(e);
n && (t = n)
}
return t
}
,
e.prototype.start = function (e, t) {
if (!(this._started > 0)) {
this._started = 1;
for (var r = this, i = [], n = 0; n < this._trackKeys.length; n++) {
var a = this._trackKeys[n]
, o = this._tracks[a]
, s = this._getAdditiveTrack(a)
, l = o.keyframes;
if (o.prepare(s),
o.needsAnimate())
i.push(o);
else if (!o.interpolable) {
var h = l[l.length - 1];
h && (r._target[o.propName] = h.value)
}
}
if (i.length || t) {
var u = new Zn({
life: this._maxTime,
loop: this._loop,
delay: this._delay,
onframe: function (e) {
r._started = 2;
var t = r._additiveAnimators;
if (t) {
for (var n = !1, a = 0; a < t.length; a++)
if (t[a]._clip) {
n = !0;
break
}
n || (r._additiveAnimators = null)
}
for (a = 0; a < i.length; a++)
i[a].step(r._target, e);
var o = r._onframeList;
if (o)
for (a = 0; a < o.length; a++)
o[a](r._target, e)
},
ondestroy: function () {
r._doneCallback()
}
});
this._clip = u,
this.animation && this.animation.addClip(u),
e && "spline" !== e && (u.easing = e)
} else
this._doneCallback();
return this
}
}
,
e.prototype.stop = function (e) {
if (this._clip) {
var t = this._clip;
e && t.onframe(1),
this._abortedCallback()
}
}
,
e.prototype.delay = function (e) {
return this._delay = e,
this
}
,
e.prototype.during = function (e) {
return e && (this._onframeList || (this._onframeList = []),
this._onframeList.push(e)),
this
}
,
e.prototype.done = function (e) {
return e && (this._doneList || (this._doneList = []),
this._doneList.push(e)),
this
}
,
e.prototype.aborted = function (e) {
return e && (this._abortedList || (this._abortedList = []),
this._abortedList.push(e)),
this
}
,
e.prototype.getClip = function () {
return this._clip
}
,
e.prototype.getTrack = function (e) {
return this._tracks[e]
}
,
e.prototype.stopTracks = function (e, t) {
if (!e.length || !this._clip)
return !0;
for (var r = this._tracks, i = this._trackKeys, n = 0; n < e.length; n++) {
var a = r[e[n]];
a && (t ? a.step(this._target, 1) : 1 === this._started && a.step(this._target, 0),
a.setFinished())
}
var o = !0;
for (n = 0; n < i.length; n++)
if (!r[i[n]].isFinished()) {
o = !1;
break
}
return o && this._abortedCallback(),
o
}
,
e.prototype.saveFinalToTarget = function (e, t) {
if (e) {
t = t || this._trackKeys;
for (var r = 0; r < t.length; r++) {
var i = t[r]
, n = this._tracks[i];
if (n && !n.isFinished()) {
var a = n.keyframes
, o = a[a.length - 1];
if (o) {
var s = Ba(o.value);
n.isValueColor && (s = Fa(s)),
e[i] = s
}
}
}
}
}
,
e.prototype.__changeFinalValue = function (e, t) {
t = t || ba(e);
for (var r = 0; r < t.length; r++) {
var i = t[r]
, n = this._tracks[i];
if (n) {
var a = n.keyframes;
if (a.length > 1) {
var o = a.pop();
n.addKeyframe(o.time, e[i]),
n.prepare(n.getAdditiveTrack())
}
}
}
}
,
e
}()
, ka = {
_animators: null,
getAnimators: function () {
return this._animators = this._animators || [],
this._animators
},
animate: function (e, t) {
var r;
if (this._animators = this._animators || [],
e) {
for (var i = e.split("."), n = this, a = 0, o = i.length; a < o; a++)
n && (n = n[i[a]]);
n && (r = n)
} else
r = this;
if (null == r)
throw new Error("Target " + e + " not exists");
var s = this._animators
, l = new Ua(r, t)
, h = this;
return l.during((function () {
h.__zr && h.__zr.refresh()
}
)).done((function () {
var e = s.indexOf(l);
e >= 0 && s.splice(e, 1)
}
)),
s.push(l),
this.__zr && this.__zr.animation.addAnimator(l),
l
},
stopAnimation: function (e) {
this._animators = this._animators || [];
for (var t = this._animators, r = t.length, i = 0; i < r; i++)
t[i].stop(e);
return t.length = 0,
this
},
addAnimatorsToZr: function (e) {
if (this._animators)
for (var t = 0; t < this._animators.length; t++)
e.animation.addAnimator(this._animators[t])
},
removeAnimatorsFromZr: function (e) {
if (this._animators)
for (var t = 0; t < this._animators.length; t++)
e.animation.removeAnimator(this._animators[t])
}
}
, Va = "\n@export clay.util.rand\nhighp float rand(vec2 uv) {\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot(uv.xy, vec2(a,b)), sn = mod(dt, 3.141592653589793);\n return fract(sin(sn) * c);\n}\n@end\n@export clay.util.calculate_attenuation\nuniform float attenuationFactor : 5.0;\nfloat lightAttenuation(float dist, float range)\n{\n float attenuation = 1.0;\n attenuation = dist*dist/(range*range+1.0);\n float att_s = attenuationFactor;\n attenuation = 1.0/(attenuation*att_s+1.0);\n att_s = 1.0/(att_s+1.0);\n attenuation = attenuation - att_s;\n attenuation /= 1.0 - att_s;\n return clamp(attenuation, 0.0, 1.0);\n}\n@end\n@export clay.util.edge_factor\n#ifdef SUPPORT_STANDARD_DERIVATIVES\nfloat edgeFactor(float width)\n{\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * width, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n#else\nfloat edgeFactor(float width)\n{\n return 1.0;\n}\n#endif\n@end\n@export clay.util.encode_float\nvec4 encodeFloat(const in float depth)\n{\n const vec4 bitShifts = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);\n const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);\n vec4 res = fract(depth * bitShifts);\n res -= res.xxyz * bit_mask;\n return res;\n}\n@end\n@export clay.util.decode_float\nfloat decodeFloat(const in vec4 color)\n{\n const vec4 bitShifts = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);\n return dot(color, bitShifts);\n}\n@end\n@export clay.util.float\n@import clay.util.encode_float\n@import clay.util.decode_float\n@end\n@export clay.util.rgbm_decode\nvec3 RGBMDecode(vec4 rgbm, float range) {\n return range * rgbm.rgb * rgbm.a;\n}\n@end\n@export clay.util.rgbm_encode\nvec4 RGBMEncode(vec3 color, float range) {\n if (dot(color, color) == 0.0) {\n return vec4(0.0);\n }\n vec4 rgbm;\n color /= range;\n rgbm.a = clamp(max(max(color.r, color.g), max(color.b, 1e-6)), 0.0, 1.0);\n rgbm.a = ceil(rgbm.a * 255.0) / 255.0;\n rgbm.rgb = color / rgbm.a;\n return rgbm;\n}\n@end\n@export clay.util.rgbm\n@import clay.util.rgbm_decode\n@import clay.util.rgbm_encode\nvec4 decodeHDR(vec4 color)\n{\n#if defined(RGBM_DECODE) || defined(RGBM)\n return vec4(RGBMDecode(color, 8.12), 1.0);\n#else\n return color;\n#endif\n}\nvec4 encodeHDR(vec4 color)\n{\n#if defined(RGBM_ENCODE) || defined(RGBM)\n return RGBMEncode(color.xyz, 8.12);\n#else\n return color;\n#endif\n}\n@end\n@export clay.util.srgb\nvec4 sRGBToLinear(in vec4 value) {\n return vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 linearTosRGB(in vec4 value) {\n return vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}\n@end\n@export clay.chunk.skinning_header\n#ifdef SKINNING\nattribute vec3 weight : WEIGHT;\nattribute vec4 joint : JOINT;\n#ifdef USE_SKIN_MATRICES_TEXTURE\nuniform sampler2D skinMatricesTexture : ignore;\nuniform float skinMatricesTextureSize: ignore;\nmat4 getSkinMatrix(sampler2D tex, float idx) {\n float j = idx * 4.0;\n float x = mod(j, skinMatricesTextureSize);\n float y = floor(j / skinMatricesTextureSize) + 0.5;\n vec2 scale = vec2(skinMatricesTextureSize);\n return mat4(\n texture2D(tex, vec2(x + 0.5, y) / scale),\n texture2D(tex, vec2(x + 1.5, y) / scale),\n texture2D(tex, vec2(x + 2.5, y) / scale),\n texture2D(tex, vec2(x + 3.5, y) / scale)\n );\n}\nmat4 getSkinMatrix(float idx) {\n return getSkinMatrix(skinMatricesTexture, idx);\n}\n#else\nuniform mat4 skinMatrix[JOINT_COUNT] : SKIN_MATRIX;\nmat4 getSkinMatrix(float idx) {\n return skinMatrix[int(idx)];\n}\n#endif\n#endif\n@end\n@export clay.chunk.skin_matrix\nmat4 skinMatrixWS = getSkinMatrix(joint.x) * weight.x;\nif (weight.y > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.y) * weight.y;\n}\nif (weight.z > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.z) * weight.z;\n}\nfloat weightW = 1.0-weight.x-weight.y-weight.z;\nif (weightW > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.w) * weightW;\n}\n@end\n@export clay.chunk.instancing_header\n#ifdef INSTANCING\nattribute vec4 instanceMat1;\nattribute vec4 instanceMat2;\nattribute vec4 instanceMat3;\n#endif\n@end\n@export clay.chunk.instancing_matrix\nmat4 instanceMat = mat4(\n vec4(instanceMat1.xyz, 0.0),\n vec4(instanceMat2.xyz, 0.0),\n vec4(instanceMat3.xyz, 0.0),\n vec4(instanceMat1.w, instanceMat2.w, instanceMat3.w, 1.0)\n);\n@end\n@export clay.util.parallax_correct\nvec3 parallaxCorrect(in vec3 dir, in vec3 pos, in vec3 boxMin, in vec3 boxMax) {\n vec3 first = (boxMax - pos) / dir;\n vec3 second = (boxMin - pos) / dir;\n vec3 further = max(first, second);\n float dist = min(further.x, min(further.y, further.z));\n vec3 fixedPos = pos + dir * dist;\n vec3 boxCenter = (boxMax + boxMin) * 0.5;\n return normalize(fixedPos - boxCenter);\n}\n@end\n@export clay.util.clamp_sample\nvec4 clampSample(const in sampler2D texture, const in vec2 coord)\n{\n#ifdef STEREO\n float eye = step(0.5, coord.x) * 0.5;\n vec2 coordClamped = clamp(coord, vec2(eye, 0.0), vec2(0.5 + eye, 1.0));\n#else\n vec2 coordClamped = clamp(coord, vec2(0.0), vec2(1.0));\n#endif\n return texture2D(texture, coordClamped);\n}\n@end\n@export clay.util.ACES\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\n@end";
function Ha(e) {
return e instanceof HTMLCanvasElement || e instanceof HTMLImageElement || e instanceof Image
}
Object.assign(sr.prototype, ka),
Xe.import(Va),
Xe.import(qe),
Xe.import("\n@export ecgl.common.transformUniforms\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\n@end\n\n@export ecgl.common.attributes\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 normal : NORMAL;\n@end\n\n@export ecgl.common.uv.header\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nuniform vec2 detailUvRepeat : [1.0, 1.0];\nuniform vec2 detailUvOffset : [0.0, 0.0];\n\nvarying vec2 v_Texcoord;\nvarying vec2 v_DetailTexcoord;\n@end\n\n@export ecgl.common.uv.main\nv_Texcoord = texcoord * uvRepeat + uvOffset;\nv_DetailTexcoord = texcoord * detailUvRepeat + detailUvOffset;\n@end\n\n@export ecgl.common.uv.fragmentHeader\nvarying vec2 v_Texcoord;\nvarying vec2 v_DetailTexcoord;\n@end\n\n\n@export ecgl.common.albedo.main\n\n vec4 albedoTexel = vec4(1.0);\n#ifdef DIFFUSEMAP_ENABLED\n albedoTexel = texture2D(diffuseMap, v_Texcoord);\n #ifdef SRGB_DECODE\n albedoTexel = sRGBToLinear(albedoTexel);\n #endif\n#endif\n\n#ifdef DETAILMAP_ENABLED\n vec4 detailTexel = texture2D(detailMap, v_DetailTexcoord);\n #ifdef SRGB_DECODE\n detailTexel = sRGBToLinear(detailTexel);\n #endif\n albedoTexel.rgb = mix(albedoTexel.rgb, detailTexel.rgb, detailTexel.a);\n albedoTexel.a = detailTexel.a + (1.0 - detailTexel.a) * albedoTexel.a;\n#endif\n\n@end\n\n@export ecgl.common.wireframe.vertexHeader\n\n#ifdef WIREFRAME_QUAD\nattribute vec4 barycentric;\nvarying vec4 v_Barycentric;\n#elif defined(WIREFRAME_TRIANGLE)\nattribute vec3 barycentric;\nvarying vec3 v_Barycentric;\n#endif\n\n@end\n\n@export ecgl.common.wireframe.vertexMain\n\n#if defined(WIREFRAME_QUAD) || defined(WIREFRAME_TRIANGLE)\n v_Barycentric = barycentric;\n#endif\n\n@end\n\n\n@export ecgl.common.wireframe.fragmentHeader\n\nuniform float wireframeLineWidth : 1;\nuniform vec4 wireframeLineColor: [0, 0, 0, 0.5];\n\n#ifdef WIREFRAME_QUAD\nvarying vec4 v_Barycentric;\nfloat edgeFactor () {\n vec4 d = fwidth(v_Barycentric);\n vec4 a4 = smoothstep(vec4(0.0), d * wireframeLineWidth, v_Barycentric);\n return min(min(min(a4.x, a4.y), a4.z), a4.w);\n}\n#elif defined(WIREFRAME_TRIANGLE)\nvarying vec3 v_Barycentric;\nfloat edgeFactor () {\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * wireframeLineWidth, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n#endif\n\n@end\n\n\n@export ecgl.common.wireframe.fragmentMain\n\n#if defined(WIREFRAME_QUAD) || defined(WIREFRAME_TRIANGLE)\n if (wireframeLineWidth > 0.) {\n vec4 lineColor = wireframeLineColor;\n#ifdef SRGB_DECODE\n lineColor = sRGBToLinear(lineColor);\n#endif\n\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor()) * lineColor.a);\n }\n#endif\n@end\n\n\n\n\n@export ecgl.common.bumpMap.header\n\n#ifdef BUMPMAP_ENABLED\nuniform sampler2D bumpMap;\nuniform float bumpScale : 1.0;\n\n\nvec3 bumpNormal(vec3 surfPos, vec3 surfNormal, vec3 baseNormal)\n{\n vec2 dSTdx = dFdx(v_Texcoord);\n vec2 dSTdy = dFdy(v_Texcoord);\n\n float Hll = bumpScale * texture2D(bumpMap, v_Texcoord).x;\n float dHx = bumpScale * texture2D(bumpMap, v_Texcoord + dSTdx).x - Hll;\n float dHy = bumpScale * texture2D(bumpMap, v_Texcoord + dSTdy).x - Hll;\n\n vec3 vSigmaX = dFdx(surfPos);\n vec3 vSigmaY = dFdy(surfPos);\n vec3 vN = surfNormal;\n\n vec3 R1 = cross(vSigmaY, vN);\n vec3 R2 = cross(vN, vSigmaX);\n\n float fDet = dot(vSigmaX, R1);\n\n vec3 vGrad = sign(fDet) * (dHx * R1 + dHy * R2);\n return normalize(abs(fDet) * baseNormal - vGrad);\n\n}\n#endif\n\n@end\n\n@export ecgl.common.normalMap.vertexHeader\n\n#ifdef NORMALMAP_ENABLED\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@end\n\n@export ecgl.common.normalMap.vertexMain\n\n#ifdef NORMALMAP_ENABLED\n if (dot(tangent, tangent) > 0.0) {\n v_Tangent = normalize((worldInverseTranspose * vec4(tangent.xyz, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n#endif\n\n@end\n\n\n@export ecgl.common.normalMap.fragmentHeader\n\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@end\n\n@export ecgl.common.normalMap.fragmentMain\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_DetailTexcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n#endif\n@end\n\n\n\n@export ecgl.common.vertexAnimation.header\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nattribute vec3 prevNormal;\nuniform float percent;\n#endif\n\n@end\n\n@export ecgl.common.vertexAnimation.main\n\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n vec3 norm = mix(prevNormal, normal, percent);\n#else\n vec3 pos = position;\n vec3 norm = normal;\n#endif\n\n@end\n\n\n@export ecgl.common.ssaoMap.header\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n@end\n\n@export ecgl.common.ssaoMap.main\n float ao = 1.0;\n#ifdef SSAOMAP_ENABLED\n ao = texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r;\n#endif\n@end\n\n\n\n\n@export ecgl.common.diffuseLayer.header\n\n#if (LAYER_DIFFUSEMAP_COUNT > 0)\nuniform float layerDiffuseIntensity[LAYER_DIFFUSEMAP_COUNT];\nuniform sampler2D layerDiffuseMap[LAYER_DIFFUSEMAP_COUNT];\n#endif\n\n@end\n\n@export ecgl.common.emissiveLayer.header\n\n#if (LAYER_EMISSIVEMAP_COUNT > 0)\nuniform float layerEmissionIntensity[LAYER_EMISSIVEMAP_COUNT];\nuniform sampler2D layerEmissiveMap[LAYER_EMISSIVEMAP_COUNT];\n#endif\n\n@end\n\n@export ecgl.common.layers.header\n@import ecgl.common.diffuseLayer.header\n@import ecgl.common.emissiveLayer.header\n@end\n\n@export ecgl.common.diffuseLayer.main\n\n#if (LAYER_DIFFUSEMAP_COUNT > 0)\n for (int _idx_ = 0; _idx_ < LAYER_DIFFUSEMAP_COUNT; _idx_++) {{\n float intensity = layerDiffuseIntensity[_idx_];\n vec4 texel2 = texture2D(layerDiffuseMap[_idx_], v_Texcoord);\n #ifdef SRGB_DECODE\n texel2 = sRGBToLinear(texel2);\n #endif\n albedoTexel.rgb = mix(albedoTexel.rgb, texel2.rgb * intensity, texel2.a);\n albedoTexel.a = texel2.a + (1.0 - texel2.a) * albedoTexel.a;\n }}\n#endif\n\n@end\n\n@export ecgl.common.emissiveLayer.main\n\n#if (LAYER_EMISSIVEMAP_COUNT > 0)\n for (int _idx_ = 0; _idx_ < LAYER_EMISSIVEMAP_COUNT; _idx_++)\n {{\n vec4 texel2 = texture2D(layerEmissiveMap[_idx_], v_Texcoord) * layerEmissionIntensity[_idx_];\n #ifdef SRGB_DECODE\n texel2 = sRGBToLinear(texel2);\n #endif\n float intensity = layerEmissionIntensity[_idx_];\n gl_FragColor.rgb += texel2.rgb * texel2.a * intensity;\n }}\n#endif\n\n@end\n"),
Xe.import("@export ecgl.color.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\n@import ecgl.common.uv.header\n\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position: POSITION;\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nuniform float percent : 1.0;\n#endif\n\n#ifdef ATMOSPHERE_ENABLED\nattribute vec3 normal: NORMAL;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nvarying vec3 v_Normal;\n#endif\n\nvoid main()\n{\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n#else\n vec3 pos = position;\n#endif\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n @import ecgl.common.uv.main\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n#ifdef ATMOSPHERE_ENABLED\n v_Normal = normalize((worldInverseTranspose * vec4(normal, 0.0)).xyz);\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n\n}\n\n@end\n\n@export ecgl.color.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n\nuniform sampler2D diffuseMap;\nuniform sampler2D detailMap;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\nvarying vec3 v_Normal;\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n@import ecgl.common.layers.header\n\n@import ecgl.common.uv.fragmentHeader\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color);\n#else\n gl_FragColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n gl_FragColor *= albedoTexel;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n\n}\n@end"),
Xe.import("/**\n * http: */\n\n@export ecgl.lambert.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n\n@import ecgl.common.attributes\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.vertexAnimation.header\n\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nvoid main()\n{\n @import ecgl.common.uv.main\n\n @import ecgl.common.vertexAnimation.main\n\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n v_Normal = normalize((worldInverseTranspose * vec4(norm, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n}\n\n@end\n\n\n@export ecgl.lambert.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform sampler2D diffuseMap;\nuniform sampler2D detailMap;\n\n@import ecgl.common.layers.header\n\nuniform float emissionIntensity: 1.0;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\n#endif\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color);\n#else\n gl_FragColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n gl_FragColor *= sRGBToLinear(v_Color);\n #else\n gl_FragColor *= v_Color;\n #endif\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n gl_FragColor *= albedoTexel;\n\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int i = 0; i < AMBIENT_LIGHT_COUNT; i++)\n {\n diffuseColor += ambientLightColor[i] * ambientFactor * ao;\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseColor += calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_] * ao;\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n vec3 lightColor = directionalLightColor[i];\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n\n float ndl = dot(N, normalize(lightDirection)) * shadowContrib;\n\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0);\n }\n#endif\n\n gl_FragColor.rgb *= diffuseColor;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end"),
Xe.import("@export ecgl.realistic.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n@import ecgl.common.attributes\n\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n#ifdef NORMALMAP_ENABLED\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@import ecgl.common.vertexAnimation.header\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nvoid main()\n{\n\n @import ecgl.common.uv.main\n\n @import ecgl.common.vertexAnimation.main\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n v_Normal = normalize((worldInverseTranspose * vec4(norm, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n#ifdef NORMALMAP_ENABLED\n v_Tangent = normalize((worldInverseTranspose * vec4(tangent.xyz, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n\n}\n\n@end\n\n\n\n@export ecgl.realistic.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n#define PI 3.14159265358979\n#define ROUGHNESS_CHANEL 0\n#define METALNESS_CHANEL 1\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform sampler2D diffuseMap;\n\nuniform sampler2D detailMap;\nuniform sampler2D metalnessMap;\nuniform sampler2D roughnessMap;\n\n@import ecgl.common.layers.header\n\nuniform float emissionIntensity: 1.0;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nuniform float metalness : 0.0;\nuniform float roughness : 0.5;\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\n#endif\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n@import ecgl.common.normalMap.fragmentHeader\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import clay.util.rgbm\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\n\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\n\nvoid main()\n{\n vec4 albedoColor = color;\n\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n albedoColor *= sRGBToLinear(v_Color);\n #else\n albedoColor *= v_Color;\n #endif\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n albedoColor *= albedoTexel;\n\n float m = metalness;\n\n#ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, v_DetailTexcoord)[METALNESS_CHANEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n#endif\n\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 specFactor = mix(vec3(0.04), baseColor, m);\n\n float g = 1.0 - roughness;\n\n#ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, v_DetailTexcoord)[ROUGHNESS_CHANEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n#endif\n\n vec3 N = v_Normal;\n\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n@import ecgl.common.normalMap.fragmentMain\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n vec3 diffuseTerm = vec3(0.0);\n vec3 specularTerm = vec3(0.0);\n\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, specFactor);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_] * ambientFactor * ao;\n }}\n#endif\n\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_] * ao;\n }}\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -directionalLightDirection[_idx_];\n vec3 lc = directionalLightColor[_idx_];\n\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, normalize(L)), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n\n vec3 li = lc * ndl * shadowContrib;\n\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n\n\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n L = vec3(L.x, L[NORMAL_UP_AXIS], L[NORMAL_FRONT_AXIS]);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = specFactor * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 8.12);\n specularTerm += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2 * ao;\n }}\n#endif\n\n gl_FragColor.rgb = albedoColor.rgb * diffuseTerm + specularTerm;\n gl_FragColor.a = albedoColor.a;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end"),
Xe.import("@export ecgl.hatching.vertex\n\n@import ecgl.realistic.vertex\n\n@end\n\n\n@export ecgl.hatching.fragment\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform vec4 color : [0.0, 0.0, 0.0, 1.0];\nuniform vec4 paperColor : [1.0, 1.0, 1.0, 1.0];\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nuniform sampler2D hatch1;\nuniform sampler2D hatch2;\nuniform sampler2D hatch3;\nuniform sampler2D hatch4;\nuniform sampler2D hatch5;\nuniform sampler2D hatch6;\n\nfloat shade(in float tone) {\n vec4 c = vec4(1. ,1., 1., 1.);\n float step = 1. / 6.;\n vec2 uv = v_DetailTexcoord;\n if (tone <= step / 2.0) {\n c = mix(vec4(0.), texture2D(hatch6, uv), 12. * tone);\n }\n else if (tone <= step) {\n c = mix(texture2D(hatch6, uv), texture2D(hatch5, uv), 6. * tone);\n }\n if(tone > step && tone <= 2. * step){\n c = mix(texture2D(hatch5, uv), texture2D(hatch4, uv) , 6. * (tone - step));\n }\n if(tone > 2. * step && tone <= 3. * step){\n c = mix(texture2D(hatch4, uv), texture2D(hatch3, uv), 6. * (tone - 2. * step));\n }\n if(tone > 3. * step && tone <= 4. * step){\n c = mix(texture2D(hatch3, uv), texture2D(hatch2, uv), 6. * (tone - 3. * step));\n }\n if(tone > 4. * step && tone <= 5. * step){\n c = mix(texture2D(hatch2, uv), texture2D(hatch1, uv), 6. * (tone - 4. * step));\n }\n if(tone > 5. * step){\n c = mix(texture2D(hatch1, uv), vec4(1.), 6. * (tone - 5. * step));\n }\n\n return c.r;\n}\n\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n vec4 inkColor = sRGBToLinear(color);\n#else\n vec4 inkColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n inkColor *= sRGBToLinear(v_Color);\n #else\n inkColor *= v_Color;\n #endif\n#endif\n\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float tone = 0.0;\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int i = 0; i < AMBIENT_LIGHT_COUNT; i++)\n {\n tone += dot(ambientLightColor[i], w) * ambientFactor * ao;\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n tone += dot(calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_], w) * ao;\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n float lightTone = dot(directionalLightColor[i], w);\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n\n float ndl = dot(N, normalize(lightDirection)) * shadowContrib;\n\n tone += lightTone * clamp(ndl, 0.0, 1.0);\n }\n#endif\n\n gl_FragColor = mix(inkColor, paperColor, shade(clamp(tone, 0.0, 1.0)));\n }\n@end\n"),
Xe.import("@export ecgl.sm.depth.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nuniform float percent : 1.0;\n#endif\n\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\n\nvoid main(){\n\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n#else\n vec3 pos = position;\n#endif\n\n v_ViewPosition = worldViewProjection * vec4(pos, 1.0);\n gl_Position = v_ViewPosition;\n\n v_Texcoord = texcoord;\n\n}\n@end\n\n\n\n@export ecgl.sm.depth.fragment\n\n@import clay.sm.depth.fragment\n\n@end");
var Wa = vi.prototype.addToScene
, ja = vi.prototype.removeFromScene;
vi.prototype.addToScene = function (e) {
if (Wa.call(this, e),
this.__zr) {
var t = this.__zr;
e.traverse((function (e) {
e.__zr = t,
e.addAnimatorsToZr && e.addAnimatorsToZr(t)
}
))
}
}
,
vi.prototype.removeFromScene = function (e) {
ja.call(this, e),
e.traverse((function (e) {
var t = e.__zr;
e.__zr = null,
t && e.removeAnimatorsFromZr && e.removeAnimatorsFromZr(t)
}
))
}
,
le.prototype.setTextureImage = function (e, t, r, i) {
if (this.shader) {
var n, a = r.getZr(), o = this;
return o.autoUpdateTextureStatus = !1,
o.disableTexture(e),
!(s = t) || "none" === s || (n = Xa.loadTexture(t, r, i, (function (t) {
o.enableTexture(e),
a && a.refresh()
}
)),
o.set(e, n)),
n
}
var s
}
;
var Xa = {};
Xa.Renderer = ut,
Xa.Node = sr,
Xa.Mesh = Sr,
Xa.Shader = Xe,
Xa.Material = le,
Xa.Texture = wr,
Xa.Texture2D = Dr,
Xa.Geometry = Vr,
Xa.SphereGeometry = En,
Xa.PlaneGeometry = ki,
Xa.CubeGeometry = Wi,
Xa.AmbientLight = Cn,
Xa.DirectionalLight = Dn,
Xa.PointLight = Ln,
Xa.SpotLight = Pn,
Xa.PerspectiveCamera = Ei,
Xa.OrthographicCamera = un,
Xa.Vector2 = _e,
Xa.Vector3 = vt,
Xa.Vector4 = Rn,
Xa.Quaternion = qt,
Xa.Matrix2 = Gn,
Xa.Matrix2d = Hn,
Xa.Matrix3 = jn,
Xa.Matrix4 = Ht,
Xa.Plane = $r,
Xa.Ray = Mt,
Xa.BoundingBox = ir,
Xa.Frustum = si;
var qa = null;
function Za(e) {
return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
}
function Ya(e) {
if ((e.wrapS === wr.REPEAT || e.wrapT === wr.REPEAT) && e.image) {
var t = Za(e.width)
, r = Za(e.height);
if (t !== e.width || r !== e.height) {
var i = document.createElement("canvas");
i.width = t,
i.height = r,
i.getContext("2d").drawImage(e.image, 0, 0, t, r),
e.image = i
}
}
}
Xa.loadTexture = function (e, t, r, i) {
"function" == typeof r && (i = r,
r = {}),
r = r || {};
for (var n = Object.keys(r).sort(), a = "", o = 0; o < n.length; o++)
a += n[o] + "_" + r[n[o]] + "_";
var s, l = t.__textureCache = t.__textureCache || new bi(20);
if ((s = e).getZr && s.setOption) {
var h = e.__textureid__;
if (c = l.get(a + h))
c.texture.surface.setECharts(e),
i && i(c.texture);
else {
var u = new hn(e);
for (u.onupdate = function () {
t.getZr().refresh()
}
,
c = {
texture: u.getTexture()
},
o = 0; o < n.length; o++)
c.texture[n[o]] = r[n[o]];
h = e.__textureid__ || "__ecgl_ec__" + c.texture.__uid__,
e.__textureid__ = h,
l.put(a + h, c),
i && i(c.texture)
}
return c.texture
}
if (Ha(e)) {
var c;
if (h = e.__textureid__,
!(c = l.get(a + h))) {
for (c = {
texture: new Xa.Texture2D({
image: e
})
},
o = 0; o < n.length; o++)
c.texture[n[o]] = r[n[o]];
h = e.__textureid__ || "__ecgl_image__" + c.texture.__uid__,
e.__textureid__ = h,
l.put(a + h, c),
Ya(c.texture),
i && i(c.texture)
}
return c.texture
}
if (c = l.get(a + e))
c.callbacks ? c.callbacks.push(i) : i && i(c.texture);
else if (e.match(/.hdr$|^data:application\/octet-stream/)) {
c = {
callbacks: [i]
};
var d = an.loadTexture(e, {
exposure: r.exposure,
fileType: "hdr"
}, (function () {
d.dirty(),
c.callbacks.forEach((function (e) {
e && e(d)
}
)),
c.callbacks = null
}
));
c.texture = d,
l.put(a + e, c)
} else {
for (d = new Xa.Texture2D({
image: new Image
}),
o = 0; o < n.length; o++)
d[n[o]] = r[n[o]];
c = {
texture: d,
callbacks: [i]
};
var f = d.image;
f.onload = function () {
d.image = f,
Ya(d),
d.dirty(),
c.callbacks.forEach((function (e) {
e && e(d)
}
)),
c.callbacks = null
}
,
f.crossOrigin = "Anonymous",
f.src = e,
d.image = null !== qa ? qa : qa = an.createBlank("rgba(255,255,255,0)").image,
l.put(a + e, c)
}
return c.texture
}
,
Xa.createAmbientCubemap = function (e, t, r, i) {
var n = (e = e || {}).texture
, a = Mn(e.exposure, 1)
, o = new vn({
intensity: Mn(e.specularIntensity, 1)
})
, s = new yn({
intensity: Mn(e.diffuseIntensity, 1),
coefficients: [.844, .712, .691, -.037, .083, .167, .343, .288, .299, -.041, -.021, -.009, -.003, -.041, -.064, -.011, -.007, -.004, -.031, .034, .081, -.06, -.049, -.06, .046, .056, .05]
});
return o.cubemap = Xa.loadTexture(n, r, {
exposure: a
}, (function () {
o.cubemap.flipY = !1,
o.prefilter(t, 32),
s.coefficients = Sn.projectEnvironmentMap(t, o.cubemap, {
lod: 1
}),
i && i()
}
)),
{
specular: o,
diffuse: s
}
}
,
Xa.createBlankTexture = an.createBlank,
Xa.isImage = Ha,
Xa.additiveBlend = function (e) {
e.blendEquation(e.FUNC_ADD),
e.blendFunc(e.SRC_ALPHA, e.ONE)
}
,
Xa.parseColor = function (e, t) {
return e instanceof Array ? (t || (t = []),
t[0] = e[0],
t[1] = e[1],
t[2] = e[2],
e.length > 3 ? t[3] = e[3] : t[3] = 1,
t) : ((t = i.color.parse(e || "#000", t) || [0, 0, 0, 0])[0] /= 255,
t[1] /= 255,
t[2] /= 255,
t)
}
,
Xa.directionFromAlphaBeta = function (e, t) {
var r = e / 180 * Math.PI + Math.PI / 2
, i = -t / 180 * Math.PI + Math.PI / 2
, n = []
, a = Math.sin(r);
return n[0] = a * Math.cos(i),
n[1] = -Math.cos(r),
n[2] = a * Math.sin(i),
n
}
,
Xa.getShadowResolution = function (e) {
var t = 1024;
switch (e) {
case "low":
t = 512;
break;
case "medium":
break;
case "high":
t = 2048;
break;
case "ultra":
t = 4096
}
return t
}
,
Xa.COMMON_SHADERS = ["lambert", "color", "realistic", "hatching", "shadow"],
Xa.createShader = function (e) {
"ecgl.shadow" === e && (e = "ecgl.displayShadow");
var t = Xe.source(e + ".vertex")
, r = Xe.source(e + ".fragment");
t || console.error("Vertex shader of '%s' not exits", e),
r || console.error("Fragment shader of '%s' not exits", e);
var i = new Xe(t, r);
return i.name = e,
i
}
,
Xa.createMaterial = function (e, t) {
t instanceof Array || (t = [t]);
var r = Xa.createShader(e)
, i = new le({
shader: r
});
return t.forEach((function (e) {
"string" == typeof e && i.define(e)
}
)),
i
}
,
Xa.setMaterialFromModel = function (e, t, r, i) {
t.autoUpdateTextureStatus = !1;
var n = r.getModel(e + "Material")
, a = n.get("detailTexture")
, o = Mn(n.get("textureTiling"), 1)
, s = Mn(n.get("textureOffset"), 0);
"number" == typeof o && (o = [o, o]),
"number" == typeof s && (s = [s, s]);
var l = o[0] > 1 || o[1] > 1 ? Xa.Texture.REPEAT : Xa.Texture.CLAMP_TO_EDGE
, h = {
anisotropic: 8,
wrapS: l,
wrapT: l
};
if ("realistic" === e) {
var u = n.get("roughness")
, c = n.get("metalness");
null != c ? isNaN(c) && (t.setTextureImage("metalnessMap", c, i, h),
c = Mn(n.get("metalnessAdjust"), .5)) : c = 0,
null != u ? isNaN(u) && (t.setTextureImage("roughnessMap", u, i, h),
u = Mn(n.get("roughnessAdjust"), .5)) : u = .5;
var d = n.get("normalTexture");
t.setTextureImage("detailMap", a, i, h),
t.setTextureImage("normalMap", d, i, h),
t.set({
roughness: u,
metalness: c,
detailUvRepeat: o,
detailUvOffset: s
})
} else if ("lambert" === e)
t.setTextureImage("detailMap", a, i, h),
t.set({
detailUvRepeat: o,
detailUvOffset: s
});
else if ("color" === e)
t.setTextureImage("detailMap", a, i, h),
t.set({
detailUvRepeat: o,
detailUvOffset: s
});
else if ("hatching" === e) {
var f = n.get("hatchingTextures") || [];
f.length;
for (var p = 0; p < 6; p++)
t.setTextureImage("hatch" + (p + 1), f[p], i, {
anisotropic: 8,
wrapS: Xa.Texture.REPEAT,
wrapT: Xa.Texture.REPEAT
});
t.set({
detailUvRepeat: o,
detailUvOffset: s
})
}
}
,
Xa.updateVertexAnimation = function (e, t, r, i) {
var n = i.get("animation")
, a = i.get("animationDurationUpdate")
, o = i.get("animationEasingUpdate")
, s = r.shadowDepthMaterial;
if (n && t && a > 0 && t.geometry.vertexCount === r.geometry.vertexCount) {
r.material.define("vertex", "VERTEX_ANIMATION"),
r.ignorePreZ = !0,
s && s.define("vertex", "VERTEX_ANIMATION");
for (var l = 0; l < e.length; l++)
r.geometry.attributes[e[l][0]].value = t.geometry.attributes[e[l][1]].value;
r.geometry.dirty(),
r.__percent = 0,
r.material.set("percent", 0),
r.stopAnimation(),
r.animate().when(a, {
__percent: 1
}).during((function () {
r.material.set("percent", r.__percent),
s && s.set("percent", r.__percent)
}
)).done((function () {
r.ignorePreZ = !1,
r.material.undefine("vertex", "VERTEX_ANIMATION"),
s && s.undefine("vertex", "VERTEX_ANIMATION")
}
)).start(o)
} else
r.material.undefine("vertex", "VERTEX_ANIMATION"),
s && s.undefine("vertex", "VERTEX_ANIMATION")
}
;
const Ka = Xa
, Qa = "undefined" != typeof window && (window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window) || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame) || function (e) {
return setTimeout(e, 16)
}
;
var Ja = function (e, t) {
this.id = e,
this.zr = t;
try {
this.renderer = new ut({
clearBit: 0,
devicePixelRatio: t.painter.dpr,
preserveDrawingBuffer: !0,
premultipliedAlpha: !0
}),
this.renderer.resize(t.painter.getWidth(), t.painter.getHeight())
} catch (e) {
return this.renderer = null,
this.dom = document.createElement("div"),
this.dom.style.cssText = "position:absolute; left: 0; top: 0; right: 0; bottom: 0;",
this.dom.className = "ecgl-nowebgl",
this.dom.innerHTML = "Sorry, your browser does not support WebGL",
void console.error(e)
}
this.onglobalout = this.onglobalout.bind(this),
t.on("globalout", this.onglobalout),
this.dom = this.renderer.canvas;
var r = this.dom.style;
r.position = "absolute",
r.left = "0",
r.top = "0",
this.views = [],
this._picking = new _r({
renderer: this.renderer
}),
this._viewsToDispose = [],
this._accumulatingId = 0,
this._zrEventProxy = new i.graphic.Rect({
shape: {
x: -1,
y: -1,
width: 2,
height: 2
},
__isGLToZRProxy: !0
}),
this._backgroundColor = null,
this._disposed = !1
};
function $a(e) {
var t = e.__zr;
e.__zr = null,
t && e.removeAnimatorsFromZr && e.removeAnimatorsFromZr(t)
}
Ja.prototype.setUnpainted = function () { }
,
Ja.prototype.addView = function (e) {
if (e.layer !== this) {
var t = this._viewsToDispose.indexOf(e);
t >= 0 && this._viewsToDispose.splice(t, 1),
this.views.push(e),
e.layer = this;
var r = this.zr;
e.scene.traverse((function (e) {
e.__zr = r,
e.addAnimatorsToZr && e.addAnimatorsToZr(r)
}
))
}
}
,
Ja.prototype.removeView = function (e) {
if (e.layer === this) {
var t = this.views.indexOf(e);
t >= 0 && (this.views.splice(t, 1),
e.scene.traverse($a, this),
e.layer = null,
this._viewsToDispose.push(e))
}
}
,
Ja.prototype.removeViewsAll = function () {
this.views.forEach((function (e) {
e.scene.traverse($a, this),
e.layer = null,
this._viewsToDispose.push(e)
}
), this),
this.views.length = 0
}
,
Ja.prototype.resize = function (e, t) {
this.renderer.resize(e, t)
}
,
Ja.prototype.clear = function () {
var e = this.renderer.gl
, t = this._backgroundColor || [0, 0, 0, 0];
e.clearColor(t[0], t[1], t[2], t[3]),
e.depthMask(!0),
e.colorMask(!0, !0, !0, !0),
e.clear(e.DEPTH_BUFFER_BIT | e.COLOR_BUFFER_BIT)
}
,
Ja.prototype.clearDepth = function () {
var e = this.renderer.gl;
e.clear(e.DEPTH_BUFFER_BIT)
}
,
Ja.prototype.clearColor = function () {
var e = this.renderer.gl;
e.clearColor(0, 0, 0, 0),
e.clear(e.COLOR_BUFFER_BIT)
}
,
Ja.prototype.needsRefresh = function () {
this.zr.refresh()
}
,
Ja.prototype.refresh = function (e) {
this._backgroundColor = e ? Ka.parseColor(e) : [0, 0, 0, 0],
this.renderer.clearColor = this._backgroundColor;
for (var t = 0; t < this.views.length; t++)
this.views[t].prepareRender(this.renderer);
for (this._doRender(!1),
this._trackAndClean(),
t = 0; t < this._viewsToDispose.length; t++)
this._viewsToDispose[t].dispose(this.renderer);
this._viewsToDispose.length = 0,
this._startAccumulating()
}
,
Ja.prototype.renderToCanvas = function (e) {
this._startAccumulating(!0),
e.drawImage(this.dom, 0, 0, e.canvas.width, e.canvas.height)
}
,
Ja.prototype._doRender = function (e) {
this.clear(),
this.renderer.saveViewport();
for (var t = 0; t < this.views.length; t++)
this.views[t].render(this.renderer, e);
this.renderer.restoreViewport()
}
,
Ja.prototype._stopAccumulating = function () {
this._accumulatingId = 0,
clearTimeout(this._accumulatingTimeout)
}
;
var eo = 1;
function to(e) {
for (var t = 0; t < e.length; t++)
e[t].__used__ = 0
}
function ro(e, t) {
for (var r = 0; r < t.length; r++)
t[r].__used__ || t[r].dispose(e)
}
function io(e, t) {
e.__used__ = e.__used__ || 0,
e.__used__++,
1 === e.__used__ && t.push(e)
}
function no(e, t, r) {
var i, n;
e.traverse((function (e) {
if (e.isRenderable()) {
var a = e.geometry
, o = e.material;
if (o !== i)
for (var s = o.getTextureUniforms(), l = 0; l < s.length; l++) {
var h = s[l]
, u = o.uniforms[h].value;
if (u)
if (u instanceof wr)
io(u, t);
else if (u instanceof Array)
for (var c = 0; c < u.length; c++)
u[c] instanceof wr && io(u[c], t)
}
a !== n && io(a, r),
i = o,
n = a
}
}
));
for (var a = 0; a < e.lights.length; a++)
e.lights[a].cubemap && io(e.lights[a].cubemap, t)
}
Ja.prototype._startAccumulating = function (e) {
var t = this;
this._stopAccumulating();
for (var r = !1, i = 0; i < this.views.length; i++)
r = this.views[i].needsAccumulate() || r;
function n(i) {
if (t._accumulatingId && i === t._accumulatingId) {
for (var a = !0, o = 0; o < t.views.length; o++)
a = t.views[o].isAccumulateFinished() && r;
a || (t._doRender(!0),
e ? n(i) : Qa((function () {
n(i)
}
)))
}
}
r && (this._accumulatingId = eo++,
e ? n(t._accumulatingId) : this._accumulatingTimeout = setTimeout((function () {
n(t._accumulatingId)
}
), 50))
}
,
Ja.prototype._trackAndClean = function () {
var e = []
, t = [];
this._textureList && (to(this._textureList),
to(this._geometriesList));
for (var r = 0; r < this.views.length; r++)
no(this.views[r].scene, e, t);
this._textureList && (ro(this.renderer, this._textureList),
ro(this.renderer, this._geometriesList)),
this._textureList = e,
this._geometriesList = t
}
,
Ja.prototype.dispose = function () {
this._disposed || (this._stopAccumulating(),
this._textureList && (to(this._textureList),
to(this._geometriesList),
ro(this.renderer, this._textureList),
ro(this.renderer, this._geometriesList)),
this.zr.off("globalout", this.onglobalout),
this._disposed = !0)
}
,
Ja.prototype.onmousedown = function (e) {
if (!e.target || !e.target.__isGLToZRProxy) {
e = e.event;
var t = this.pickObject(e.offsetX, e.offsetY);
t && (this._dispatchEvent("mousedown", e, t),
this._dispatchDataEvent("mousedown", e, t)),
this._downX = e.offsetX,
this._downY = e.offsetY
}
}
,
Ja.prototype.onmousemove = function (e) {
if (!e.target || !e.target.__isGLToZRProxy) {
e = e.event;
var t = this.pickObject(e.offsetX, e.offsetY)
, r = t && t.target
, i = this._hovered;
this._hovered = t,
i && r !== i.target && (i.relatedTarget = r,
this._dispatchEvent("mouseout", e, i),
this.zr.setCursorStyle("default")),
this._dispatchEvent("mousemove", e, t),
t && (this.zr.setCursorStyle("pointer"),
i && r === i.target || this._dispatchEvent("mouseover", e, t)),
this._dispatchDataEvent("mousemove", e, t)
}
}
,
Ja.prototype.onmouseup = function (e) {
if (!e.target || !e.target.__isGLToZRProxy) {
e = e.event;
var t = this.pickObject(e.offsetX, e.offsetY);
t && (this._dispatchEvent("mouseup", e, t),
this._dispatchDataEvent("mouseup", e, t)),
this._upX = e.offsetX,
this._upY = e.offsetY
}
}
,
Ja.prototype.onclick = Ja.prototype.dblclick = function (e) {
if (!e.target || !e.target.__isGLToZRProxy) {
var t = this._upX - this._downX
, r = this._upY - this._downY;
if (!(Math.sqrt(t * t + r * r) > 20)) {
e = e.event;
var i = this.pickObject(e.offsetX, e.offsetY);
i && (this._dispatchEvent(e.type, e, i),
this._dispatchDataEvent(e.type, e, i));
var n = this._clickToSetFocusPoint(e);
n && n.view.setDOFFocusOnPoint(n.distance) && this.zr.refresh()
}
}
}
,
Ja.prototype._clickToSetFocusPoint = function (e) {
for (var t = this.renderer, r = t.viewport, i = this.views.length - 1; i >= 0; i--) {
var n = this.views[i];
if (n.hasDOF() && n.containPoint(e.offsetX, e.offsetY)) {
this._picking.scene = n.scene,
this._picking.camera = n.camera,
t.viewport = n.viewport;
var a = this._picking.pick(e.offsetX, e.offsetY, !0);
if (a)
return a.view = n,
a
}
}
t.viewport = r
}
,
Ja.prototype.onglobalout = function (e) {
var t = this._hovered;
t && this._dispatchEvent("mouseout", e, {
target: t.target
})
}
,
Ja.prototype.pickObject = function (e, t) {
for (var r = [], i = this.renderer, n = i.viewport, a = 0; a < this.views.length; a++) {
var o = this.views[a];
o.containPoint(e, t) && (this._picking.scene = o.scene,
this._picking.camera = o.camera,
i.viewport = o.viewport,
this._picking.pickAll(e, t, r))
}
return i.viewport = n,
r.sort((function (e, t) {
return e.distance - t.distance
}
)),
r[0]
}
,
Ja.prototype._dispatchEvent = function (e, t, r) {
r || (r = {});
var i = r.target;
for (r.cancelBubble = !1,
r.event = t,
r.type = e,
r.offsetX = t.offsetX,
r.offsetY = t.offsetY; i && (i.trigger(e, r),
i = i.getParent(),
!r.cancelBubble);)
;
this._dispatchToView(e, r)
}
,
Ja.prototype._dispatchDataEvent = function (e, t, r) {
var n = r && r.target
, a = n && n.dataIndex
, o = n && n.seriesIndex
, s = n && n.eventData
, l = !1
, h = this._zrEventProxy;
h.x = t.offsetX,
h.y = t.offsetY,
h.update();
var u = {
target: h
};
const c = i.helper.getECData(h);
"mousemove" === e && (null != a ? a !== this._lastDataIndex && (parseInt(this._lastDataIndex, 10) >= 0 && (c.dataIndex = this._lastDataIndex,
c.seriesIndex = this._lastSeriesIndex,
this.zr.handler.dispatchToElement(u, "mouseout", t)),
l = !0) : null != s && s !== this._lastEventData && (null != this._lastEventData && (c.eventData = this._lastEventData,
this.zr.handler.dispatchToElement(u, "mouseout", t)),
l = !0),
this._lastEventData = s,
this._lastDataIndex = a,
this._lastSeriesIndex = o),
c.eventData = s,
c.dataIndex = a,
c.seriesIndex = o,
(null != s || parseInt(a, 10) >= 0 && parseInt(o, 10) >= 0) && (this.zr.handler.dispatchToElement(u, e, t),
l && this.zr.handler.dispatchToElement(u, "mouseover", t))
}
,
Ja.prototype._dispatchToView = function (e, t) {
for (var r = 0; r < this.views.length; r++)
this.views[r].containPoint(t.offsetX, t.offsetY) && this.views[r].trigger(e, t)
}
,
Object.assign(Ja.prototype, h);
const ao = Ja;
var oo = ["bar3D", "line3D", "map3D", "scatter3D", "surface", "lines3D", "scatterGL", "scatter3D"];
function so(e, t) {
if (e && e[t] && (e[t].normal || e[t].emphasis)) {
var r = e[t].normal
, i = e[t].emphasis;
r && (e[t] = r),
i && (e.emphasis = e.emphasis || {},
e.emphasis[t] = i)
}
}
function lo(e) {
e && (e instanceof Array || (e = [e]),
i.util.each(e, (function (e) {
if (e.axisLabel) {
var t = e.axisLabel;
Object.assign(t, t.textStyle),
t.textStyle = null
}
}
)))
}
function ho(e) {
this._layers = {},
this._zr = e
}
ho.prototype.update = function (e, t) {
var r = this
, n = t.getZr();
if (n.getWidth() && n.getHeight()) {
for (var a in this._layers)
this._layers[a].removeViewsAll();
e.eachComponent((function (r, i) {
if ("series" !== r) {
var n = t.getViewOfComponentModel(i)
, a = i.coordinateSystem;
if (n.__ecgl__) {
if (a) {
if (!a.viewGL)
return void console.error("Can't find viewGL in coordinateSystem of component " + i.id);
l = a.viewGL
} else {
if (!i.viewGL)
return void console.error("Can't find viewGL of component " + i.id);
l = a.viewGL
}
var l = a.viewGL
, h = o(i);
h.addView(l),
n.afterRender && n.afterRender(i, e, t, h),
s(n.groupGL, i.get("silent"))
}
}
}
)),
e.eachSeries((function (r) {
var i = t.getViewOfSeriesModel(r)
, n = r.coordinateSystem;
if (i.__ecgl__) {
if (n && !n.viewGL && !i.viewGL)
return void console.error("Can't find viewGL of series " + i.id);
var a = n && n.viewGL || i.viewGL
, l = o(r);
l.addView(a),
i.afterRender && i.afterRender(r, e, t, l),
s(i.groupGL, r.get("silent"))
}
}
))
} else
console.warn("Dom has no width or height");
function o(e) {
var t;
n.setSleepAfterStill(0),
e.coordinateSystem && e.coordinateSystem.model,
t = e.get("zlevel");
var a = r._layers
, o = a[t];
if (!o) {
if (o = a[t] = new ao("gl-" + t, n),
n.painter.isSingleCanvas()) {
o.virtual = !0;
var s = new i.graphic.Image({
z: 1e4,
style: {
image: o.renderer.canvas
},
silent: !0
});
o.__hostImage = s,
n.add(s)
}
n.painter.insertLayer(t, o)
}
return o.__hostImage && o.__hostImage.setStyle({
width: o.renderer.getWidth(),
height: o.renderer.getHeight()
}),
o
}
function s(e, t) {
e && e.traverse((function (e) {
e.isRenderable && e.isRenderable() && (e.ignorePicking = null != e.$ignorePicking ? e.$ignorePicking : t)
}
))
}
}
,
i.registerPostInit((function (e) {
var t = e.getZr()
, r = t.painter.dispose;
t.painter.dispose = function () {
"function" == typeof this.eachOtherLayer && this.eachOtherLayer((function (e) {
e instanceof ao && e.dispose()
}
)),
r.call(this)
}
,
t.painter.getRenderedCanvas = function (e) {
if (e = e || {},
this._singleCanvas)
return this._layers[0].dom;
var t = document.createElement("canvas")
, r = e.pixelRatio || this.dpr;
t.width = this.getWidth() * r,
t.height = this.getHeight() * r;
var i = t.getContext("2d");
i.dpr = r,
i.clearRect(0, 0, t.width, t.height),
e.backgroundColor && (i.fillStyle = e.backgroundColor,
i.fillRect(0, 0, t.width, t.height));
var n, a = this.storage.getDisplayList(!0), o = {}, s = this;
function l(e, t) {
var r, n = s._zlevelList;
null == e && (e = -1 / 0);
for (var a = 0; a < n.length; a++) {
var o = n[a]
, l = s._layers[o];
if (!l.__builtin__ && o > e && o < t) {
r = l;
break
}
}
r && r.renderToCanvas && (i.save(),
r.renderToCanvas(i),
i.restore())
}
for (var h = {
ctx: i
}, u = 0; u < a.length; u++) {
var c = a[u];
c.zlevel !== n && (l(n, c.zlevel),
n = c.zlevel),
this._doPaintEl(c, h, !0, null, o)
}
return l(n, 1 / 0),
t
}
}
)),
i.registerPostUpdate((function (e, t) {
var r = t.getZr();
(r.__egl = r.__egl || new ho(r)).update(e, t)
}
)),
i.registerPreprocessor((function (e) {
i.util.each(e.series, (function (t) {
i.util.indexOf(oo, t.type) >= 0 && (function (e) {
so(e, "itemStyle"),
so(e, "lineStyle"),
so(e, "areaStyle"),
so(e, "label")
}(t),
"mapbox" === t.coordinateSystem && (t.coordinateSystem = "mapbox3D",
e.mapbox3D = e.mapbox))
}
)),
lo(e.xAxis3D),
lo(e.yAxis3D),
lo(e.zAxis3D),
lo(e.grid3D),
so(e.geo3D)
}
));
const uo = {
defaultOption: {
viewControl: {
projection: "perspective",
autoRotate: !1,
autoRotateDirection: "cw",
autoRotateSpeed: 10,
autoRotateAfterStill: 3,
damping: .8,
rotateSensitivity: 1,
zoomSensitivity: 1,
panSensitivity: 1,
panMouseButton: "middle",
rotateMouseButton: "left",
distance: 150,
minDistance: 40,
maxDistance: 400,
orthographicSize: 150,
maxOrthographicSize: 400,
minOrthographicSize: 20,
center: [0, 0, 0],
alpha: 0,
beta: 0,
minAlpha: -90,
maxAlpha: 90
}
},
setView: function (e) {
e = e || {},
this.option.viewControl = this.option.viewControl || {},
null != e.alpha && (this.option.viewControl.alpha = e.alpha),
null != e.beta && (this.option.viewControl.beta = e.beta),
null != e.distance && (this.option.viewControl.distance = e.distance),
null != e.center && (this.option.viewControl.center = e.center)
}
}
, co = {
defaultOption: {
postEffect: {
enable: !1,
bloom: {
enable: !0,
intensity: .1
},
depthOfField: {
enable: !1,
focalRange: 20,
focalDistance: 50,
blurRadius: 10,
fstop: 2.8,
quality: "medium"
},
screenSpaceAmbientOcclusion: {
enable: !1,
radius: 2,
quality: "medium",
intensity: 1
},
screenSpaceReflection: {
enable: !1,
quality: "medium",
maxRoughness: .8
},
colorCorrection: {
enable: !0,
exposure: 0,
brightness: 0,
contrast: 1,
saturation: 1,
lookupTexture: ""
},
edge: {
enable: !1
},
FXAA: {
enable: !1
}
},
temporalSuperSampling: {
enable: "auto"
}
}
}
, fo = {
defaultOption: {
light: {
main: {
shadow: !1,
shadowQuality: "high",
color: "#fff",
intensity: 1,
alpha: 0,
beta: 0
},
ambient: {
color: "#fff",
intensity: .2
},
ambientCubemap: {
texture: null,
exposure: 1,
diffuseIntensity: .5,
specularIntensity: .5
}
}
}
};
var po = i.ComponentModel.extend({
type: "grid3D",
dependencies: ["xAxis3D", "yAxis3D", "zAxis3D"],
defaultOption: {
show: !0,
zlevel: -10,
left: 0,
top: 0,
width: "100%",
height: "100%",
environment: "auto",
boxWidth: 100,
boxHeight: 100,
boxDepth: 100,
axisPointer: {
show: !0,
lineStyle: {
color: "rgba(0, 0, 0, 0.8)",
width: 1
},
label: {
show: !0,
formatter: null,
margin: 8,
textStyle: {
fontSize: 14,
color: "#fff",
backgroundColor: "rgba(0,0,0,0.5)",
padding: 3,
borderRadius: 3
}
}
},
axisLine: {
show: !0,
lineStyle: {
color: "#333",
width: 2,
type: "solid"
}
},
axisTick: {
show: !0,
inside: !1,
length: 3,
lineStyle: {
width: 1
}
},
axisLabel: {
show: !0,
inside: !1,
rotate: 0,
margin: 8,
textStyle: {
fontSize: 12
}
},
splitLine: {
show: !0,
lineStyle: {
color: ["#ccc"],
width: 1,
type: "solid"
}
},
splitArea: {
show: !1,
areaStyle: {
color: ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
}
},
light: {
main: {
alpha: 30,
beta: 40
},
ambient: {
intensity: .4
}
},
viewControl: {
alpha: 20,
beta: 40,
autoRotate: !1,
distance: 200,
minDistance: 40,
maxDistance: 400
}
}
});
i.util.merge(po.prototype, uo),
i.util.merge(po.prototype, co),
i.util.merge(po.prototype, fo);
const mo = po;
function go(e, t) {
switch (e) {
case "center":
case "middle":
e = "50%";
break;
case "left":
case "top":
e = "0%";
break;
case "right":
case "bottom":
e = "100%"
}
return "string" == typeof e ? (r = e,
r.replace(/^\s+|\s+$/g, "")).match(/%$/) ? parseFloat(e) / 100 * t : parseFloat(e) : null == e ? NaN : +e;
var r
}
function _o() {
var e = "__ec_inner_" + vo++;
return function (t) {
return t[e] || (t[e] = {})
}
}
var vo = Math.round(9 * Math.random())
, yo = {};
function xo(e, t, r, i, n) {
var a = {};
return function (e, t, r, i, n) {
r = r || yo;
var a, o = t.ecModel, s = o && o.option.textStyle, l = function (e) {
for (var t; e && e !== e.ecModel;) {
var r = (e.option || yo).rich;
if (r) {
t = t || {};
for (var i = ba(r), n = 0; n < i.length; n++)
t[i[n]] = 1
}
e = e.parentModel
}
return t
}(t);
if (l)
for (var h in a = {},
l)
if (l.hasOwnProperty(h)) {
var u = t.getModel(["rich", h]);
So(a[h] = {}, u, s, r, i, n, !1, !0)
}
a && (e.rich = a);
var c = t.get("overflow");
c && (e.overflow = c);
var d = t.get("minMargin");
null != d && (e.margin = d),
So(e, t, s, r, i, n, !0, !1)
}(a, e, r, i, n),
t && ga(a, t),
a
}
var bo = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"]
, wo = ["align", "lineHeight", "width", "height", "tag", "verticalAlign"]
, To = ["padding", "borderWidth", "borderRadius", "borderDashOffset", "backgroundColor", "borderColor", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"];
function So(e, t, r, i, n, a, o, s) {
r = !n && r || yo;
var l = i && i.inheritColor
, h = t.getShallow("color")
, u = t.getShallow("textBorderColor")
, c = Ta(t.getShallow("opacity"), r.opacity);
"inherit" !== h && "auto" !== h || (h = l || null),
"inherit" !== u && "auto" !== u || (u = l || null),
a || (h = h || r.color,
u = u || r.textBorderColor),
null != h && (e.fill = h),
null != u && (e.stroke = u);
var d = Ta(t.getShallow("textBorderWidth"), r.textBorderWidth);
null != d && (e.lineWidth = d);
var f = Ta(t.getShallow("textBorderType"), r.textBorderType);
null != f && (e.lineDash = f);
var p = Ta(t.getShallow("textBorderDashOffset"), r.textBorderDashOffset);
null != p && (e.lineDashOffset = p),
n || null != c || s || (c = i && i.defaultOpacity),
null != c && (e.opacity = c),
n || a || null == e.fill && i.inheritColor && (e.fill = i.inheritColor);
for (var m = 0; m < bo.length; m++) {
var g = bo[m];
null != (v = Ta(t.getShallow(g), r[g])) && (e[g] = v)
}
for (m = 0; m < wo.length; m++)
g = wo[m],
null != (v = t.getShallow(g)) && (e[g] = v);
if (null == e.verticalAlign) {
var _ = t.getShallow("baseline");
null != _ && (e.verticalAlign = _)
}
if (!o || !i.disableBox) {
for (m = 0; m < To.length; m++) {
var v;
g = To[m],
null != (v = t.getShallow(g)) && (e[g] = v)
}
var y = t.getShallow("borderType");
null != y && (e.borderDash = y),
"auto" !== e.backgroundColor && "inherit" !== e.backgroundColor || !l || (e.backgroundColor = l),
"auto" !== e.borderColor && "inherit" !== e.borderColor || !l || (e.borderColor = l)
}
}
_o();
var Mo = Mn
, Ao = {
left: 0,
middle: 1,
right: 2
};
function Eo(e) {
return e instanceof Array || (e = [e, e]),
e
}
var Co = m.extend((function () {
return {
zr: null,
viewGL: null,
_center: new vt,
minDistance: .5,
maxDistance: 1.5,
maxOrthographicSize: 300,
minOrthographicSize: 30,
minAlpha: -90,
maxAlpha: 90,
minBeta: -1 / 0,
maxBeta: 1 / 0,
autoRotateAfterStill: 0,
autoRotateDirection: "cw",
autoRotateSpeed: 60,
damping: .8,
rotateSensitivity: 1,
zoomSensitivity: 1,
panSensitivity: 1,
panMouseButton: "middle",
rotateMouseButton: "left",
_mode: "rotate",
_camera: null,
_needsUpdate: !1,
_rotating: !1,
_phi: 0,
_theta: 0,
_mouseX: 0,
_mouseY: 0,
_rotateVelocity: new _e,
_panVelocity: new _e,
_distance: 500,
_zoomSpeed: 0,
_stillTimeout: 0,
_animators: []
}
}
), (function () {
["_mouseDownHandler", "_mouseWheelHandler", "_mouseMoveHandler", "_mouseUpHandler", "_pinchHandler", "_contextMenuHandler", "_update"].forEach((function (e) {
this[e] = this[e].bind(this)
}
), this)
}
), {
init: function () {
var e = this.zr;
e && (e.on("mousedown", this._mouseDownHandler),
e.on("globalout", this._mouseUpHandler),
e.on("mousewheel", this._mouseWheelHandler),
e.on("pinch", this._pinchHandler),
e.animation.on("frame", this._update),
e.dom.addEventListener("contextmenu", this._contextMenuHandler))
},
dispose: function () {
var e = this.zr;
e && (e.off("mousedown", this._mouseDownHandler),
e.off("mousemove", this._mouseMoveHandler),
e.off("mouseup", this._mouseUpHandler),
e.off("mousewheel", this._mouseWheelHandler),
e.off("pinch", this._pinchHandler),
e.off("globalout", this._mouseUpHandler),
e.dom.removeEventListener("contextmenu", this._contextMenuHandler),
e.animation.off("frame", this._update)),
this.stopAllAnimation()
},
getDistance: function () {
return this._distance
},
setDistance: function (e) {
this._distance = e,
this._needsUpdate = !0
},
getOrthographicSize: function () {
return this._orthoSize
},
setOrthographicSize: function (e) {
this._orthoSize = e,
this._needsUpdate = !0
},
getAlpha: function () {
return this._theta / Math.PI * 180
},
getBeta: function () {
return -this._phi / Math.PI * 180
},
getCenter: function () {
return this._center.toArray()
},
setAlpha: function (e) {
e = Math.max(Math.min(this.maxAlpha, e), this.minAlpha),
this._theta = e / 180 * Math.PI,
this._needsUpdate = !0
},
setBeta: function (e) {
e = Math.max(Math.min(this.maxBeta, e), this.minBeta),
this._phi = -e / 180 * Math.PI,
this._needsUpdate = !0
},
setCenter: function (e) {
this._center.setArray(e)
},
setViewGL: function (e) {
this.viewGL = e
},
getCamera: function () {
return this.viewGL.camera
},
setFromViewControlModel: function (e, t) {
var r = (t = t || {}).baseDistance || 0
, i = t.baseOrthoSize || 1
, n = e.get("projection");
"perspective" !== n && "orthographic" !== n && "isometric" !== n && (n = "perspective"),
this._projection = n,
this.viewGL.setProjection(n);
var a = e.get("distance") + r
, o = e.get("orthographicSize") + i;
[["damping", .8], ["autoRotate", !1], ["autoRotateAfterStill", 3], ["autoRotateDirection", "cw"], ["autoRotateSpeed", 10], ["minDistance", 30], ["maxDistance", 400], ["minOrthographicSize", 30], ["maxOrthographicSize", 300], ["minAlpha", -90], ["maxAlpha", 90], ["minBeta", -1 / 0], ["maxBeta", 1 / 0], ["rotateSensitivity", 1], ["zoomSensitivity", 1], ["panSensitivity", 1], ["panMouseButton", "left"], ["rotateMouseButton", "middle"]].forEach((function (t) {
this[t[0]] = Mo(e.get(t[0]), t[1])
}
), this),
this.minDistance += r,
this.maxDistance += r,
this.minOrthographicSize += i,
this.maxOrthographicSize += i;
var s = e.ecModel
, l = {};
["animation", "animationDurationUpdate", "animationEasingUpdate"].forEach((function (t) {
l[t] = Mo(e.get(t), s && s.get(t))
}
));
var h = Mo(t.alpha, e.get("alpha")) || 0
, u = Mo(t.beta, e.get("beta")) || 0
, c = Mo(t.center, e.get("center")) || [0, 0, 0];
l.animation && l.animationDurationUpdate > 0 && this._notFirst ? this.animateTo({
alpha: h,
beta: u,
center: c,
distance: a,
orthographicSize: o,
easing: l.animationEasingUpdate,
duration: l.animationDurationUpdate
}) : (this.setDistance(a),
this.setAlpha(h),
this.setBeta(u),
this.setCenter(c),
this.setOrthographicSize(o)),
this._notFirst = !0,
this._validateProperties()
},
_validateProperties: function () { },
animateTo: function (e) {
var t = this.zr
, r = this
, i = {}
, n = {};
return null != e.distance && (i.distance = this.getDistance(),
n.distance = e.distance),
null != e.orthographicSize && (i.orthographicSize = this.getOrthographicSize(),
n.orthographicSize = e.orthographicSize),
null != e.alpha && (i.alpha = this.getAlpha(),
n.alpha = e.alpha),
null != e.beta && (i.beta = this.getBeta(),
n.beta = e.beta),
null != e.center && (i.center = this.getCenter(),
n.center = e.center),
this._addAnimator(t.animation.animate(i).when(e.duration || 1e3, n).during((function () {
null != i.alpha && r.setAlpha(i.alpha),
null != i.beta && r.setBeta(i.beta),
null != i.distance && r.setDistance(i.distance),
null != i.center && r.setCenter(i.center),
null != i.orthographicSize && r.setOrthographicSize(i.orthographicSize),
r._needsUpdate = !0
}
))).start(e.easing || "linear")
},
stopAllAnimation: function () {
for (var e = 0; e < this._animators.length; e++)
this._animators[e].stop();
this._animators.length = 0
},
update: function () {
this._needsUpdate = !0,
this._update(20)
},
_isAnimating: function () {
return this._animators.length > 0
},
_update: function (e) {
if (this._rotating) {
var t = ("cw" === this.autoRotateDirection ? 1 : -1) * this.autoRotateSpeed / 180 * Math.PI;
this._phi -= t * e / 1e3,
this._needsUpdate = !0
} else
this._rotateVelocity.len() > 0 && (this._needsUpdate = !0);
(Math.abs(this._zoomSpeed) > .1 || this._panVelocity.len() > 0) && (this._needsUpdate = !0),
this._needsUpdate && (e = Math.min(e, 50),
this._updateDistanceOrSize(e),
this._updatePan(e),
this._updateRotate(e),
this._updateTransform(),
this.getCamera().update(),
this.zr && this.zr.refresh(),
this.trigger("update"),
this._needsUpdate = !1)
},
_updateRotate: function (e) {
var t = this._rotateVelocity;
this._phi = t.y * e / 20 + this._phi,
this._theta = t.x * e / 20 + this._theta,
this.setAlpha(this.getAlpha()),
this.setBeta(this.getBeta()),
this._vectorDamping(t, Math.pow(this.damping, e / 16))
},
_updateDistanceOrSize: function (e) {
"perspective" === this._projection ? this._setDistance(this._distance + this._zoomSpeed * e / 20) : this._setOrthoSize(this._orthoSize + this._zoomSpeed * e / 20),
this._zoomSpeed *= Math.pow(this.damping, e / 16)
},
_setDistance: function (e) {
this._distance = Math.max(Math.min(e, this.maxDistance), this.minDistance)
},
_setOrthoSize: function (e) {
this._orthoSize = Math.max(Math.min(e, this.maxOrthographicSize), this.minOrthographicSize);
var t = this.getCamera()
, r = this._orthoSize
, i = r / this.viewGL.viewport.height * this.viewGL.viewport.width;
t.left = -i / 2,
t.right = i / 2,
t.top = r / 2,
t.bottom = -r / 2
},
_updatePan: function (e) {
var t = this._panVelocity
, r = this._distance
, i = this.getCamera()
, n = i.worldTransform.y
, a = i.worldTransform.x;
this._center.scaleAndAdd(a, -t.x * r / 200).scaleAndAdd(n, -t.y * r / 200),
this._vectorDamping(t, 0)
},
_updateTransform: function () {
var e = this.getCamera()
, t = new vt
, r = this._theta + Math.PI / 2
, i = this._phi + Math.PI / 2
, n = Math.sin(r);
t.x = n * Math.cos(i),
t.y = -Math.cos(r),
t.z = n * Math.sin(i),
e.position.copy(this._center).scaleAndAdd(t, this._distance),
e.rotation.identity().rotateY(-this._phi).rotateX(-this._theta)
},
_startCountingStill: function () {
clearTimeout(this._stillTimeout);
var e = this.autoRotateAfterStill
, t = this;
!isNaN(e) && e > 0 && (this._stillTimeout = setTimeout((function () {
t._rotating = !0
}
), 1e3 * e))
},
_vectorDamping: function (e, t) {
var r = e.len();
(r *= t) < 1e-4 && (r = 0),
e.normalize().scale(r)
},
_decomposeTransform: function () {
if (this.getCamera()) {
this.getCamera().updateWorldTransform();
var e = this.getCamera().worldTransform.z
, t = Math.asin(e.y)
, r = Math.atan2(e.x, e.z);
this._theta = t,
this._phi = -r,
this.setBeta(this.getBeta()),
this.setAlpha(this.getAlpha()),
this.getCamera().aspect ? this._setDistance(this.getCamera().position.dist(this._center)) : this._setOrthoSize(this.getCamera().top - this.getCamera().bottom)
}
},
_mouseDownHandler: function (e) {
if (!e.target && !this._isAnimating()) {
var t = e.offsetX
, r = e.offsetY;
this.viewGL && !this.viewGL.containPoint(t, r) || (this.zr.on("mousemove", this._mouseMoveHandler),
this.zr.on("mouseup", this._mouseUpHandler),
e.event.targetTouches ? 1 === e.event.targetTouches.length && (this._mode = "rotate") : e.event.button === Ao[this.rotateMouseButton] ? this._mode = "rotate" : e.event.button === Ao[this.panMouseButton] ? this._mode = "pan" : this._mode = "",
this._rotateVelocity.set(0, 0),
this._rotating = !1,
this.autoRotate && this._startCountingStill(),
this._mouseX = e.offsetX,
this._mouseY = e.offsetY)
}
},
_mouseMoveHandler: function (e) {
if (!(e.target && e.target.__isGLToZRProxy || this._isAnimating())) {
var t = Eo(this.panSensitivity)
, r = Eo(this.rotateSensitivity);
"rotate" === this._mode ? (this._rotateVelocity.y = (e.offsetX - this._mouseX) / this.zr.getHeight() * 2 * r[0],
this._rotateVelocity.x = (e.offsetY - this._mouseY) / this.zr.getWidth() * 2 * r[1]) : "pan" === this._mode && (this._panVelocity.x = (e.offsetX - this._mouseX) / this.zr.getWidth() * t[0] * 400,
this._panVelocity.y = (-e.offsetY + this._mouseY) / this.zr.getHeight() * t[1] * 400),
this._mouseX = e.offsetX,
this._mouseY = e.offsetY,
e.event.preventDefault()
}
},
_mouseWheelHandler: function (e) {
if (!this._isAnimating()) {
var t = e.event.wheelDelta || -e.event.detail;
this._zoomHandler(e, t)
}
},
_pinchHandler: function (e) {
this._isAnimating() || (this._zoomHandler(e, e.pinchScale > 1 ? 1 : -1),
this._mode = "")
},
_zoomHandler: function (e, t) {
if (0 !== t) {
var r, i = e.offsetX, n = e.offsetY;
this.viewGL && !this.viewGL.containPoint(i, n) || (r = "perspective" === this._projection ? Math.max(Math.max(Math.min(this._distance - this.minDistance, this.maxDistance - this._distance)) / 20, .5) : Math.max(Math.max(Math.min(this._orthoSize - this.minOrthographicSize, this.maxOrthographicSize - this._orthoSize)) / 20, .5),
this._zoomSpeed = (t > 0 ? -1 : 1) * r * this.zoomSensitivity,
this._rotating = !1,
this.autoRotate && "rotate" === this._mode && this._startCountingStill(),
e.event.preventDefault())
}
},
_mouseUpHandler: function () {
this.zr.off("mousemove", this._mouseMoveHandler),
this.zr.off("mouseup", this._mouseUpHandler)
},
_isRightMouseButtonUsed: function () {
return "right" === this.rotateMouseButton || "right" === this.panMouseButton
},
_contextMenuHandler: function (e) {
this._isRightMouseButtonUsed() && e.preventDefault()
},
_addAnimator: function (e) {
var t = this._animators;
return t.push(e),
e.done((function () {
var r = t.indexOf(e);
r >= 0 && t.splice(r, 1)
}
)),
e
}
});
Object.defineProperty(Co.prototype, "autoRotate", {
get: function (e) {
return this._autoRotate
},
set: function (e) {
this._autoRotate = e,
this._rotating = e
}
});
const Do = Co
, Lo = {
convertToDynamicArray: function (e) {
e && this.resetOffset();
var t = this.attributes;
for (var r in t)
e || !t[r].value ? t[r].value = [] : t[r].value = Array.prototype.slice.call(t[r].value);
e || !this.indices ? this.indices = [] : this.indices = Array.prototype.slice.call(this.indices)
},
convertToTypedArray: function () {
var e = this.attributes;
for (var t in e)
e[t].value && e[t].value.length > 0 ? e[t].value = new Float32Array(e[t].value) : e[t].value = null;
this.indices && this.indices.length > 0 && (this.indices = this.vertexCount > 65535 ? new Uint32Array(this.indices) : new Uint16Array(this.indices)),
this.dirty()
}
}
, Po = {
vec2: pe,
vec3: Qe,
vec4: Et,
mat2: Fn,
mat2d: kn,
mat3: Dt,
mat4: Ye,
quat: Rt
};
var Oo = Po.vec3
, No = [[0, 0], [1, 1]]
, Io = Vr.extend((function () {
return {
segmentScale: 1,
dynamic: !0,
useNativeLine: !0,
attributes: {
position: new Vr.Attribute("position", "float", 3, "POSITION"),
positionPrev: new Vr.Attribute("positionPrev", "float", 3),
positionNext: new Vr.Attribute("positionNext", "float", 3),
prevPositionPrev: new Vr.Attribute("prevPositionPrev", "float", 3),
prevPosition: new Vr.Attribute("prevPosition", "float", 3),
prevPositionNext: new Vr.Attribute("prevPositionNext", "float", 3),
offset: new Vr.Attribute("offset", "float", 1),
color: new Vr.Attribute("color", "float", 4, "COLOR")
}
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._triangleOffset = 0,
this._itemVertexOffsets = []
},
setVertexCount: function (e) {
var t = this.attributes;
this.vertexCount !== e && (t.position.init(e),
t.color.init(e),
this.useNativeLine || (t.positionPrev.init(e),
t.positionNext.init(e),
t.offset.init(e)),
e > 65535 ? this.indices instanceof Uint16Array && (this.indices = new Uint32Array(this.indices)) : this.indices instanceof Uint32Array && (this.indices = new Uint16Array(this.indices)))
},
setTriangleCount: function (e) {
this.triangleCount !== e && (this.indices = 0 === e ? null : this.vertexCount > 65535 ? new Uint32Array(3 * e) : new Uint16Array(3 * e))
},
_getCubicCurveApproxStep: function (e, t, r, i) {
return 1 / (Oo.dist(e, t) + Oo.dist(r, t) + Oo.dist(i, r) + 1) * this.segmentScale
},
getCubicCurveVertexCount: function (e, t, r, i) {
var n = this._getCubicCurveApproxStep(e, t, r, i)
, a = Math.ceil(1 / n);
return this.useNativeLine ? 2 * a : 2 * a + 2
},
getCubicCurveTriangleCount: function (e, t, r, i) {
var n = this._getCubicCurveApproxStep(e, t, r, i)
, a = Math.ceil(1 / n);
return this.useNativeLine ? 0 : 2 * a
},
getLineVertexCount: function () {
return this.getPolylineVertexCount(No)
},
getLineTriangleCount: function () {
return this.getPolylineTriangleCount(No)
},
getPolylineVertexCount: function (e) {
var t;
return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 3,
this.useNativeLine ? 2 * (t - 1) : 2 * (t - 1) + 2
},
getPolylineTriangleCount: function (e) {
var t;
return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 3,
this.useNativeLine ? 0 : 2 * Math.max(t - 1, 0)
},
addCubicCurve: function (e, t, r, i, n, a) {
null == a && (a = 1);
var o = e[0]
, s = e[1]
, l = e[2]
, h = t[0]
, u = t[1]
, c = t[2]
, d = r[0]
, f = r[1]
, p = r[2]
, m = i[0]
, g = i[1]
, _ = i[2]
, v = this._getCubicCurveApproxStep(e, t, r, i)
, y = v * v
, x = y * v
, b = 3 * v
, w = 3 * y
, T = 6 * y
, S = 6 * x
, M = o - 2 * h + d
, A = s - 2 * u + f
, E = l - 2 * c + p
, C = 3 * (h - d) - o + m
, D = 3 * (u - f) - s + g
, L = 3 * (c - p) - l + _
, P = o
, O = s
, N = l
, I = (h - o) * b + M * w + C * x
, R = (u - s) * b + A * w + D * x
, B = (c - l) * b + E * w + L * x
, F = M * T + C * S
, z = A * T + D * S
, G = E * T + L * S
, U = C * S
, k = D * S
, V = L * S
, H = 0
, W = 0
, j = Math.ceil(1 / v)
, X = new Float32Array(3 * (j + 1))
, q = (X = [],
0);
for (W = 0; W < j + 1; W++)
X[q++] = P,
X[q++] = O,
X[q++] = N,
P += I,
O += R,
N += B,
I += F,
R += z,
B += G,
F += U,
z += k,
G += V,
(H += v) > 1 && (P = I > 0 ? Math.min(P, m) : Math.max(P, m),
O = R > 0 ? Math.min(O, g) : Math.max(O, g),
N = B > 0 ? Math.min(N, _) : Math.max(N, _));
return this.addPolyline(X, n, a)
},
addLine: function (e, t, r, i) {
return this.addPolyline([e, t], r, i)
},
addPolyline: function (e, t, r, i, n) {
if (e.length) {
var a = "number" != typeof e[0];
if (null == n && (n = a ? e.length : e.length / 3),
!(n < 2)) {
null == i && (i = 0),
null == r && (r = 1),
this._itemVertexOffsets.push(this._vertexOffset);
var o, s, l = (a = "number" != typeof e[0]) ? "number" != typeof t[0] : t.length / 4 === n, h = this.attributes.position, u = this.attributes.positionPrev, c = this.attributes.positionNext, d = this.attributes.color, f = this.attributes.offset, p = this.indices, m = this._vertexOffset;
r = Math.max(r, .01);
for (var g = i; g < n; g++) {
if (a)
o = e[g],
s = l ? t[g] : t;
else {
var _ = 3 * g;
if ((o = o || [])[0] = e[_],
o[1] = e[_ + 1],
o[2] = e[_ + 2],
l) {
var v = 4 * g;
(s = s || [])[0] = t[v],
s[1] = t[v + 1],
s[2] = t[v + 2],
s[3] = t[v + 3]
} else
s = t
}
if (this.useNativeLine ? g > 1 && (h.copy(m, m - 1),
d.copy(m, m - 1),
m++) : (g < n - 1 && (u.set(m + 2, o),
u.set(m + 3, o)),
g > 0 && (c.set(m - 2, o),
c.set(m - 1, o)),
h.set(m, o),
h.set(m + 1, o),
d.set(m, s),
d.set(m + 1, s),
f.set(m, r / 2),
f.set(m + 1, -r / 2),
m += 2),
this.useNativeLine)
d.set(m, s),
h.set(m, o),
m++;
else if (g > 0) {
var y = 3 * this._triangleOffset;
(p = this.indices)[y] = m - 4,
p[y + 1] = m - 3,
p[y + 2] = m - 2,
p[y + 3] = m - 3,
p[y + 4] = m - 1,
p[y + 5] = m - 2,
this._triangleOffset += 2
}
}
if (!this.useNativeLine) {
var x = this._vertexOffset
, b = this._vertexOffset + 2 * n;
u.copy(x, x + 2),
u.copy(x + 1, x + 3),
c.copy(b - 1, b - 3),
c.copy(b - 2, b - 4)
}
return this._vertexOffset = m,
this._vertexOffset
}
}
},
setItemColor: function (e, t) {
for (var r = this._itemVertexOffsets[e], i = e < this._itemVertexOffsets.length - 1 ? this._itemVertexOffsets[e + 1] : this._vertexOffset, n = r; n < i; n++)
this.attributes.color.set(n, t);
this.dirty("color")
},
currentTriangleOffset: function () {
return this._triangleOffset
},
currentVertexOffset: function () {
return this._vertexOffset
}
});
i.util.defaults(Io.prototype, Lo);
const Ro = Io;
function Bo(e, t, r, i, n, a, o) {
this._zr = e,
this._x = 0,
this._y = 0,
this._rowHeight = 0,
this.width = i,
this.height = n,
this.offsetX = t,
this.offsetY = r,
this.dpr = o,
this.gap = a
}
function Fo(e) {
(e = e || {}).width = e.width || 512,
e.height = e.height || 512,
e.devicePixelRatio = e.devicePixelRatio || 1,
e.gap = null == e.gap ? 2 : e.gap;
var t = document.createElement("canvas");
t.width = e.width * e.devicePixelRatio,
t.height = e.height * e.devicePixelRatio,
this._canvas = t,
this._texture = new Dr({
image: t,
flipY: !1
});
var r = this;
this._zr = i.zrender.init(t);
var n = this._zr.refreshImmediately;
this._zr.refreshImmediately = function () {
n.call(this),
r._texture.dirty(),
r.onupdate && r.onupdate()
}
,
this._dpr = e.devicePixelRatio,
this._coords = {},
this.onupdate = e.onupdate,
this._gap = e.gap,
this._textureAtlasNodes = [new Bo(this._zr, 0, 0, e.width, e.height, this._gap, this._dpr)],
this._nodeWidth = e.width,
this._nodeHeight = e.height,
this._currentNodeIdx = 0
}
Bo.prototype = {
constructor: Bo,
clear: function () {
this._x = 0,
this._y = 0,
this._rowHeight = 0
},
add: function (e, t, r) {
var i = e.getBoundingRect();
null == t && (t = i.width),
null == r && (r = i.height),
t *= this.dpr,
r *= this.dpr,
this._fitElement(e, t, r);
var n = this._x
, a = this._y
, o = this.width * this.dpr
, s = this.height * this.dpr
, l = this.gap;
if (n + t + l > o && (n = this._x = 0,
a += this._rowHeight + l,
this._y = a,
this._rowHeight = 0),
this._x += t + l,
this._rowHeight = Math.max(this._rowHeight, r),
a + r + l > s)
return null;
e.x += this.offsetX * this.dpr + n,
e.y += this.offsetY * this.dpr + a,
this._zr.add(e);
var h = [this.offsetX / this.width, this.offsetY / this.height];
return [[n / o + h[0], a / s + h[1]], [(n + t) / o + h[0], (a + r) / s + h[1]]]
},
_fitElement: function (e, t, r) {
var i = e.getBoundingRect()
, n = t / i.width
, a = r / i.height;
e.x = -i.x * n,
e.y = -i.y * a,
e.scaleX = n,
e.scaleY = a,
e.update()
}
},
Fo.prototype = {
clear: function () {
for (var e = 0; e < this._textureAtlasNodes.length; e++)
this._textureAtlasNodes[e].clear();
this._currentNodeIdx = 0,
this._zr.clear(),
this._coords = {}
},
getWidth: function () {
return this._width
},
getHeight: function () {
return this._height
},
getTexture: function () {
return this._texture
},
getDevicePixelRatio: function () {
return this._dpr
},
getZr: function () {
return this._zr
},
_getCurrentNode: function () {
return this._textureAtlasNodes[this._currentNodeIdx]
},
_expand: function () {
if (this._currentNodeIdx++,
this._textureAtlasNodes[this._currentNodeIdx])
return this._textureAtlasNodes[this._currentNodeIdx];
var e = 4096 / this._dpr
, t = this._textureAtlasNodes.length
, r = t * this._nodeWidth % e
, i = Math.floor(t * this._nodeWidth / e) * this._nodeHeight;
if (!(i >= e)) {
var n = (r + this._nodeWidth) * this._dpr
, a = (i + this._nodeHeight) * this._dpr;
try {
this._zr.resize({
width: n,
height: a
})
} catch (e) {
this._canvas.width = n,
this._canvas.height = a
}
var o = new Bo(this._zr, r, i, this._nodeWidth, this._nodeHeight, this._gap, this._dpr);
return this._textureAtlasNodes.push(o),
o
}
},
add: function (e, t, r) {
if (this._coords[e.id])
return this._coords[e.id];
var i = this._getCurrentNode().add(e, t, r);
if (!i) {
var n = this._expand();
if (!n)
return;
i = n.add(e, t, r)
}
return this._coords[e.id] = i,
i
},
getCoordsScale: function () {
var e = this._dpr;
return [this._nodeWidth / this._canvas.width * e, this._nodeHeight / this._canvas.height * e]
},
getCoords: function (e) {
return this._coords[e]
},
dispose: function () {
this._zr.dispose()
}
};
const zo = Fo;
function Go() { }
Go.prototype = {
constructor: Go,
setScene: function (e) {
this._scene = e,
this._skybox && this._skybox.attachScene(this._scene)
},
initLight: function (e) {
this._lightRoot = e,
this.mainLight = new Ka.DirectionalLight({
shadowBias: .005
}),
this.ambientLight = new Ka.AmbientLight,
e.add(this.mainLight),
e.add(this.ambientLight)
},
dispose: function () {
this._lightRoot && (this._lightRoot.remove(this.mainLight),
this._lightRoot.remove(this.ambientLight))
},
updateLight: function (e) {
var t = this.mainLight
, r = this.ambientLight
, i = e.getModel("light")
, n = i.getModel("main")
, a = i.getModel("ambient");
t.intensity = n.get("intensity"),
r.intensity = a.get("intensity"),
t.color = Ka.parseColor(n.get("color")).slice(0, 3),
r.color = Ka.parseColor(a.get("color")).slice(0, 3);
var o = n.get("alpha") || 0
, s = n.get("beta") || 0;
t.position.setArray(Ka.directionFromAlphaBeta(o, s)),
t.lookAt(Ka.Vector3.ZERO),
t.castShadow = n.get("shadow"),
t.shadowResolution = Ka.getShadowResolution(n.get("shadowQuality"))
},
updateAmbientCubemap: function (e, t, r) {
var i = t.getModel("light.ambientCubemap")
, n = i.get("texture");
if (n) {
this._cubemapLightsCache = this._cubemapLightsCache || {};
var a = this._cubemapLightsCache[n];
if (!a) {
var o = this;
a = this._cubemapLightsCache[n] = Ka.createAmbientCubemap(i.option, e, r, (function () {
o._isSkyboxFromAmbientCubemap && o._skybox.setEnvironmentMap(a.specular.cubemap),
r.getZr().refresh()
}
))
}
this._lightRoot.add(a.diffuse),
this._lightRoot.add(a.specular),
this._currentCubemapLights = a
} else
this._currentCubemapLights && (this._lightRoot.remove(this._currentCubemapLights.diffuse),
this._lightRoot.remove(this._currentCubemapLights.specular),
this._currentCubemapLights = null)
},
updateSkybox: function (e, t, r) {
var n = t.get("environment")
, a = this
, o = (a._skybox = a._skybox || new ji,
a._skybox);
if (n && "none" !== n)
if ("auto" === n)
if (this._isSkyboxFromAmbientCubemap = !0,
this._currentCubemapLights) {
var s = this._currentCubemapLights.specular.cubemap;
o.setEnvironmentMap(s),
this._scene && o.attachScene(this._scene),
o.material.set("lod", 3)
} else
this._skybox && this._skybox.detachScene();
else if ("object" == typeof n && n.colorStops || "string" == typeof n && i.color.parse(n)) {
this._isSkyboxFromAmbientCubemap = !1;
var l = new Ka.Texture2D({
anisotropic: 8,
flipY: !1
});
o.setEnvironmentMap(l);
var h = l.image = document.createElement("canvas");
h.width = h.height = 16;
var u = h.getContext("2d")
, c = new i.graphic.Rect({
shape: {
x: 0,
y: 0,
width: 16,
height: 16
},
style: {
fill: n
}
});
i.innerDrawElementOnCanvas(u, c),
o.attachScene(this._scene)
} else
this._isSkyboxFromAmbientCubemap = !1,
l = Ka.loadTexture(n, r, {
anisotropic: 8,
flipY: !1
}),
o.setEnvironmentMap(l),
o.attachScene(this._scene);
else
this._skybox && this._skybox.detachScene(this._scene),
this._skybox = null;
var d = t.coordinateSystem;
if (this._skybox)
if (!d || !d.viewGL || "auto" === n || n.match && n.match(/.hdr$/))
this._skybox.material.undefine("fragment", "SRGB_DECODE");
else {
var f = d.viewGL.isLinearSpace() ? "define" : "undefine";
this._skybox.material[f]("fragment", "SRGB_DECODE")
}
}
};
const Uo = Go;
var ko = Po.vec3
, Vo = Vr.extend((function () {
return {
segmentScale: 1,
useNativeLine: !0,
attributes: {
position: new Vr.Attribute("position", "float", 3, "POSITION"),
normal: new Vr.Attribute("normal", "float", 3, "NORMAL"),
color: new Vr.Attribute("color", "float", 4, "COLOR")
}
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._faceOffset = 0
},
setQuadCount: function (e) {
var t = this.attributes
, r = this.getQuadVertexCount() * e
, i = this.getQuadTriangleCount() * e;
this.vertexCount !== r && (t.position.init(r),
t.normal.init(r),
t.color.init(r)),
this.triangleCount !== i && (this.indices = r > 65535 ? new Uint32Array(3 * i) : new Uint16Array(3 * i))
},
getQuadVertexCount: function () {
return 4
},
getQuadTriangleCount: function () {
return 2
},
addQuad: function () {
var e = ko.create()
, t = ko.create()
, r = ko.create()
, i = [0, 3, 1, 3, 2, 1];
return function (n, a) {
var o = this.attributes.position
, s = this.attributes.normal
, l = this.attributes.color;
ko.sub(e, n[1], n[0]),
ko.sub(t, n[2], n[1]),
ko.cross(r, e, t),
ko.normalize(r, r);
for (var h = 0; h < 4; h++)
o.set(this._vertexOffset + h, n[h]),
l.set(this._vertexOffset + h, a),
s.set(this._vertexOffset + h, r);
var u = 3 * this._faceOffset;
for (h = 0; h < 6; h++)
this.indices[u + h] = i[h] + this._vertexOffset;
this._vertexOffset += 4,
this._faceOffset += 2
}
}()
});
i.util.defaults(Vo.prototype, Lo);
const Ho = Vo;
var Wo = Mn
, jo = {
x: 0,
y: 2,
z: 1
};
function Xo(e, t, r) {
this.rootNode = new Ka.Node;
var i = new Ka.Mesh({
geometry: new Ro({
useNativeLine: !1
}),
material: t,
castShadow: !1,
ignorePicking: !0,
$ignorePicking: !0,
renderOrder: 1
})
, n = new Ka.Mesh({
geometry: new Ho,
material: r,
castShadow: !1,
culling: !1,
ignorePicking: !0,
$ignorePicking: !0,
renderOrder: 0
});
this.rootNode.add(n),
this.rootNode.add(i),
this.faceInfo = e,
this.plane = new Ka.Plane,
this.linesMesh = i,
this.quadsMesh = n
}
Xo.prototype.update = function (e, t, r) {
var i = e.coordinateSystem
, n = [i.getAxis(this.faceInfo[0]), i.getAxis(this.faceInfo[1])]
, a = this.linesMesh.geometry
, o = this.quadsMesh.geometry;
a.convertToDynamicArray(!0),
o.convertToDynamicArray(!0),
this._updateSplitLines(a, n, e, r),
this._udpateSplitAreas(o, n, e, r),
a.convertToTypedArray(),
o.convertToTypedArray();
var s = i.getAxis(this.faceInfo[2]);
!function (e, t, r, i) {
var n = [0, 0, 0]
, a = i < 0 ? r.getExtentMin() : r.getExtentMax();
n[jo[r.dim]] = a,
e.position.setArray(n),
e.rotation.identity(),
t.distance = -Math.abs(a),
t.normal.set(0, 0, 0),
"x" === r.dim ? (e.rotation.rotateY(i * Math.PI / 2),
t.normal.x = -i) : "z" === r.dim ? (e.rotation.rotateX(-i * Math.PI / 2),
t.normal.y = -i) : (i > 0 && e.rotation.rotateY(Math.PI),
t.normal.z = -i)
}(this.rootNode, this.plane, s, this.faceInfo[3])
}
,
Xo.prototype._updateSplitLines = function (e, t, r, n) {
var a = n.getDevicePixelRatio();
t.forEach((function (n, o) {
var s = n.model
, l = t[1 - o].getExtent();
if (!n.scale.isBlank()) {
var h = s.getModel("splitLine", r.getModel("splitLine"));
if (h.get("show")) {
var u = h.getModel("lineStyle")
, c = u.get("color")
, d = Wo(u.get("opacity"), 1)
, f = Wo(u.get("width"), 1);
c = i.util.isArray(c) ? c : [c];
for (var p = n.getTicksCoords({
tickModel: h
}), m = 0, g = 0; g < p.length; g++) {
var _ = p[g].coord
, v = Ka.parseColor(c[m % c.length]);
v[3] *= d;
var y = [0, 0, 0]
, x = [0, 0, 0];
y[o] = x[o] = _,
y[1 - o] = l[0],
x[1 - o] = l[1],
e.addLine(y, x, v, f * a),
m++
}
}
}
}
))
}
,
Xo.prototype._udpateSplitAreas = function (e, t, r, n) {
t.forEach((function (n, a) {
var o = n.model
, s = t[1 - a].getExtent();
if (!n.scale.isBlank()) {
var l = o.getModel("splitArea", r.getModel("splitArea"));
if (l.get("show")) {
var h = l.getModel("areaStyle")
, u = h.get("color")
, c = Wo(h.get("opacity"), 1);
u = i.util.isArray(u) ? u : [u];
for (var d = n.getTicksCoords({
tickModel: l,
clamp: !0
}), f = 0, p = [0, 0, 0], m = [0, 0, 0], g = 0; g < d.length; g++) {
var _ = d[g].coord
, v = [0, 0, 0]
, y = [0, 0, 0];
if (v[a] = y[a] = _,
v[1 - a] = s[0],
y[1 - a] = s[1],
0 !== g) {
var x = Ka.parseColor(u[f % u.length]);
x[3] *= c,
e.addQuad([p, v, y, m], x),
p = v,
m = y,
f++
} else
p = v,
m = y
}
}
}
}
))
}
;
const qo = Xo;
var Zo = [0, 1, 2, 0, 2, 3]
, Yo = Vr.extend((function () {
return {
attributes: {
position: new Vr.Attribute("position", "float", 3, "POSITION"),
texcoord: new Vr.Attribute("texcoord", "float", 2, "TEXCOORD_0"),
offset: new Vr.Attribute("offset", "float", 2),
color: new Vr.Attribute("color", "float", 4, "COLOR")
}
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._faceOffset = 0
},
setSpriteCount: function (e) {
this._spriteCount = e;
var t = 4 * e
, r = 2 * e;
this.vertexCount !== t && (this.attributes.position.init(t),
this.attributes.offset.init(t),
this.attributes.color.init(t)),
this.triangleCount !== r && (this.indices = t > 65535 ? new Uint32Array(3 * r) : new Uint16Array(3 * r))
},
setSpriteAlign: function (e, t, r, i, n) {
var a, o, s, l;
switch (null == r && (r = "left"),
null == i && (i = "top"),
n = n || 0,
r) {
case "left":
a = n,
s = t[0] + n;
break;
case "center":
case "middle":
a = -t[0] / 2,
s = t[0] / 2;
break;
case "right":
a = -t[0] - n,
s = -n
}
switch (i) {
case "bottom":
o = n,
l = t[1] + n;
break;
case "middle":
o = -t[1] / 2,
l = t[1] / 2;
break;
case "top":
o = -t[1] - n,
l = -n
}
var h = 4 * e
, u = this.attributes.offset;
u.set(h, [a, l]),
u.set(h + 1, [s, l]),
u.set(h + 2, [s, o]),
u.set(h + 3, [a, o])
},
addSprite: function (e, t, r, i, n, a) {
var o = this._vertexOffset;
this.setSprite(this._vertexOffset / 4, e, t, r, i, n, a);
for (var s = 0; s < Zo.length; s++)
this.indices[3 * this._faceOffset + s] = Zo[s] + o;
return this._faceOffset += 2,
this._vertexOffset += 4,
o / 4
},
setSprite: function (e, t, r, i, n, a, o) {
for (var s = 4 * e, l = this.attributes, h = 0; h < 4; h++)
l.position.set(s + h, t);
var u = l.texcoord;
u.set(s, [i[0][0], i[0][1]]),
u.set(s + 1, [i[1][0], i[0][1]]),
u.set(s + 2, [i[1][0], i[1][1]]),
u.set(s + 3, [i[0][0], i[1][1]]),
this.setSpriteAlign(e, r, n, a, o)
}
});
i.util.defaults(Yo.prototype, Lo);
const Ko = Yo;
Ka.Shader.import("@export ecgl.labels.vertex\n\nattribute vec3 position: POSITION;\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec2 offset;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\n\nvarying vec2 v_Texcoord;\n\nvoid main()\n{\n vec4 proj = worldViewProjection * vec4(position, 1.0);\n\n vec2 screen = (proj.xy / abs(proj.w) + 1.0) * 0.5 * viewport.zw;\n\n screen += offset;\n\n proj.xy = (screen / viewport.zw - 0.5) * 2.0 * abs(proj.w);\n gl_Position = proj;\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n v_Texcoord = texcoord;\n}\n@end\n\n\n@export ecgl.labels.fragment\n\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\nuniform sampler2D textureAtlas;\nuniform vec2 uvScale: [1.0, 1.0];\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nvarying float v_Miter;\n\nvarying vec2 v_Texcoord;\n\nvoid main()\n{\n gl_FragColor = vec4(color, alpha) * texture2D(textureAtlas, v_Texcoord * uvScale);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n}\n\n@end");
const Qo = Ka.Mesh.extend((function () {
return {
geometry: new Ko({
dynamic: !0
}),
material: new Ka.Material({
shader: Ka.createShader("ecgl.labels"),
transparent: !0,
depthMask: !1
}),
culling: !1,
castShadow: !1,
ignorePicking: !0
}
}
));
var Jo = Mn
, $o = {
x: 0,
y: 2,
z: 1
};
function es(e, t) {
var r = new Ka.Mesh({
geometry: new Ro({
useNativeLine: !1
}),
material: t,
castShadow: !1,
ignorePicking: !0,
renderOrder: 2
})
, i = new Qo;
i.material.depthMask = !1;
var n = new Ka.Node;
n.add(r),
n.add(i),
this.rootNode = n,
this.dim = e,
this.linesMesh = r,
this.labelsMesh = i,
this.axisLineCoords = null,
this.labelElements = []
}
var ts = {
x: "y",
y: "x",
z: "y"
};
es.prototype.update = function (e, t, r) {
var n = e.coordinateSystem.getAxis(this.dim)
, a = this.linesMesh.geometry
, o = this.labelsMesh.geometry;
a.convertToDynamicArray(!0),
o.convertToDynamicArray(!0);
var s = n.model
, l = n.getExtent()
, h = r.getDevicePixelRatio()
, u = s.getModel("axisLine", e.getModel("axisLine"))
, c = s.getModel("axisTick", e.getModel("axisTick"))
, d = s.getModel("axisLabel", e.getModel("axisLabel"))
, f = u.get("lineStyle.color");
if (u.get("show")) {
var p = u.getModel("lineStyle")
, m = [0, 0, 0];
(M = [0, 0, 0])[A = $o[n.dim]] = l[0],
m[A] = l[1],
this.axisLineCoords = [M, m];
var g = Ka.parseColor(f)
, _ = Jo(p.get("width"), 1)
, v = Jo(p.get("opacity"), 1);
g[3] *= v,
a.addLine(M, m, g, _ * h)
}
if (c.get("show")) {
var y = c.getModel("lineStyle")
, x = Ka.parseColor(Jo(y.get("color"), f));
_ = Jo(y.get("width"), 1),
x[3] *= Jo(y.get("opacity"), 1);
for (var b = n.getTicksCoords(), w = c.get("length"), T = 0; T < b.length; T++) {
var S = b[T].coord
, M = [0, 0, 0]
, A = (m = [0, 0, 0],
$o[n.dim])
, E = $o[ts[n.dim]];
M[A] = m[A] = S,
m[E] = w,
a.addLine(M, m, x, _ * h)
}
}
if (this.labelElements = [],
h = r.getDevicePixelRatio(),
d.get("show")) {
b = n.getTicksCoords();
var C = s.get("data")
, D = d.get("margin")
, L = n.getViewLabels();
for (T = 0; T < L.length; T++) {
var P = L[T].tickValue
, O = L[T].formattedLabel
, N = L[T].rawLabel
, I = (S = n.dataToCoord(P),
[0, 0, 0]);
A = $o[n.dim],
E = $o[ts[n.dim]],
I[A] = I[A] = S,
I[E] = D;
var R = d;
C && C[P] && C[P].textStyle && (R = new i.Model(C[P].textStyle, d, s.ecModel));
var B = Jo(R.get("color"), f)
, F = new i.graphic.Text({
style: xo(R, {
text: O,
fill: "function" == typeof B ? B("category" === n.type ? N : "value" === n.type ? P + "" : P, T) : B,
verticalAlign: "top",
align: "left"
})
})
, z = t.add(F)
, G = F.getBoundingRect();
o.addSprite(I, [G.width * h, G.height * h], z),
this.labelElements.push(F)
}
}
if (s.get("name")) {
var U = s.getModel("nameTextStyle")
, k = (I = [0, 0, 0],
A = $o[n.dim],
E = $o[ts[n.dim]],
Jo(U.get("color"), f))
, V = U.get("borderColor");
_ = U.get("borderWidth"),
I[A] = I[A] = (l[0] + l[1]) / 2,
I[E] = s.get("nameGap"),
F = new i.graphic.Text({
style: xo(U, {
text: s.get("name"),
fill: k,
stroke: V,
lineWidth: _
})
}),
z = t.add(F),
G = F.getBoundingRect(),
o.addSprite(I, [G.width * h, G.height * h], z),
F.__idx = this.labelElements.length,
this.nameLabelElement = F
}
this.labelsMesh.material.set("textureAtlas", t.getTexture()),
this.labelsMesh.material.set("uvScale", t.getCoordsScale()),
a.convertToTypedArray(),
o.convertToTypedArray()
}
,
es.prototype.setSpriteAlign = function (e, t, r) {
for (var i = r.getDevicePixelRatio(), n = this.labelsMesh.geometry, a = 0; a < this.labelElements.length; a++) {
var o = this.labelElements[a].getBoundingRect();
n.setSpriteAlign(a, [o.width * i, o.height * i], e, t)
}
var s = this.nameLabelElement;
s && (o = s.getBoundingRect(),
n.setSpriteAlign(s.__idx, [o.width * i, o.height * i], e, t),
n.dirty()),
this.textAlign = e,
this.textVerticalAlign = t
}
;
const rs = es
, is = "@export ecgl.lines3D.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec3 position: POSITION;\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Color = a_Color;\n}\n\n@end\n\n@export ecgl.lines3D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color * v_Color);\n#else\n gl_FragColor = color * v_Color;\n#endif\n}\n@end\n\n\n\n@export ecgl.lines3D.clipNear\n\nvec4 clipNear(vec4 p1, vec4 p2) {\n float n = (p1.w - near) / (p1.w - p2.w);\n return vec4(mix(p1.xy, p2.xy, n), -near, near);\n}\n\n@end\n\n@export ecgl.lines3D.expandLine\n#ifdef VERTEX_ANIMATION\n vec4 prevProj = worldViewProjection * vec4(mix(prevPositionPrev, positionPrev, percent), 1.0);\n vec4 currProj = worldViewProjection * vec4(mix(prevPosition, position, percent), 1.0);\n vec4 nextProj = worldViewProjection * vec4(mix(prevPositionNext, positionNext, percent), 1.0);\n#else\n vec4 prevProj = worldViewProjection * vec4(positionPrev, 1.0);\n vec4 currProj = worldViewProjection * vec4(position, 1.0);\n vec4 nextProj = worldViewProjection * vec4(positionNext, 1.0);\n#endif\n\n if (currProj.w < 0.0) {\n if (nextProj.w > 0.0) {\n currProj = clipNear(currProj, nextProj);\n }\n else if (prevProj.w > 0.0) {\n currProj = clipNear(currProj, prevProj);\n }\n }\n\n vec2 prevScreen = (prevProj.xy / abs(prevProj.w) + 1.0) * 0.5 * viewport.zw;\n vec2 currScreen = (currProj.xy / abs(currProj.w) + 1.0) * 0.5 * viewport.zw;\n vec2 nextScreen = (nextProj.xy / abs(nextProj.w) + 1.0) * 0.5 * viewport.zw;\n\n vec2 dir;\n float len = offset;\n if (position == positionPrev) {\n dir = normalize(nextScreen - currScreen);\n }\n else if (position == positionNext) {\n dir = normalize(currScreen - prevScreen);\n }\n else {\n vec2 dirA = normalize(currScreen - prevScreen);\n vec2 dirB = normalize(nextScreen - currScreen);\n\n vec2 tanget = normalize(dirA + dirB);\n\n float miter = 1.0 / max(dot(tanget, dirA), 0.5);\n len *= miter;\n dir = tanget;\n }\n\n dir = vec2(-dir.y, dir.x) * len;\n currScreen += dir;\n\n currProj.xy = (currScreen / viewport.zw - 0.5) * 2.0 * abs(currProj.w);\n@end\n\n\n@export ecgl.meshLines3D.vertex\n\nattribute vec3 position: POSITION;\nattribute vec3 positionPrev;\nattribute vec3 positionNext;\nattribute float offset;\nattribute vec4 a_Color : COLOR;\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nattribute vec3 prevPositionPrev;\nattribute vec3 prevPositionNext;\nuniform float percent : 1.0;\n#endif\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\nuniform float near : NEAR;\n\nvarying vec4 v_Color;\n\n@import ecgl.common.wireframe.vertexHeader\n\n@import ecgl.lines3D.clipNear\n\nvoid main()\n{\n @import ecgl.lines3D.expandLine\n\n gl_Position = currProj;\n\n v_Color = a_Color;\n\n @import ecgl.common.wireframe.vertexMain\n}\n@end\n\n\n@export ecgl.meshLines3D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color * v_Color);\n#else\n gl_FragColor = color * v_Color;\n#endif\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end";
var ns = Mn;
Ka.Shader.import(is);
var as = {
x: 0,
y: 2,
z: 1
};
const os = i.ComponentView.extend({
type: "grid3D",
__ecgl__: !0,
init: function (e, t) {
var r = new Ka.Material({
shader: Ka.createShader("ecgl.color"),
depthMask: !1,
transparent: !0
})
, i = new Ka.Material({
shader: Ka.createShader("ecgl.meshLines3D"),
depthMask: !1,
transparent: !0
});
r.define("fragment", "DOUBLE_SIDED"),
r.define("both", "VERTEX_COLOR"),
this.groupGL = new Ka.Node,
this._control = new Do({
zr: t.getZr()
}),
this._control.init(),
this._faces = [["y", "z", "x", -1, "left"], ["y", "z", "x", 1, "right"], ["x", "y", "z", -1, "bottom"], ["x", "y", "z", 1, "top"], ["x", "z", "y", -1, "far"], ["x", "z", "y", 1, "near"]].map((function (e) {
var t = new qo(e, i, r);
return this.groupGL.add(t.rootNode),
t
}
), this),
this._axes = ["x", "y", "z"].map((function (e) {
var t = new rs(e, i);
return this.groupGL.add(t.rootNode),
t
}
), this);
var n = t.getDevicePixelRatio();
this._axisLabelSurface = new zo({
width: 256,
height: 256,
devicePixelRatio: n
}),
this._axisLabelSurface.onupdate = function () {
t.getZr().refresh()
}
,
this._axisPointerLineMesh = new Ka.Mesh({
geometry: new Ro({
useNativeLine: !1
}),
material: i,
castShadow: !1,
ignorePicking: !0,
renderOrder: 3
}),
this.groupGL.add(this._axisPointerLineMesh),
this._axisPointerLabelsSurface = new zo({
width: 128,
height: 128,
devicePixelRatio: n
}),
this._axisPointerLabelsMesh = new Qo({
ignorePicking: !0,
renderOrder: 4,
castShadow: !1
}),
this._axisPointerLabelsMesh.material.set("textureAtlas", this._axisPointerLabelsSurface.getTexture()),
this.groupGL.add(this._axisPointerLabelsMesh),
this._lightRoot = new Ka.Node,
this._sceneHelper = new Uo,
this._sceneHelper.initLight(this._lightRoot)
},
render: function (e, t, r) {
this._model = e,
this._api = r;
var i = e.coordinateSystem;
i.viewGL.add(this._lightRoot),
e.get("show") ? i.viewGL.add(this.groupGL) : i.viewGL.remove(this.groupGL);
var n = this._control;
n.setViewGL(i.viewGL);
var a = e.getModel("viewControl");
n.setFromViewControlModel(a, 0),
this._axisLabelSurface.clear(),
n.off("update"),
e.get("show") && (this._faces.forEach((function (i) {
i.update(e, t, r)
}
), this),
this._axes.forEach((function (t) {
t.update(e, this._axisLabelSurface, r)
}
), this)),
n.on("update", this._onCameraChange.bind(this, e, r), this),
this._sceneHelper.setScene(i.viewGL.scene),
this._sceneHelper.updateLight(e),
i.viewGL.setPostEffect(e.getModel("postEffect"), r),
i.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling")),
this._initMouseHandler(e)
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r)
},
showAxisPointer: function (e, t, r, i) {
this._doShowAxisPointer(),
this._updateAxisPointer(i.value)
},
hideAxisPointer: function (e, t, r, i) {
this._doHideAxisPointer()
},
_initMouseHandler: function (e) {
var t = e.coordinateSystem.viewGL;
e.get("show") && e.get("axisPointer.show") ? t.on("mousemove", this._updateAxisPointerOnMousePosition, this) : t.off("mousemove", this._updateAxisPointerOnMousePosition)
},
_updateAxisPointerOnMousePosition: function (e) {
if (!e.target) {
for (var t, r = this._model.coordinateSystem, i = r.viewGL, n = i.castRay(e.offsetX, e.offsetY, new Ka.Ray), a = 0; a < this._faces.length; a++) {
var o = this._faces[a];
if (!o.rootNode.invisible) {
o.plane.normal.dot(i.camera.worldTransform.z) < 0 && o.plane.normal.negate();
var s = n.intersectPlane(o.plane);
if (s) {
var l = r.getAxis(o.faceInfo[0])
, h = r.getAxis(o.faceInfo[1])
, u = as[o.faceInfo[0]]
, c = as[o.faceInfo[1]];
l.contain(s.array[u]) && h.contain(s.array[c]) && (t = s)
}
}
}
if (t) {
var d = r.pointToData(t.array, [], !0);
this._updateAxisPointer(d),
this._doShowAxisPointer()
} else
this._doHideAxisPointer()
}
},
_onCameraChange: function (e, t) {
e.get("show") && (this._updateFaceVisibility(),
this._updateAxisLinePosition());
var r = this._control;
t.dispatchAction({
type: "grid3DChangeCamera",
alpha: r.getAlpha(),
beta: r.getBeta(),
distance: r.getDistance(),
center: r.getCenter(),
from: this.uid,
grid3DId: e.id
})
},
_updateFaceVisibility: function () {
var e = this._control.getCamera()
, t = new Ka.Vector3;
e.update();
for (var r = 0; r < this._faces.length / 2; r++) {
for (var i = [], n = 0; n < 2; n++)
this._faces[2 * r + n].rootNode.getWorldPosition(t),
t.transformMat4(e.viewMatrix),
i[n] = t.z;
var a = i[0] > i[1] ? 0 : 1
, o = this._faces[2 * r + a]
, s = this._faces[2 * r + 1 - a];
o.rootNode.invisible = !0,
s.rootNode.invisible = !1
}
},
_updateAxisLinePosition: function () {
var e = this._model.coordinateSystem
, t = e.getAxis("x")
, r = e.getAxis("y")
, i = e.getAxis("z")
, n = i.getExtentMax()
, a = i.getExtentMin()
, o = t.getExtentMin()
, s = t.getExtentMax()
, l = r.getExtentMax()
, h = r.getExtentMin()
, u = this._axes[0].rootNode
, c = this._axes[1].rootNode
, d = this._axes[2].rootNode
, f = this._faces
, p = f[4].rootNode.invisible ? h : l
, m = f[2].rootNode.invisible ? n : a
, g = f[0].rootNode.invisible ? o : s
, _ = f[2].rootNode.invisible ? n : a
, v = f[0].rootNode.invisible ? s : o
, y = f[4].rootNode.invisible ? h : l;
u.rotation.identity(),
c.rotation.identity(),
d.rotation.identity(),
f[4].rootNode.invisible && (this._axes[0].flipped = !0,
u.rotation.rotateX(Math.PI)),
f[0].rootNode.invisible && (this._axes[1].flipped = !0,
c.rotation.rotateZ(Math.PI)),
f[4].rootNode.invisible && (this._axes[2].flipped = !0,
d.rotation.rotateY(Math.PI)),
u.position.set(0, m, p),
c.position.set(g, _, 0),
d.position.set(v, 0, y),
u.update(),
c.update(),
d.update(),
this._updateAxisLabelAlign()
},
_updateAxisLabelAlign: function () {
var e = this._control.getCamera()
, t = [new Ka.Vector4, new Ka.Vector4]
, r = new Ka.Vector4;
this.groupGL.getWorldPosition(r),
r.w = 1,
r.transformMat4(e.viewMatrix).transformMat4(e.projectionMatrix),
r.x /= r.w,
r.y /= r.w,
this._axes.forEach((function (i) {
for (var n = i.axisLineCoords, a = (i.labelsMesh.geometry,
0); a < t.length; a++)
t[a].setArray(n[a]),
t[a].w = 1,
t[a].transformMat4(i.rootNode.worldTransform).transformMat4(e.viewMatrix).transformMat4(e.projectionMatrix),
t[a].x /= t[a].w,
t[a].y /= t[a].w;
var o, s, l = t[1].x - t[0].x, h = t[1].y - t[0].y, u = (t[1].x + t[0].x) / 2, c = (t[1].y + t[0].y) / 2;
Math.abs(h / l) < .5 ? (o = "center",
s = c > r.y ? "bottom" : "top") : (s = "middle",
o = u > r.x ? "left" : "right"),
i.setSpriteAlign(o, s, this._api)
}
), this)
},
_doShowAxisPointer: function () {
this._axisPointerLineMesh.invisible && (this._axisPointerLineMesh.invisible = !1,
this._axisPointerLabelsMesh.invisible = !1,
this._api.getZr().refresh())
},
_doHideAxisPointer: function () {
this._axisPointerLineMesh.invisible || (this._axisPointerLineMesh.invisible = !0,
this._axisPointerLabelsMesh.invisible = !0,
this._api.getZr().refresh())
},
_updateAxisPointer: function (e) {
var t = this._model.coordinateSystem
, r = t.dataToPoint(e)
, i = this._axisPointerLineMesh.geometry
, n = this._model.getModel("axisPointer")
, a = this._api.getDevicePixelRatio();
function o(e) {
return Mn(e.model.get("axisPointer.show"), n.get("show"))
}
function s(e) {
var t = e.model.getModel("axisPointer", n).getModel("lineStyle")
, r = Ka.parseColor(t.get("color"))
, i = ns(t.get("width"), 1)
, a = ns(t.get("opacity"), 1);
return r[3] *= a,
{
color: r,
lineWidth: i
}
}
i.convertToDynamicArray(!0);
for (var l = 0; l < this._faces.length; l++) {
var h = this._faces[l];
if (!h.rootNode.invisible) {
for (var u = h.faceInfo, c = u[3] < 0 ? t.getAxis(u[2]).getExtentMin() : t.getAxis(u[2]).getExtentMax(), d = as[u[2]], f = 0; f < 2; f++) {
var p = u[f]
, m = u[1 - f]
, g = t.getAxis(p)
, _ = t.getAxis(m);
if (o(g)) {
var v = as[p]
, y = as[m];
(w = [0, 0, 0])[v] = (b = [0, 0, 0])[v] = r[v],
w[d] = b[d] = c,
w[y] = _.getExtentMin(),
b[y] = _.getExtentMax();
var x = s(g);
i.addLine(w, b, x.color, x.lineWidth * a)
}
}
if (o(t.getAxis(u[2]))) {
var b, w = r.slice();
(b = r.slice())[d] = c,
x = s(t.getAxis(u[2])),
i.addLine(w, b, x.color, x.lineWidth * a)
}
}
}
i.convertToTypedArray(),
this._updateAxisPointerLabelsMesh(e),
this._api.getZr().refresh()
},
_updateAxisPointerLabelsMesh: function (e) {
var t = this._model
, r = this._axisPointerLabelsMesh
, n = this._axisPointerLabelsSurface
, a = t.coordinateSystem
, o = t.getModel("axisPointer");
r.geometry.convertToDynamicArray(!0),
n.clear();
var s = {
x: "y",
y: "x",
z: "y"
};
this._axes.forEach((function (t, l) {
var h = a.getAxis(t.dim)
, u = h.model.getModel("axisPointer", o)
, c = u.getModel("label")
, d = u.get("lineStyle.color");
if (c.get("show") && u.get("show")) {
var f = e[l]
, p = c.get("formatter")
, m = h.scale.getLabel({
value: f
});
if (null != p)
m = p(m, e);
else if ("interval" === h.scale.type || "log" === h.scale.type) {
var g = i.number.getPrecisionSafe(h.scale.getTicks()[0]);
m = f.toFixed(g + 2)
}
var _ = c.get("color")
, v = new i.graphic.Text({
style: xo(c, {
text: m,
fill: _ || d,
align: "left",
verticalAlign: "top"
})
})
, y = n.add(v)
, x = v.getBoundingRect()
, b = this._api.getDevicePixelRatio()
, w = t.rootNode.position.toArray();
w[as[s[t.dim]]] += (t.flipped ? -1 : 1) * c.get("margin"),
w[as[t.dim]] = h.dataToCoord(e[l]),
r.geometry.addSprite(w, [x.width * b, x.height * b], y, t.textAlign, t.textVerticalAlign)
}
}
), this),
n.getZr().refreshImmediately(),
r.material.set("uvScale", n.getCoordsScale()),
r.geometry.convertToTypedArray()
},
dispose: function () {
this.groupGL.removeAll(),
this._control.dispose(),
this._axisLabelSurface.dispose(),
this._axisPointerLabelsSurface.dispose()
}
})
, ss = function () {
function e(e) {
this.type = "cartesian",
this._dimList = [],
this._axes = {},
this.name = e || ""
}
return e.prototype.getAxis = function (e) {
return this._axes[e]
}
,
e.prototype.getAxes = function () {
return xa(this._dimList, (function (e) {
return this._axes[e]
}
), this)
}
,
e.prototype.getAxesByScale = function (e) {
return e = e.toLowerCase(),
function (e, t, r) {
if (!e)
return [];
if (!t)
return Sa(e);
if (e.filter && e.filter === ca)
return e.filter(t, r);
for (var i = [], n = 0, a = e.length; n < a; n++)
t.call(r, e[n], n, e) && i.push(e[n]);
return i
}(this.getAxes(), (function (t) {
return t.scale.type === e
}
))
}
,
e.prototype.addAxis = function (e) {
var t = e.dim;
this._axes[t] = e,
this._dimList.push(t)
}
,
e
}();
function ls(e) {
ss.call(this, e),
this.type = "cartesian3D",
this.dimensions = ["x", "y", "z"],
this.size = [0, 0, 0]
}
ls.prototype = {
constructor: ls,
model: null,
containPoint: function (e) {
return this.getAxis("x").contain(e[0]) && this.getAxis("y").contain(e[2]) && this.getAxis("z").contain(e[1])
},
containData: function (e) {
return this.getAxis("x").containData(e[0]) && this.getAxis("y").containData(e[1]) && this.getAxis("z").containData(e[2])
},
dataToPoint: function (e, t, r) {
return (t = t || [])[0] = this.getAxis("x").dataToCoord(e[0], r),
t[2] = this.getAxis("y").dataToCoord(e[1], r),
t[1] = this.getAxis("z").dataToCoord(e[2], r),
t
},
pointToData: function (e, t, r) {
return (t = t || [])[0] = this.getAxis("x").coordToData(e[0], r),
t[1] = this.getAxis("y").coordToData(e[2], r),
t[2] = this.getAxis("z").coordToData(e[1], r),
t
}
},
i.util.inherits(ls, ss);
const hs = ls;
function us(e, t, r) {
i.Axis.call(this, e, t, r)
}
us.prototype = {
constructor: us,
getExtentMin: function () {
var e = this._extent;
return Math.min(e[0], e[1])
},
getExtentMax: function () {
var e = this._extent;
return Math.max(e[0], e[1])
},
calculateCategoryInterval: function () {
return Math.floor(this.scale.count() / 8)
}
},
i.util.inherits(us, i.Axis);
const cs = us;
function ds(e, t, r) {
return e[0] = t[0],
e[1] = t[1],
e[2] = t[2],
e[3] = t[3],
e[4] = t[4] + r[0],
e[5] = t[5] + r[1],
e
}
const fs = function () {
function e(e, t) {
this.x = e || 0,
this.y = t || 0
}
return e.prototype.copy = function (e) {
return this.x = e.x,
this.y = e.y,
this
}
,
e.prototype.clone = function () {
return new e(this.x, this.y)
}
,
e.prototype.set = function (e, t) {
return this.x = e,
this.y = t,
this
}
,
e.prototype.equal = function (e) {
return e.x === this.x && e.y === this.y
}
,
e.prototype.add = function (e) {
return this.x += e.x,
this.y += e.y,
this
}
,
e.prototype.scale = function (e) {
this.x *= e,
this.y *= e
}
,
e.prototype.scaleAndAdd = function (e, t) {
this.x += e.x * t,
this.y += e.y * t
}
,
e.prototype.sub = function (e) {
return this.x -= e.x,
this.y -= e.y,
this
}
,
e.prototype.dot = function (e) {
return this.x * e.x + this.y * e.y
}
,
e.prototype.len = function () {
return Math.sqrt(this.x * this.x + this.y * this.y)
}
,
e.prototype.lenSquare = function () {
return this.x * this.x + this.y * this.y
}
,
e.prototype.normalize = function () {
var e = this.len();
return this.x /= e,
this.y /= e,
this
}
,
e.prototype.distance = function (e) {
var t = this.x - e.x
, r = this.y - e.y;
return Math.sqrt(t * t + r * r)
}
,
e.prototype.distanceSquare = function (e) {
var t = this.x - e.x
, r = this.y - e.y;
return t * t + r * r
}
,
e.prototype.negate = function () {
return this.x = -this.x,
this.y = -this.y,
this
}
,
e.prototype.transform = function (e) {
if (e) {
var t = this.x
, r = this.y;
return this.x = e[0] * t + e[2] * r + e[4],
this.y = e[1] * t + e[3] * r + e[5],
this
}
}
,
e.prototype.toArray = function (e) {
return e[0] = this.x,
e[1] = this.y,
e
}
,
e.prototype.fromArray = function (e) {
this.x = e[0],
this.y = e[1]
}
,
e.set = function (e, t, r) {
e.x = t,
e.y = r
}
,
e.copy = function (e, t) {
e.x = t.x,
e.y = t.y
}
,
e.len = function (e) {
return Math.sqrt(e.x * e.x + e.y * e.y)
}
,
e.lenSquare = function (e) {
return e.x * e.x + e.y * e.y
}
,
e.dot = function (e, t) {
return e.x * t.x + e.y * t.y
}
,
e.add = function (e, t, r) {
e.x = t.x + r.x,
e.y = t.y + r.y
}
,
e.sub = function (e, t, r) {
e.x = t.x - r.x,
e.y = t.y - r.y
}
,
e.scale = function (e, t, r) {
e.x = t.x * r,
e.y = t.y * r
}
,
e.scaleAndAdd = function (e, t, r, i) {
e.x = t.x + r.x * i,
e.y = t.y + r.y * i
}
,
e.lerp = function (e, t, r, i) {
var n = 1 - i;
e.x = n * t.x + i * r.x,
e.y = n * t.y + i * r.y
}
,
e
}();
var ps = Math.min
, ms = Math.max
, gs = new fs
, _s = new fs
, vs = new fs
, ys = new fs
, xs = new fs
, bs = new fs;
const ws = function () {
function e(e, t, r, i) {
r < 0 && (e += r,
r = -r),
i < 0 && (t += i,
i = -i),
this.x = e,
this.y = t,
this.width = r,
this.height = i
}
return e.prototype.union = function (e) {
var t = ps(e.x, this.x)
, r = ps(e.y, this.y);
isFinite(this.x) && isFinite(this.width) ? this.width = ms(e.x + e.width, this.x + this.width) - t : this.width = e.width,
isFinite(this.y) && isFinite(this.height) ? this.height = ms(e.y + e.height, this.y + this.height) - r : this.height = e.height,
this.x = t,
this.y = r
}
,
e.prototype.applyTransform = function (t) {
e.applyTransform(this, this, t)
}
,
e.prototype.calculateTransform = function (e) {
var t = this
, r = e.width / t.width
, i = e.height / t.height
, n = [1, 0, 0, 1, 0, 0];
return ds(n, n, [-t.x, -t.y]),
function (e, t, r) {
var i = r[0]
, n = r[1];
e[0] = t[0] * i,
e[1] = t[1] * n,
e[2] = t[2] * i,
e[3] = t[3] * n,
e[4] = t[4] * i,
e[5] = t[5] * n
}(n, n, [r, i]),
ds(n, n, [e.x, e.y]),
n
}
,
e.prototype.intersect = function (t, r) {
if (!t)
return !1;
t instanceof e || (t = e.create(t));
var i = this
, n = i.x
, a = i.x + i.width
, o = i.y
, s = i.y + i.height
, l = t.x
, h = t.x + t.width
, u = t.y
, c = t.y + t.height
, d = !(a < l || h < n || s < u || c < o);
if (r) {
var f = 1 / 0
, p = 0
, m = Math.abs(a - l)
, g = Math.abs(h - n)
, _ = Math.abs(s - u)
, v = Math.abs(c - o)
, y = Math.min(m, g)
, x = Math.min(_, v);
a < l || h < n ? y > p && (p = y,
m < g ? fs.set(bs, -m, 0) : fs.set(bs, g, 0)) : y < f && (f = y,
m < g ? fs.set(xs, m, 0) : fs.set(xs, -g, 0)),
s < u || c < o ? x > p && (p = x,
_ < v ? fs.set(bs, 0, -_) : fs.set(bs, 0, v)) : y < f && (f = y,
_ < v ? fs.set(xs, 0, _) : fs.set(xs, 0, -v))
}
return r && fs.copy(r, d ? xs : bs),
d
}
,
e.prototype.contain = function (e, t) {
var r = this;
return e >= r.x && e <= r.x + r.width && t >= r.y && t <= r.y + r.height
}
,
e.prototype.clone = function () {
return new e(this.x, this.y, this.width, this.height)
}
,
e.prototype.copy = function (t) {
e.copy(this, t)
}
,
e.prototype.plain = function () {
return {
x: this.x,
y: this.y,
width: this.width,
height: this.height
}
}
,
e.prototype.isFinite = function () {
return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height)
}
,
e.prototype.isZero = function () {
return 0 === this.width || 0 === this.height
}
,
e.create = function (t) {
return new e(t.x, t.y, t.width, t.height)
}
,
e.copy = function (e, t) {
e.x = t.x,
e.y = t.y,
e.width = t.width,
e.height = t.height
}
,
e.applyTransform = function (t, r, i) {
if (i) {
if (i[1] < 1e-5 && i[1] > -1e-5 && i[2] < 1e-5 && i[2] > -1e-5) {
var n = i[0]
, a = i[3]
, o = i[4]
, s = i[5];
return t.x = r.x * n + o,
t.y = r.y * a + s,
t.width = r.width * n,
t.height = r.height * a,
t.width < 0 && (t.x += t.width,
t.width = -t.width),
void (t.height < 0 && (t.y += t.height,
t.height = -t.height))
}
gs.x = vs.x = r.x,
gs.y = ys.y = r.y,
_s.x = ys.x = r.x + r.width,
_s.y = vs.y = r.y + r.height,
gs.transform(i),
ys.transform(i),
_s.transform(i),
vs.transform(i),
t.x = ps(gs.x, _s.x, vs.x, ys.x),
t.y = ps(gs.y, _s.y, vs.y, ys.y);
var l = ms(gs.x, _s.x, vs.x, ys.x)
, h = ms(gs.y, _s.y, vs.y, ys.y);
t.width = l - t.x,
t.height = h - t.y
} else
t !== r && e.copy(t, r)
}
,
e
}();
function Ts(e, t, r, i, n) {
var a = 0
, o = 0;
null == i && (i = 1 / 0),
null == n && (n = 1 / 0);
var s = 0;
t.eachChild((function (l, h) {
var u, c, d = l.getBoundingRect(), f = t.childAt(h + 1), p = f && f.getBoundingRect();
if ("horizontal" === e) {
var m = d.width + (p ? -p.x + d.x : 0);
(u = a + m) > i || l.newline ? (a = 0,
u = m,
o += s + r,
s = d.height) : s = Math.max(s, d.height)
} else {
var g = d.height + (p ? -p.y + d.y : 0);
(c = o + g) > n || l.newline ? (a += s + r,
o = 0,
c = g,
s = d.width) : s = Math.max(s, d.width)
}
l.newline || (l.x = a,
l.y = o,
l.markRedraw(),
"horizontal" === e ? a = u + r : o = c + r)
}
))
}
function Ss(e, t, r) {
r = function (e) {
if ("number" == typeof e)
return [e, e, e, e];
var t = e.length;
return 2 === t ? [e[0], e[1], e[0], e[1]] : 3 === t ? [e[0], e[1], e[2], e[1]] : e
}(r || 0);
var i = t.width
, n = t.height
, a = go(e.left, i)
, o = go(e.top, n)
, s = go(e.right, i)
, l = go(e.bottom, n)
, h = go(e.width, i)
, u = go(e.height, n)
, c = r[2] + r[0]
, d = r[1] + r[3]
, f = e.aspect;
switch (isNaN(h) && (h = i - s - d - a),
isNaN(u) && (u = n - l - c - o),
null != f && (isNaN(h) && isNaN(u) && (f > i / n ? h = .8 * i : u = .8 * n),
isNaN(h) && (h = f * u),
isNaN(u) && (u = h / f)),
isNaN(a) && (a = i - s - h - d),
isNaN(o) && (o = n - l - u - c),
e.left || e.right) {
case "center":
a = i / 2 - h / 2 - r[3];
break;
case "right":
a = i - h - d
}
switch (e.top || e.bottom) {
case "middle":
case "center":
o = n / 2 - u / 2 - r[0];
break;
case "bottom":
o = n - u - c
}
a = a || 0,
o = o || 0,
isNaN(h) && (h = i - d - a - (s || 0)),
isNaN(u) && (u = n - c - o - (l || 0));
var p = new ws(a + r[3], o + r[0], h, u);
return p.margin = r,
p
}
wa(Ts, "vertical"),
wa(Ts, "horizontal");
var Ms = function () {
this._pool = {},
this._allocatedTextures = []
};
Ms.prototype = {
constructor: Ms,
get: function (e) {
var t = Cs(e);
this._pool.hasOwnProperty(t) || (this._pool[t] = []);
var r = this._pool[t];
if (!r.length) {
var i = new Dr(e);
return this._allocatedTextures.push(i),
i
}
return r.pop()
},
put: function (e) {
var t = Cs(e);
this._pool.hasOwnProperty(t) || (this._pool[t] = []),
this._pool[t].push(e)
},
clear: function (e) {
for (var t = 0; t < this._allocatedTextures.length; t++)
this._allocatedTextures[t].dispose(e);
this._pool = {},
this._allocatedTextures = []
}
};
var As = {
width: 512,
height: 512,
type: T,
format: A,
wrapS: I,
wrapT: I,
minFilter: O,
magFilter: C,
useMipmap: !0,
anisotropic: 1,
flipY: !0,
unpackAlignment: 4,
premultiplyAlpha: !1
}
, Es = Object.keys(As);
function Cs(e) {
var t, r, i, n;
f.defaultsWithPropList(e, As, Es),
r = (t = e).width,
i = t.height,
n = 0 == (r & r - 1) && 0 == (i & i - 1),
t.format === M && (t.useMipmap = !1),
n && t.useMipmap || (t.minFilter == D || t.minFilter == P ? t.minFilter = E : t.minFilter != O && t.minFilter != L || (t.minFilter = C)),
n || (t.wrapS = I,
t.wrapT = I);
for (var a = "", o = 0; o < Es.length; o++)
a += e[Es[o]].toString();
return a
}
const Ds = Ms;
var Ls = ["px", "nx", "py", "ny", "pz", "nz"];
function Ps(e, t, r) {
return "alphaMap" === r ? e.material.get("diffuseMap") : "alphaCutoff" === r ? e.material.isDefined("fragment", "ALPHA_TEST") && e.material.get("diffuseMap") && e.material.get("alphaCutoff") || 0 : "uvRepeat" === r ? e.material.get("uvRepeat") : "uvOffset" === r ? e.material.get("uvOffset") : t.get(r)
}
function Os(e, t) {
var r = e.material
, i = t.material;
return r.get("diffuseMap") !== i.get("diffuseMap") || (r.get("alphaCutoff") || 0) !== (i.get("alphaCutoff") || 0)
}
Xe.import("@export clay.sm.depth.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nuniform vec2 uvRepeat = vec2(1.0, 1.0);\nuniform vec2 uvOffset = vec2(0.0, 0.0);\n@import clay.chunk.skinning_header\n@import clay.chunk.instancing_header\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\nvoid main(){\n vec4 P = vec4(position, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n v_ViewPosition = worldViewProjection * P;\n gl_Position = v_ViewPosition;\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n}\n@end\n@export clay.sm.depth.fragment\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\nuniform float bias : 0.001;\nuniform float slopeScale : 1.0;\nuniform sampler2D alphaMap;\nuniform float alphaCutoff: 0.0;\n@import clay.util.encode_float\nvoid main(){\n float depth = v_ViewPosition.z / v_ViewPosition.w;\n if (alphaCutoff > 0.0) {\n if (texture2D(alphaMap, v_Texcoord).a <= alphaCutoff) {\n discard;\n }\n }\n#ifdef USE_VSM\n depth = depth * 0.5 + 0.5;\n float moment1 = depth;\n float moment2 = depth * depth;\n #ifdef SUPPORT_STANDARD_DERIVATIVES\n float dx = dFdx(depth);\n float dy = dFdy(depth);\n moment2 += 0.25*(dx*dx+dy*dy);\n #endif\n gl_FragColor = vec4(moment1, moment2, 0.0, 1.0);\n#else\n #ifdef SUPPORT_STANDARD_DERIVATIVES\n float dx = dFdx(depth);\n float dy = dFdy(depth);\n depth += sqrt(dx*dx + dy*dy) * slopeScale + bias;\n #else\n depth += bias;\n #endif\n gl_FragColor = encodeFloat(depth * 0.5 + 0.5);\n#endif\n}\n@end\n@export clay.sm.debug_depth\nuniform sampler2D depthMap;\nvarying vec2 v_Texcoord;\n@import clay.util.decode_float\nvoid main() {\n vec4 tex = texture2D(depthMap, v_Texcoord);\n#ifdef USE_VSM\n gl_FragColor = vec4(tex.rgb, 1.0);\n#else\n float depth = decodeFloat(tex);\n gl_FragColor = vec4(depth, depth, depth, 1.0);\n#endif\n}\n@end\n@export clay.sm.distance.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\n@import clay.chunk.skinning_header\nvarying vec3 v_WorldPosition;\nvoid main (){\n vec4 P = vec4(position, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n gl_Position = worldViewProjection * P;\n v_WorldPosition = (world * P).xyz;\n}\n@end\n@export clay.sm.distance.fragment\nuniform vec3 lightPosition;\nuniform float range : 100;\nvarying vec3 v_WorldPosition;\n@import clay.util.encode_float\nvoid main(){\n float dist = distance(lightPosition, v_WorldPosition);\n#ifdef USE_VSM\n gl_FragColor = vec4(dist, dist * dist, 0.0, 0.0);\n#else\n dist = dist / range;\n gl_FragColor = encodeFloat(dist);\n#endif\n}\n@end\n@export clay.plugin.shadow_map_common\n@import clay.util.decode_float\nfloat tapShadowMap(sampler2D map, vec2 uv, float z){\n vec4 tex = texture2D(map, uv);\n return step(z, decodeFloat(tex) * 2.0 - 1.0);\n}\nfloat pcf(sampler2D map, vec2 uv, float z, float textureSize, vec2 scale) {\n float shadowContrib = tapShadowMap(map, uv, z);\n vec2 offset = vec2(1.0 / textureSize) * scale;\n#ifdef PCF_KERNEL_SIZE\n for (int _idx_ = 0; _idx_ < PCF_KERNEL_SIZE; _idx_++) {{\n shadowContrib += tapShadowMap(map, uv + offset * pcfKernel[_idx_], z);\n }}\n return shadowContrib / float(PCF_KERNEL_SIZE + 1);\n#else\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, 0.0), z);\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(0.0, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, 0.0), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, -offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, -offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(0.0, -offset.y), z);\n return shadowContrib / 9.0;\n#endif\n}\nfloat pcf(sampler2D map, vec2 uv, float z, float textureSize) {\n return pcf(map, uv, z, textureSize, vec2(1.0));\n}\nfloat chebyshevUpperBound(vec2 moments, float z){\n float p = 0.0;\n z = z * 0.5 + 0.5;\n if (z <= moments.x) {\n p = 1.0;\n }\n float variance = moments.y - moments.x * moments.x;\n variance = max(variance, 0.0000001);\n float mD = moments.x - z;\n float pMax = variance / (variance + mD * mD);\n pMax = clamp((pMax-0.4)/(1.0-0.4), 0.0, 1.0);\n return max(p, pMax);\n}\nfloat computeShadowContrib(\n sampler2D map, mat4 lightVPM, vec3 position, float textureSize, vec2 scale, vec2 offset\n) {\n vec4 posInLightSpace = lightVPM * vec4(position, 1.0);\n posInLightSpace.xyz /= posInLightSpace.w;\n float z = posInLightSpace.z;\n if(all(greaterThan(posInLightSpace.xyz, vec3(-0.99, -0.99, -1.0))) &&\n all(lessThan(posInLightSpace.xyz, vec3(0.99, 0.99, 1.0)))){\n vec2 uv = (posInLightSpace.xy+1.0) / 2.0;\n #ifdef USE_VSM\n vec2 moments = texture2D(map, uv * scale + offset).xy;\n return chebyshevUpperBound(moments, z);\n #else\n return pcf(map, uv * scale + offset, z, textureSize, scale);\n #endif\n }\n return 1.0;\n}\nfloat computeShadowContrib(sampler2D map, mat4 lightVPM, vec3 position, float textureSize) {\n return computeShadowContrib(map, lightVPM, position, textureSize, vec2(1.0), vec2(0.0));\n}\nfloat computeShadowContribOmni(samplerCube map, vec3 direction, float range)\n{\n float dist = length(direction);\n vec4 shadowTex = textureCube(map, direction);\n#ifdef USE_VSM\n vec2 moments = shadowTex.xy;\n float variance = moments.y - moments.x * moments.x;\n float mD = moments.x - dist;\n float p = variance / (variance + mD * mD);\n if(moments.x + 0.001 < dist){\n return clamp(p, 0.0, 1.0);\n }else{\n return 1.0;\n }\n#else\n return step(dist, (decodeFloat(shadowTex) + 0.0002) * range);\n#endif\n}\n@end\n@export clay.plugin.compute_shadow_map\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT) || defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT) || defined(POINT_LIGHT_SHADOWMAP_COUNT)\n#ifdef SPOT_LIGHT_SHADOWMAP_COUNT\nuniform sampler2D spotLightShadowMaps[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform mat4 spotLightMatrices[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform float spotLightShadowMapSizes[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\n#ifdef DIRECTIONAL_LIGHT_SHADOWMAP_COUNT\n#if defined(SHADOW_CASCADE)\nuniform sampler2D directionalLightShadowMaps[1]:unconfigurable;\nuniform mat4 directionalLightMatrices[SHADOW_CASCADE]:unconfigurable;\nuniform float directionalLightShadowMapSizes[1]:unconfigurable;\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE]:unconfigurable;\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE]:unconfigurable;\n#else\nuniform sampler2D directionalLightShadowMaps[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform mat4 directionalLightMatrices[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform float directionalLightShadowMapSizes[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\n#endif\n#ifdef POINT_LIGHT_SHADOWMAP_COUNT\nuniform samplerCube pointLightShadowMaps[POINT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\nuniform bool shadowEnabled : true;\n#ifdef PCF_KERNEL_SIZE\nuniform vec2 pcfKernel[PCF_KERNEL_SIZE];\n#endif\n@import clay.plugin.shadow_map_common\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfSpotLights(vec3 position, inout float shadowContribs[SPOT_LIGHT_COUNT] ) {\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < SPOT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n spotLightShadowMaps[_idx_], spotLightMatrices[_idx_], position,\n spotLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = SPOT_LIGHT_SHADOWMAP_COUNT; _idx_ < SPOT_LIGHT_COUNT; _idx_++){{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n#ifdef SHADOW_CASCADE\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float depth = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far)\n / (gl_DepthRange.far - gl_DepthRange.near);\n float shadowContrib;\n shadowContribs[0] = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n depth >= shadowCascadeClipsNear[_idx_] &&\n depth <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[0], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[0],\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n shadowContribs[0] = shadowContrib;\n }\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#else\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[_idx_], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfPointLights(vec3 position, inout float shadowContribs[POINT_LIGHT_COUNT] ){\n vec3 lightPosition;\n vec3 direction;\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n lightPosition = pointLightPosition[_idx_];\n direction = position - lightPosition;\n shadowContribs[_idx_] = computeShadowContribOmni(pointLightShadowMaps[_idx_], direction, pointLightRange[_idx_]);\n }}\n for(int _idx_ = POINT_LIGHT_SHADOWMAP_COUNT; _idx_ < POINT_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n@end");
var Ns, Is, Rs, Bs, Fs, zs, Gs, Us = m.extend((function () {
return {
softShadow: Us.PCF,
shadowBlur: 1,
lightFrustumBias: "auto",
kernelPCF: new Float32Array([1, 0, 1, 1, -1, 1, 0, 1, -1, 0, -1, -1, 1, -1, 0, -1]),
precision: "highp",
_lastRenderNotCastShadow: !1,
_frameBuffer: new zi,
_textures: {},
_shadowMapNumber: {
POINT_LIGHT: 0,
DIRECTIONAL_LIGHT: 0,
SPOT_LIGHT: 0
},
_depthMaterials: {},
_distanceMaterials: {},
_receivers: [],
_lightsCastShadow: [],
_lightCameras: {},
_lightMaterials: {},
_texturePool: new Ds
}
}
), (function () {
this._gaussianPassH = new pn({
fragment: Xe.source("clay.compositor.gaussian_blur")
}),
this._gaussianPassV = new pn({
fragment: Xe.source("clay.compositor.gaussian_blur")
}),
this._gaussianPassH.setUniform("blurSize", this.shadowBlur),
this._gaussianPassH.setUniform("blurDir", 0),
this._gaussianPassV.setUniform("blurSize", this.shadowBlur),
this._gaussianPassV.setUniform("blurDir", 1),
this._outputDepthPass = new pn({
fragment: Xe.source("clay.sm.debug_depth")
})
}
), {
render: function (e, t, r, i) {
r || (r = t.getMainCamera()),
this.trigger("beforerender", this, e, t, r),
this._renderShadowPass(e, t, r, i),
this.trigger("afterrender", this, e, t, r)
},
renderDebug: function (e, t) {
e.saveClear();
var r = e.viewport
, i = 0
, n = t || r.width / 4
, a = n;
for (var o in this.softShadow === Us.VSM ? this._outputDepthPass.material.define("fragment", "USE_VSM") : this._outputDepthPass.material.undefine("fragment", "USE_VSM"),
this._textures) {
var s = this._textures[o];
e.setViewport(i, 0, n * s.width / s.height, a),
this._outputDepthPass.setUniform("depthMap", s),
this._outputDepthPass.render(e),
i += n * s.width / s.height
}
e.setViewport(r),
e.restoreClear()
},
_updateReceivers: function (e, t) {
if (t.receiveShadow ? (this._receivers.push(t),
t.material.set("shadowEnabled", 1),
t.material.set("pcfKernel", this.kernelPCF)) : t.material.set("shadowEnabled", 0),
this.softShadow === Us.VSM)
t.material.define("fragment", "USE_VSM"),
t.material.undefine("fragment", "PCF_KERNEL_SIZE");
else {
t.material.undefine("fragment", "USE_VSM");
var r = this.kernelPCF;
r && r.length ? t.material.define("fragment", "PCF_KERNEL_SIZE", r.length / 2) : t.material.undefine("fragment", "PCF_KERNEL_SIZE")
}
},
_update: function (e, t) {
var r = this;
t.traverse((function (t) {
t.isRenderable() && r._updateReceivers(e, t)
}
));
for (var i = 0; i < t.lights.length; i++) {
var n = t.lights[i];
n.castShadow && !n.invisible && this._lightsCastShadow.push(n)
}
},
_renderShadowPass: function (e, t, r, i) {
for (var n in this._shadowMapNumber)
this._shadowMapNumber[n] = 0;
this._lightsCastShadow.length = 0,
this._receivers.length = 0;
var a = e.gl;
if (i || t.update(),
r && r.update(),
t.updateLights(),
this._update(e, t),
this._lightsCastShadow.length || !this._lastRenderNotCastShadow) {
this._lastRenderNotCastShadow = 0 === this._lightsCastShadow,
a.enable(a.DEPTH_TEST),
a.depthMask(!0),
a.disable(a.BLEND),
a.clearColor(1, 1, 1, 1);
for (var o, s = [], l = [], h = [], u = [], c = [], d = [], f = 0; f < this._lightsCastShadow.length; f++) {
var p = this._lightsCastShadow[f];
if ("DIRECTIONAL_LIGHT" === p.type) {
if (o) {
console.warn("Only one direectional light supported with shadow cascade");
continue
}
if (p.shadowCascade > 4) {
console.warn("Support at most 4 cascade");
continue
}
p.shadowCascade > 1 && (o = p),
this.renderDirectionalLightShadow(e, t, r, p, c, u, h)
} else
"SPOT_LIGHT" === p.type ? this.renderSpotLightShadow(e, t, p, l, s) : "POINT_LIGHT" === p.type && this.renderPointLightShadow(e, t, p, d);
this._shadowMapNumber[p.type]++
}
for (var m in this._shadowMapNumber) {
var g = this._shadowMapNumber[m]
, _ = m + "_SHADOWMAP_COUNT";
for (f = 0; f < this._receivers.length; f++)
(v = this._receivers[f].material).fragmentDefines[_] !== g && (g > 0 ? v.define("fragment", _, g) : v.isDefined("fragment", _) && v.undefine("fragment", _))
}
for (f = 0; f < this._receivers.length; f++) {
var v = this._receivers[f].material;
o ? v.define("fragment", "SHADOW_CASCADE", o.shadowCascade) : v.undefine("fragment", "SHADOW_CASCADE")
}
var y = t.shadowUniforms;
if (h.length > 0) {
var x = h.map(S);
if (y.directionalLightShadowMaps = {
value: h,
type: "tv"
},
y.directionalLightMatrices = {
value: u,
type: "m4v"
},
y.directionalLightShadowMapSizes = {
value: x,
type: "1fv"
},
o) {
var b = c.slice()
, w = c.slice();
b.pop(),
w.shift(),
b.reverse(),
w.reverse(),
u.reverse(),
y.shadowCascadeClipsNear = {
value: b,
type: "1fv"
},
y.shadowCascadeClipsFar = {
value: w,
type: "1fv"
}
}
}
if (s.length > 0) {
var T = s.map(S);
(y = t.shadowUniforms).spotLightShadowMaps = {
value: s,
type: "tv"
},
y.spotLightMatrices = {
value: l,
type: "m4v"
},
y.spotLightShadowMapSizes = {
value: T,
type: "1fv"
}
}
d.length > 0 && (y.pointLightShadowMaps = {
value: d,
type: "tv"
})
}
function S(e) {
return e.height
}
},
renderDirectionalLightShadow: (Ns = new si,
Is = new Ht,
Rs = new ir,
Bs = new Ht,
Fs = new Ht,
zs = new Ht,
Gs = new Ht,
function (e, t, r, i, n, a, o) {
var s = this._getDepthMaterial(i)
, l = {
getMaterial: function (e) {
return e.shadowDepthMaterial || s
},
isMaterialChanged: Os,
getUniform: Ps,
ifRender: function (e) {
return e.castShadow
},
sortCompare: ut.opaqueSortCompare
};
if (!t.viewBoundingBoxLastFrame.isFinite()) {
var h = t.getBoundingBox();
t.viewBoundingBoxLastFrame.copy(h).applyTransform(r.viewMatrix)
}
var u = Math.min(-t.viewBoundingBoxLastFrame.min.z, r.far)
, c = Math.max(-t.viewBoundingBoxLastFrame.max.z, r.near)
, d = this._getDirectionalLightCamera(i, t, r)
, f = zs.array;
Gs.copy(d.projectionMatrix),
Ye.invert(Fs.array, d.worldTransform.array),
Ye.multiply(Fs.array, Fs.array, r.worldTransform.array),
Ye.multiply(f, Gs.array, Fs.array);
for (var p = [], m = r instanceof Ei, g = (r.near + r.far) / (r.near - r.far), _ = 2 * r.near * r.far / (r.near - r.far), v = 0; v <= i.shadowCascade; v++) {
var y = c * Math.pow(u / c, v / i.shadowCascade)
, x = c + (u - c) * v / i.shadowCascade
, b = y * i.cascadeSplitLogFactor + x * (1 - i.cascadeSplitLogFactor);
p.push(b),
n.push(-(-b * g + _) / -b)
}
var w = this._getTexture(i, i.shadowCascade);
o.push(w);
var T = e.viewport
, S = e.gl;
for (this._frameBuffer.attach(w),
this._frameBuffer.bind(e),
S.clear(S.COLOR_BUFFER_BIT | S.DEPTH_BUFFER_BIT),
v = 0; v < i.shadowCascade; v++) {
var M = p[v]
, A = p[v + 1];
m ? Ye.perspective(Is.array, r.fov / 180 * Math.PI, r.aspect, M, A) : Ye.ortho(Is.array, r.left, r.right, r.bottom, r.top, M, A),
Ns.setFromProjection(Is),
Ns.getTransformedBoundingBox(Rs, Fs),
Rs.applyProjection(Gs);
var E = Rs.min.array
, C = Rs.max.array;
E[0] = Math.max(E[0], -1),
E[1] = Math.max(E[1], -1),
C[0] = Math.min(C[0], 1),
C[1] = Math.min(C[1], 1),
Bs.ortho(E[0], C[0], E[1], C[1], 1, -1),
d.projectionMatrix.multiplyLeft(Bs);
var D = i.shadowResolution || 512;
e.setViewport((i.shadowCascade - v - 1) * D, 0, D, D, 1);
var L = t.updateRenderList(d);
e.renderPass(L.opaque, d, l),
this.softShadow === Us.VSM && this._gaussianFilter(e, w, w.width);
var P = new Ht;
P.copy(d.viewMatrix).multiplyLeft(d.projectionMatrix),
a.push(P.array),
d.projectionMatrix.copy(Gs)
}
this._frameBuffer.unbind(e),
e.setViewport(T)
}
),
renderSpotLightShadow: function (e, t, r, i, n) {
var a = this._getTexture(r)
, o = this._getSpotLightCamera(r)
, s = e.gl;
this._frameBuffer.attach(a),
this._frameBuffer.bind(e),
s.clear(s.COLOR_BUFFER_BIT | s.DEPTH_BUFFER_BIT);
var l = this._getDepthMaterial(r)
, h = {
getMaterial: function (e) {
return e.shadowDepthMaterial || l
},
isMaterialChanged: Os,
getUniform: Ps,
ifRender: function (e) {
return e.castShadow
},
sortCompare: ut.opaqueSortCompare
}
, u = t.updateRenderList(o);
e.renderPass(u.opaque, o, h),
this._frameBuffer.unbind(e),
this.softShadow === Us.VSM && this._gaussianFilter(e, a, a.width);
var c = new Ht;
c.copy(o.worldTransform).invert().multiplyLeft(o.projectionMatrix),
n.push(a),
i.push(c.array)
},
renderPointLightShadow: function (e, t, r, i) {
var n = this._getTexture(r)
, a = e.gl;
i.push(n);
var o = this._getDepthMaterial(r)
, s = {
getMaterial: function (e) {
return e.shadowDepthMaterial || o
},
getUniform: Ps,
sortCompare: ut.opaqueSortCompare
}
, l = {
px: [],
py: [],
pz: [],
nx: [],
ny: [],
nz: []
}
, h = new ir
, u = r.getWorldPosition().array
, c = new ir
, d = r.range;
c.min.setArray(u),
c.max.setArray(u);
var f = new vt(d, d, d);
c.max.add(f),
c.min.sub(f);
var p = {
px: !1,
py: !1,
pz: !1,
nx: !1,
ny: !1,
nz: !1
};
t.traverse((function (e) {
if (e.isRenderable() && e.castShadow) {
var t = e.geometry;
if (!t.boundingBox) {
for (var r = 0; r < Ls.length; r++)
l[Ls[r]].push(e);
return
}
if (h.transformFrom(t.boundingBox, e.worldTransform),
!h.intersectBoundingBox(c))
return;
for (h.updateVertices(),
r = 0; r < Ls.length; r++)
p[Ls[r]] = !1;
for (r = 0; r < 8; r++) {
var i = h.vertices[r]
, n = i[0] - u[0]
, a = i[1] - u[1]
, o = i[2] - u[2]
, s = Math.abs(n)
, d = Math.abs(a)
, f = Math.abs(o);
s > d ? s > f ? p[n > 0 ? "px" : "nx"] = !0 : p[o > 0 ? "pz" : "nz"] = !0 : d > f ? p[a > 0 ? "py" : "ny"] = !0 : p[o > 0 ? "pz" : "nz"] = !0
}
for (r = 0; r < Ls.length; r++)
p[Ls[r]] && l[Ls[r]].push(e)
}
}
));
for (var m = 0; m < 6; m++) {
var g = Ls[m]
, _ = this._getPointLightCamera(r, g);
this._frameBuffer.attach(n, a.COLOR_ATTACHMENT0, a.TEXTURE_CUBE_MAP_POSITIVE_X + m),
this._frameBuffer.bind(e),
a.clear(a.COLOR_BUFFER_BIT | a.DEPTH_BUFFER_BIT),
e.renderPass(l[g], _, s)
}
this._frameBuffer.unbind(e)
},
_getDepthMaterial: function (e) {
var t = this._lightMaterials[e.__uid__]
, r = "POINT_LIGHT" === e.type;
if (!t) {
var i = r ? "clay.sm.distance." : "clay.sm.depth.";
t = new le({
precision: this.precision,
shader: new Xe(Xe.source(i + "vertex"), Xe.source(i + "fragment"))
}),
this._lightMaterials[e.__uid__] = t
}
return null != e.shadowSlopeScale && t.setUniform("slopeScale", e.shadowSlopeScale),
null != e.shadowBias && t.setUniform("bias", e.shadowBias),
this.softShadow === Us.VSM ? t.define("fragment", "USE_VSM") : t.undefine("fragment", "USE_VSM"),
r && (t.set("lightPosition", e.getWorldPosition().array),
t.set("range", e.range)),
t
},
_gaussianFilter: function (e, t, r) {
var i = {
width: r,
height: r,
type: wr.FLOAT
}
, n = this._texturePool.get(i);
this._frameBuffer.attach(n),
this._frameBuffer.bind(e),
this._gaussianPassH.setUniform("texture", t),
this._gaussianPassH.setUniform("textureWidth", r),
this._gaussianPassH.render(e),
this._frameBuffer.attach(t),
this._gaussianPassV.setUniform("texture", n),
this._gaussianPassV.setUniform("textureHeight", r),
this._gaussianPassV.render(e),
this._frameBuffer.unbind(e),
this._texturePool.put(n)
},
_getTexture: function (e, t) {
var r = e.__uid__
, i = this._textures[r]
, n = e.shadowResolution || 512;
return t = t || 1,
i || ((i = "POINT_LIGHT" === e.type ? new Ai : new Dr).width = n * t,
i.height = n,
this.softShadow === Us.VSM ? (i.type = wr.FLOAT,
i.anisotropic = 4) : (i.minFilter = E,
i.magFilter = E,
i.useMipmap = !1),
this._textures[r] = i),
i
},
_getPointLightCamera: function (e, t) {
this._lightCameras.point || (this._lightCameras.point = {
px: new Ei,
nx: new Ei,
py: new Ei,
ny: new Ei,
pz: new Ei,
nz: new Ei
});
var r = this._lightCameras.point[t];
switch (r.far = e.range,
r.fov = 90,
r.position.set(0, 0, 0),
t) {
case "px":
r.lookAt(vt.POSITIVE_X, vt.NEGATIVE_Y);
break;
case "nx":
r.lookAt(vt.NEGATIVE_X, vt.NEGATIVE_Y);
break;
case "py":
r.lookAt(vt.POSITIVE_Y, vt.POSITIVE_Z);
break;
case "ny":
r.lookAt(vt.NEGATIVE_Y, vt.NEGATIVE_Z);
break;
case "pz":
r.lookAt(vt.POSITIVE_Z, vt.NEGATIVE_Y);
break;
case "nz":
r.lookAt(vt.NEGATIVE_Z, vt.NEGATIVE_Y)
}
return e.getWorldPosition(r.position),
r.update(),
r
},
_getDirectionalLightCamera: function () {
var e = new Ht
, t = new ir
, r = new ir;
return function (i, n, a) {
this._lightCameras.directional || (this._lightCameras.directional = new un);
var o = this._lightCameras.directional;
t.copy(n.viewBoundingBoxLastFrame),
t.intersection(a.frustum.boundingBox),
o.position.copy(t.min).add(t.max).scale(.5).transformMat4(a.worldTransform),
o.rotation.copy(i.rotation),
o.scale.copy(i.scale),
o.updateWorldTransform(),
Ht.invert(e, o.worldTransform),
Ht.multiply(e, e, a.worldTransform),
r.copy(t).applyTransform(e);
var s = r.min.array
, l = r.max.array;
return o.position.set((s[0] + l[0]) / 2, (s[1] + l[1]) / 2, l[2]).transformMat4(o.worldTransform),
o.near = 0,
o.far = -s[2] + l[2],
isNaN(this.lightFrustumBias) ? o.far *= 4 : o.far += this.lightFrustumBias,
o.left = s[0],
o.right = l[0],
o.top = l[1],
o.bottom = s[1],
o.update(!0),
o
}
}(),
_getSpotLightCamera: function (e) {
this._lightCameras.spot || (this._lightCameras.spot = new Ei);
var t = this._lightCameras.spot;
return t.fov = 2 * e.penumbraAngle,
t.far = e.range,
t.worldTransform.copy(e.worldTransform),
t.updateProjectionMatrix(),
Ye.invert(t.viewMatrix.array, t.worldTransform.array),
t
},
dispose: function (e) {
var t = e.gl || e;
for (var r in this._frameBuffer && this._frameBuffer.dispose(t),
this._textures)
this._textures[r].dispose(t);
this._texturePool.clear(e.gl),
this._depthMaterials = {},
this._distanceMaterials = {},
this._textures = {},
this._lightCameras = {},
this._shadowMapNumber = {
POINT_LIGHT: 0,
DIRECTIONAL_LIGHT: 0,
SPOT_LIGHT: 0
},
this._meshMaterials = {};
for (var i = 0; i < this._receivers.length; i++) {
var n = this._receivers[i];
if (n.material) {
var a = n.material;
a.undefine("fragment", "POINT_LIGHT_SHADOW_COUNT"),
a.undefine("fragment", "DIRECTIONAL_LIGHT_SHADOW_COUNT"),
a.undefine("fragment", "AMBIENT_LIGHT_SHADOW_COUNT"),
a.set("shadowEnabled", 0)
}
}
this._receivers = [],
this._lightsCastShadow = []
}
});
Us.VSM = 1,
Us.PCF = 2;
const ks = Us
, Vs = m.extend((function () {
return {
name: "",
inputLinks: {},
outputLinks: {},
_prevOutputTextures: {},
_outputTextures: {},
_outputReferences: {},
_rendering: !1,
_rendered: !1,
_compositor: null
}
}
), {
updateParameter: function (e, t) {
var r, i, n = this.outputs[e], a = n.parameters, o = n._parametersCopy;
if (o || (o = n._parametersCopy = {}),
a)
for (var s in a)
"width" !== s && "height" !== s && (o[s] = a[s]);
return r = a.width instanceof Function ? a.width.call(this, t) : a.width,
i = a.height instanceof Function ? a.height.call(this, t) : a.height,
o.width === r && o.height === i || this._outputTextures[e] && this._outputTextures[e].dispose(t.gl),
o.width = r,
o.height = i,
o
},
setParameter: function (e, t) { },
getParameter: function (e) { },
setParameters: function (e) {
for (var t in e)
this.setParameter(t, e[t])
},
render: function () { },
getOutput: function (e, t) {
if (null == t)
return t = e,
this._outputTextures[t];
var r = this.outputs[t];
return r ? this._rendered ? r.outputLastFrame ? this._prevOutputTextures[t] : this._outputTextures[t] : this._rendering ? (this._prevOutputTextures[t] || (this._prevOutputTextures[t] = this._compositor.allocateTexture(r.parameters || {})),
this._prevOutputTextures[t]) : (this.render(e),
this._outputTextures[t]) : void 0
},
removeReference: function (e) {
this._outputReferences[e]--,
0 === this._outputReferences[e] && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]),
this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
},
link: function (e, t, r) {
this.inputLinks[e] = {
node: t,
pin: r
},
t.outputLinks[r] || (t.outputLinks[r] = []),
t.outputLinks[r].push({
node: this,
pin: e
}),
this.pass.material.enableTexture(e)
},
clear: function () {
this.inputLinks = {},
this.outputLinks = {}
},
updateReference: function (e) {
if (!this._rendering) {
for (var t in this._rendering = !0,
this.inputLinks) {
var r = this.inputLinks[t];
r.node.updateReference(r.pin)
}
this._rendering = !1
}
e && this._outputReferences[e]++
},
beforeFrame: function () {
for (var e in this._rendered = !1,
this.outputLinks)
this._outputReferences[e] = 0
},
afterFrame: function () {
for (var e in this.outputLinks)
this._outputReferences[e] > 0 && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]),
this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
}
})
, Hs = m.extend((function () {
return {
nodes: []
}
}
), {
dirty: function () {
this._dirty = !0
},
addNode: function (e) {
this.nodes.indexOf(e) >= 0 || (this.nodes.push(e),
this._dirty = !0)
},
removeNode: function (e) {
"string" == typeof e && (e = this.getNodeByName(e));
var t = this.nodes.indexOf(e);
t >= 0 && (this.nodes.splice(t, 1),
this._dirty = !0)
},
getNodeByName: function (e) {
for (var t = 0; t < this.nodes.length; t++)
if (this.nodes[t].name === e)
return this.nodes[t]
},
update: function () {
for (var e = 0; e < this.nodes.length; e++)
this.nodes[e].clear();
for (e = 0; e < this.nodes.length; e++) {
var t = this.nodes[e];
if (t.inputs)
for (var r in t.inputs)
if (t.inputs[r])
if (!t.pass || t.pass.material.isUniformEnabled(r)) {
var i = t.inputs[r]
, n = this.findPin(i);
n ? t.link(r, n.node, n.pin) : "string" == typeof i ? console.warn("Node " + i + " not exist") : console.warn("Pin of " + i.node + "." + i.pin + " not exist")
} else
console.warn("Pin " + t.name + "." + r + " not used.")
}
},
findPin: function (e) {
var t;
if (("string" == typeof e || e instanceof Vs) && (e = {
node: e
}),
"string" == typeof e.node)
for (var r = 0; r < this.nodes.length; r++) {
var i = this.nodes[r];
i.name === e.node && (t = i)
}
else
t = e.node;
if (t) {
var n = e.pin;
if (n || t.outputs && (n = Object.keys(t.outputs)[0]),
t.outputs[n])
return {
node: t,
pin: n
}
}
}
})
, Ws = Hs.extend((function () {
return {
_outputs: [],
_texturePool: new Ds,
_frameBuffer: new zi({
depthBuffer: !1
})
}
}
), {
addNode: function (e) {
Hs.prototype.addNode.call(this, e),
e._compositor = this
},
render: function (e, t) {
if (this._dirty) {
this.update(),
this._dirty = !1,
this._outputs.length = 0;
for (var r = 0; r < this.nodes.length; r++)
this.nodes[r].outputs || this._outputs.push(this.nodes[r])
}
for (r = 0; r < this.nodes.length; r++)
this.nodes[r].beforeFrame();
for (r = 0; r < this._outputs.length; r++)
this._outputs[r].updateReference();
for (r = 0; r < this._outputs.length; r++)
this._outputs[r].render(e, t);
for (r = 0; r < this.nodes.length; r++)
this.nodes[r].afterFrame()
},
allocateTexture: function (e) {
return this._texturePool.get(e)
},
releaseTexture: function (e) {
this._texturePool.put(e)
},
getFrameBuffer: function () {
return this._frameBuffer
},
dispose: function (e) {
this._texturePool.clear(e)
}
})
, js = Vs.extend({
name: "scene",
scene: null,
camera: null,
autoUpdateScene: !0,
preZ: !1
}, (function () {
this.frameBuffer = new zi
}
), {
render: function (e) {
this._rendering = !0;
var t, r = e.gl;
if (this.trigger("beforerender"),
this.outputs) {
var i = this.frameBuffer;
for (var n in this.outputs) {
var a = this.updateParameter(n, e)
, o = this.outputs[n]
, s = this._compositor.allocateTexture(a);
this._outputTextures[n] = s,
"string" == typeof (u = o.attachment || r.COLOR_ATTACHMENT0) && (u = r[u]),
i.attach(s, u)
}
i.bind(e);
var l = e.getGLExtension("EXT_draw_buffers");
if (l) {
var h = [];
for (var u in this.outputs)
(u = parseInt(u)) >= r.COLOR_ATTACHMENT0 && u <= r.COLOR_ATTACHMENT0 + 8 && h.push(u);
l.drawBuffersEXT(h)
}
e.saveClear(),
e.clearBit = 16640,
t = e.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ),
e.restoreClear(),
i.unbind(e)
} else
t = e.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ);
this.trigger("afterrender", t),
this._rendering = !1,
this._rendered = !0
}
})
, Xs = Vs.extend((function () {
return {
texture: null,
outputs: {
color: {}
}
}
}
), (function () { }
), {
getOutput: function (e, t) {
return this.texture
},
beforeFrame: function () { },
afterFrame: function () { }
})
, qs = Vs.extend((function () {
return {
name: "",
inputs: {},
outputs: null,
shader: "",
inputLinks: {},
outputLinks: {},
pass: null,
_prevOutputTextures: {},
_outputTextures: {},
_outputReferences: {},
_rendering: !1,
_rendered: !1,
_compositor: null
}
}
), (function () {
var e = new pn({
fragment: this.shader
});
this.pass = e
}
), {
render: function (e, t) {
this.trigger("beforerender", e),
this._rendering = !0;
var r = e.gl;
for (var i in this.inputLinks) {
var n = (c = this.inputLinks[i]).node.getOutput(e, c.pin);
this.pass.setUniform(i, n)
}
if (this.outputs) {
this.pass.outputs = {};
var a = {};
for (var o in this.outputs) {
var s = this.updateParameter(o, e);
isNaN(s.width) && this.updateParameter(o, e);
var l = this.outputs[o]
, h = this._compositor.allocateTexture(s);
this._outputTextures[o] = h,
"string" == typeof (u = l.attachment || r.COLOR_ATTACHMENT0) && (u = r[u]),
a[u] = h
}
for (var u in this._compositor.getFrameBuffer().bind(e),
a)
this._compositor.getFrameBuffer().attach(a[u], u);
this.pass.render(e),
this._compositor.getFrameBuffer().updateMipmap(e)
} else
this.pass.outputs = null,
this._compositor.getFrameBuffer().unbind(e),
this.pass.render(e, t);
for (var i in this.inputLinks) {
var c;
(c = this.inputLinks[i]).node.removeReference(c.pin)
}
this._rendering = !1,
this._rendered = !0,
this.trigger("afterrender", e)
},
updateParameter: function (e, t) {
var r, i, n = this.outputs[e], a = n.parameters, o = n._parametersCopy;
if (o || (o = n._parametersCopy = {}),
a)
for (var s in a)
"width" !== s && "height" !== s && (o[s] = a[s]);
return r = "function" == typeof a.width ? a.width.call(this, t) : a.width,
i = "function" == typeof a.height ? a.height.call(this, t) : a.height,
r = Math.ceil(r),
i = Math.ceil(i),
o.width === r && o.height === i || this._outputTextures[e] && this._outputTextures[e].dispose(t),
o.width = r,
o.height = i,
o
},
setParameter: function (e, t) {
this.pass.setUniform(e, t)
},
getParameter: function (e) {
return this.pass.getUniform(e)
},
setParameters: function (e) {
for (var t in e)
this.setParameter(t, e[t])
},
define: function (e, t) {
this.pass.material.define("fragment", e, t)
},
undefine: function (e) {
this.pass.material.undefine("fragment", e)
},
removeReference: function (e) {
this._outputReferences[e]--,
0 === this._outputReferences[e] && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]),
this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
},
clear: function () {
Vs.prototype.clear.call(this),
this.pass.material.disableTexturesAll()
}
})
, Zs = "@export clay.compositor.kernel.gaussian_9\nfloat gaussianKernel[9];\ngaussianKernel[0] = 0.07;\ngaussianKernel[1] = 0.09;\ngaussianKernel[2] = 0.12;\ngaussianKernel[3] = 0.14;\ngaussianKernel[4] = 0.16;\ngaussianKernel[5] = 0.14;\ngaussianKernel[6] = 0.12;\ngaussianKernel[7] = 0.09;\ngaussianKernel[8] = 0.07;\n@end\n@export clay.compositor.kernel.gaussian_13\nfloat gaussianKernel[13];\ngaussianKernel[0] = 0.02;\ngaussianKernel[1] = 0.03;\ngaussianKernel[2] = 0.06;\ngaussianKernel[3] = 0.08;\ngaussianKernel[4] = 0.11;\ngaussianKernel[5] = 0.13;\ngaussianKernel[6] = 0.14;\ngaussianKernel[7] = 0.13;\ngaussianKernel[8] = 0.11;\ngaussianKernel[9] = 0.08;\ngaussianKernel[10] = 0.06;\ngaussianKernel[11] = 0.03;\ngaussianKernel[12] = 0.02;\n@end\n@export clay.compositor.gaussian_blur\n#define SHADER_NAME gaussian_blur\nuniform sampler2D texture;varying vec2 v_Texcoord;\nuniform float blurSize : 2.0;\nuniform vec2 textureSize : [512.0, 512.0];\nuniform float blurDir : 0.0;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main (void)\n{\n @import clay.compositor.kernel.gaussian_9\n vec2 off = blurSize / textureSize;\n off *= vec2(1.0 - blurDir, blurDir);\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n for (int i = 0; i < 9; i++) {\n float w = gaussianKernel[i];\n vec4 texel = decodeHDR(clampSample(texture, v_Texcoord + float(i - 4) * off));\n sum += texel * w;\n weightAll += w;\n }\n gl_FragColor = encodeHDR(sum / max(weightAll, 0.01));\n}\n@end\n"
, Ys = "\n@export clay.compositor.lut\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform sampler2D lookup;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n float blueColor = tex.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec4 newColor1 = texture2D(lookup, texPos1);\n vec4 newColor2 = texture2D(lookup, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n gl_FragColor = vec4(newColor.rgb, tex.w);\n}\n@end"
, Ks = "@export clay.compositor.output\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = tex.rgb;\n#ifdef OUTPUT_ALPHA\n gl_FragColor.a = tex.a;\n#else\n gl_FragColor.a = 1.0;\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"
, Qs = "@export clay.compositor.bright\nuniform sampler2D texture;\nuniform float threshold : 1;\nuniform float scale : 1.0;\nuniform vec2 textureSize: [512, 512];\nvarying vec2 v_Texcoord;\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvec4 median(vec4 a, vec4 b, vec4 c)\n{\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n#ifdef ANTI_FLICKER\n vec3 d = 1.0 / textureSize.xyx * vec3(1.0, 1.0, 0.0);\n vec4 s1 = decodeHDR(texture2D(texture, v_Texcoord - d.xz));\n vec4 s2 = decodeHDR(texture2D(texture, v_Texcoord + d.xz));\n vec4 s3 = decodeHDR(texture2D(texture, v_Texcoord - d.zy));\n vec4 s4 = decodeHDR(texture2D(texture, v_Texcoord + d.zy));\n texel = median(median(texel, s1, s2), s3, s4);\n#endif\n float lum = dot(texel.rgb , lumWeight);\n vec4 color;\n if (lum > threshold && texel.a > 0.0)\n {\n color = vec4(texel.rgb * scale, texel.a * scale);\n }\n else\n {\n color = vec4(0.0);\n }\n gl_FragColor = encodeHDR(color);\n}\n@end\n"
, Js = "@export clay.compositor.downsample\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat brightness(vec3 c)\n{\n return max(max(c.r, c.g), c.b);\n}\n@import clay.util.clamp_sample\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n#ifdef ANTI_FLICKER\n vec3 s1 = decodeHDR(clampSample(texture, v_Texcoord + d.xy)).rgb;\n vec3 s2 = decodeHDR(clampSample(texture, v_Texcoord + d.zy)).rgb;\n vec3 s3 = decodeHDR(clampSample(texture, v_Texcoord + d.xw)).rgb;\n vec3 s4 = decodeHDR(clampSample(texture, v_Texcoord + d.zw)).rgb;\n float s1w = 1.0 / (brightness(s1) + 1.0);\n float s2w = 1.0 / (brightness(s2) + 1.0);\n float s3w = 1.0 / (brightness(s3) + 1.0);\n float s4w = 1.0 / (brightness(s4) + 1.0);\n float oneDivideSum = 1.0 / (s1w + s2w + s3w + s4w);\n vec4 color = vec4(\n (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * oneDivideSum,\n 1.0\n );\n#else\n vec4 color = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n color *= 0.25;\n#endif\n gl_FragColor = encodeHDR(color);\n}\n@end"
, $s = "\n@export clay.compositor.upsample\n#define HIGH_QUALITY\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord - d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord - d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord - d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord )) * 4.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n gl_FragColor = encodeHDR(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n gl_FragColor = encodeHDR(s / 4.0);\n#endif\n}\n@end"
, el = "@export clay.compositor.hdr.composite\n#define TONEMAPPING\nuniform sampler2D texture;\n#ifdef BLOOM_ENABLED\nuniform sampler2D bloom;\n#endif\n#ifdef LENSFLARE_ENABLED\nuniform sampler2D lensflare;\nuniform sampler2D lensdirt;\n#endif\n#ifdef LUM_ENABLED\nuniform sampler2D lum;\n#endif\n#ifdef LUT_ENABLED\nuniform sampler2D lut;\n#endif\n#ifdef COLOR_CORRECTION\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float saturation : 1.0;\n#endif\n#ifdef VIGNETTE\nuniform float vignetteDarkness: 1.0;\nuniform float vignetteOffset: 1.0;\n#endif\nuniform float exposure : 1.0;\nuniform float bloomIntensity : 0.25;\nuniform float lensflareIntensity : 1;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nfloat eyeAdaption(float fLum)\n{\n return mix(0.2, fLum, 0.5);\n}\n#ifdef LUT_ENABLED\nvec3 lutTransform(vec3 color) {\n float blueColor = color.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec4 newColor1 = texture2D(lut, texPos1);\n vec4 newColor2 = texture2D(lut, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n return newColor.rgb;\n}\n#endif\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = vec4(0.0);\n vec4 originalTexel = vec4(0.0);\n#ifdef TEXTURE_ENABLED\n texel = decodeHDR(texture2D(texture, v_Texcoord));\n originalTexel = texel;\n#endif\n#ifdef BLOOM_ENABLED\n vec4 bloomTexel = decodeHDR(texture2D(bloom, v_Texcoord));\n texel.rgb += bloomTexel.rgb * bloomIntensity;\n texel.a += bloomTexel.a * bloomIntensity;\n#endif\n#ifdef LENSFLARE_ENABLED\n texel += decodeHDR(texture2D(lensflare, v_Texcoord)) * texture2D(lensdirt, v_Texcoord) * lensflareIntensity;\n#endif\n texel.a = min(texel.a, 1.0);\n#ifdef LUM_ENABLED\n float fLum = texture2D(lum, vec2(0.5, 0.5)).r;\n float adaptedLumDest = 3.0 / (max(0.1, 1.0 + 10.0*eyeAdaption(fLum)));\n float exposureBias = adaptedLumDest * exposure;\n#else\n float exposureBias = exposure;\n#endif\n#ifdef TONEMAPPING\n texel.rgb *= exposureBias;\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n texel = linearTosRGB(texel);\n#ifdef LUT_ENABLED\n texel.rgb = lutTransform(clamp(texel.rgb,vec3(0.0),vec3(1.0)));\n#endif\n#ifdef COLOR_CORRECTION\n texel.rgb = clamp(texel.rgb + vec3(brightness), 0.0, 1.0);\n texel.rgb = clamp((texel.rgb - vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n float lum = dot(texel.rgb, vec3(0.2125, 0.7154, 0.0721));\n texel.rgb = mix(vec3(lum), texel.rgb, saturation);\n#endif\n#ifdef VIGNETTE\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(vignetteOffset);\n texel.rgb = mix(texel.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\n#endif\n gl_FragColor = encodeHDR(texel);\n#ifdef DEBUG\n #if DEBUG == 1\n gl_FragColor = encodeHDR(decodeHDR(texture2D(texture, v_Texcoord)));\n #elif DEBUG == 2\n gl_FragColor = encodeHDR(decodeHDR(texture2D(bloom, v_Texcoord)) * bloomIntensity);\n #elif DEBUG == 3\n gl_FragColor = encodeHDR(decodeHDR(texture2D(lensflare, v_Texcoord) * lensflareIntensity));\n #endif\n#endif\n if (originalTexel.a <= 0.01 && gl_FragColor.a > 1e-5) {\n gl_FragColor.a = dot(gl_FragColor.rgb, vec3(0.2125, 0.7154, 0.0721));\n }\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"
, tl = "@export clay.compositor.blend\n#define SHADER_NAME blend\n#ifdef TEXTURE1_ENABLED\nuniform sampler2D texture1;\nuniform float weight1 : 1.0;\n#endif\n#ifdef TEXTURE2_ENABLED\nuniform sampler2D texture2;\nuniform float weight2 : 1.0;\n#endif\n#ifdef TEXTURE3_ENABLED\nuniform sampler2D texture3;\nuniform float weight3 : 1.0;\n#endif\n#ifdef TEXTURE4_ENABLED\nuniform sampler2D texture4;\nuniform float weight4 : 1.0;\n#endif\n#ifdef TEXTURE5_ENABLED\nuniform sampler2D texture5;\nuniform float weight5 : 1.0;\n#endif\n#ifdef TEXTURE6_ENABLED\nuniform sampler2D texture6;\nuniform float weight6 : 1.0;\n#endif\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = vec4(0.0);\n#ifdef TEXTURE1_ENABLED\n tex += decodeHDR(texture2D(texture1, v_Texcoord)) * weight1;\n#endif\n#ifdef TEXTURE2_ENABLED\n tex += decodeHDR(texture2D(texture2, v_Texcoord)) * weight2;\n#endif\n#ifdef TEXTURE3_ENABLED\n tex += decodeHDR(texture2D(texture3, v_Texcoord)) * weight3;\n#endif\n#ifdef TEXTURE4_ENABLED\n tex += decodeHDR(texture2D(texture4, v_Texcoord)) * weight4;\n#endif\n#ifdef TEXTURE5_ENABLED\n tex += decodeHDR(texture2D(texture5, v_Texcoord)) * weight5;\n#endif\n#ifdef TEXTURE6_ENABLED\n tex += decodeHDR(texture2D(texture6, v_Texcoord)) * weight6;\n#endif\n gl_FragColor = encodeHDR(tex);\n}\n@end"
, rl = "@export clay.compositor.fxaa\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nvarying vec2 v_Texcoord;\n#define FXAA_REDUCE_MIN (1.0/128.0)\n#define FXAA_REDUCE_MUL (1.0/8.0)\n#define FXAA_SPAN_MAX 8.0\n@import clay.util.rgbm\nvoid main()\n{\n vec2 resolution = 1.0 / viewport.zw;\n vec3 rgbNW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbNE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ) ).xyz;\n vec4 rgbaM = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution ) );\n vec3 rgbM = rgbaM.xyz;\n float opacity = rgbaM.w;\n vec3 luma = vec3( 0.299, 0.587, 0.114 );\n float lumaNW = dot( rgbNW, luma );\n float lumaNE = dot( rgbNE, luma );\n float lumaSW = dot( rgbSW, luma );\n float lumaSE = dot( rgbSE, luma );\n float lumaM = dot( rgbM, luma );\n float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\n float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\n vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\n float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\n dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * resolution;\n vec3 rgbA = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA *= 0.5;\n vec3 rgbB = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * -0.5 ) ).xyz;\n rgbB += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * 0.5 ) ).xyz;\n rgbB *= 0.25;\n rgbB += rgbA * 0.5;\n float lumaB = dot( rgbB, luma );\n if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) )\n {\n gl_FragColor = vec4( rgbA, opacity );\n }\n else {\n gl_FragColor = vec4( rgbB, opacity );\n }\n}\n@end";
!function (e) {
e.import("@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"),
e.import(Zs),
e.import("@export clay.compositor.hdr.log_lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n float luminance = dot(tex.rgb, w);\n luminance = log(luminance + 0.001);\n gl_FragColor = encodeHDR(vec4(vec3(luminance), 1.0));\n}\n@end\n@export clay.compositor.hdr.lum_adaption\nvarying vec2 v_Texcoord;\nuniform sampler2D adaptedLum;\nuniform sampler2D currentLum;\nuniform float frameTime : 0.02;\n@import clay.util.rgbm\nvoid main()\n{\n float fAdaptedLum = decodeHDR(texture2D(adaptedLum, vec2(0.5, 0.5))).r;\n float fCurrentLum = exp(encodeHDR(texture2D(currentLum, vec2(0.5, 0.5))).r);\n fAdaptedLum += (fCurrentLum - fAdaptedLum) * (1.0 - pow(0.98, 30.0 * frameTime));\n gl_FragColor = encodeHDR(vec4(vec3(fAdaptedLum), 1.0));\n}\n@end\n@export clay.compositor.lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord );\n float luminance = dot(tex.rgb, w);\n gl_FragColor = vec4(vec3(luminance), 1.0);\n}\n@end"),
e.import(Ys),
e.import("@export clay.compositor.vignette\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float darkness: 1;\nuniform float offset: 1;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = texel.rgb;\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(offset);\n gl_FragColor = encodeHDR(vec4(mix(texel.rgb, vec3(1.0 - darkness), dot(uv, uv)), texel.a));\n}\n@end"),
e.import(Ks),
e.import(Qs),
e.import(Js),
e.import($s),
e.import(el),
e.import("@export clay.compositor.lensflare\n#define SAMPLE_NUMBER 8\nuniform sampler2D texture;\nuniform sampler2D lenscolor;\nuniform vec2 textureSize : [512, 512];\nuniform float dispersal : 0.3;\nuniform float haloWidth : 0.4;\nuniform float distortion : 1.0;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvec4 textureDistorted(\n in vec2 texcoord,\n in vec2 direction,\n in vec3 distortion\n) {\n return vec4(\n decodeHDR(texture2D(texture, texcoord + direction * distortion.r)).r,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.g)).g,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.b)).b,\n 1.0\n );\n}\nvoid main()\n{\n vec2 texcoord = -v_Texcoord + vec2(1.0); vec2 textureOffset = 1.0 / textureSize;\n vec2 ghostVec = (vec2(0.5) - texcoord) * dispersal;\n vec2 haloVec = normalize(ghostVec) * haloWidth;\n vec3 distortion = vec3(-textureOffset.x * distortion, 0.0, textureOffset.x * distortion);\n vec4 result = vec4(0.0);\n for (int i = 0; i < SAMPLE_NUMBER; i++)\n {\n vec2 offset = fract(texcoord + ghostVec * float(i));\n float weight = length(vec2(0.5) - offset) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n }\n result *= texture2D(lenscolor, vec2(length(vec2(0.5) - texcoord)) / length(vec2(0.5)));\n float weight = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n vec2 offset = fract(texcoord + haloVec);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n gl_FragColor = result;\n}\n@end"),
e.import(tl),
e.import(rl)
}(Xe);
var il = /^#source\((.*?)\)/;
function nl(e, t, r) {
var i, n, a, o, s = e.type || "filter";
if ("filter" === s) {
var l = e.shader.trim()
, h = il.exec(l);
if (h ? i = Xe.source(h[1].trim()) : "#" === l.charAt(0) && (i = t.shaders[l.substr(1)]),
i || (i = l),
!i)
return
}
if (e.inputs)
for (var u in n = {},
e.inputs)
"string" == typeof e.inputs[u] ? n[u] = e.inputs[u] : n[u] = {
node: e.inputs[u].node,
pin: e.inputs[u].pin
};
if (e.outputs)
for (var u in a = {},
e.outputs) {
var c = e.outputs[u];
a[u] = {},
null != c.attachment && (a[u].attachment = c.attachment),
null != c.keepLastFrame && (a[u].keepLastFrame = c.keepLastFrame),
null != c.outputLastFrame && (a[u].outputLastFrame = c.outputLastFrame),
c.parameters && (a[u].parameters = sl(c.parameters))
}
if (o = "scene" === s ? new js({
name: e.name,
scene: r.scene,
camera: r.camera,
outputs: a
}) : "texture" === s ? new Xs({
name: e.name,
outputs: a
}) : new qs({
name: e.name,
shader: i,
inputs: n,
outputs: a
})) {
if (e.parameters)
for (var u in e.parameters)
"string" == typeof (d = e.parameters[u]) ? "#" === (d = d.trim()).charAt(0) ? d = t.textures[d.substr(1)] : o.on("beforerender", ll(u, hl(d))) : "function" == typeof d && o.on("beforerender", d),
o.setParameter(u, d);
if (e.defines && o.pass)
for (var u in e.defines) {
var d = e.defines[u];
o.pass.material.define("fragment", u, d)
}
}
return o
}
function al(e, t) {
return e
}
function ol(e, t) {
return t
}
function sl(e) {
var t = {};
if (!e)
return t;
["type", "minFilter", "magFilter", "wrapS", "wrapT", "flipY", "useMipmap"].forEach((function (r) {
var i = e[r];
null != i && ("string" == typeof i && (i = wr[i]),
t[r] = i)
}
));
var r = e.scale || 1;
return ["width", "height"].forEach((function (i) {
if (null != e[i]) {
var n = e[i];
"string" == typeof n ? (n = n.trim(),
t[i] = (a = hl(n),
o = (o = r) || 1,
function (e) {
var t = e.getDevicePixelRatio()
, r = e.getWidth() * o
, i = e.getHeight() * o;
return a(r, i, t)
}
)) : t[i] = n
}
var a, o
}
)),
t.width || (t.width = al),
t.height || (t.height = ol),
null != e.useMipmap && (t.useMipmap = e.useMipmap),
t
}
function ll(e, t) {
return function (r) {
var i = r.getDevicePixelRatio()
, n = r.getWidth()
, a = r.getHeight()
, o = t(n, a, i);
this.setParameter(e, o)
}
}
function hl(e) {
var t = /^expr\((.*)\)$/.exec(e);
if (t)
try {
var r = new Function("width", "height", "dpr", "return " + t[1]);
return r(1, 1),
r
} catch (e) {
throw new Error("Invalid expression.")
}
}
const ul = function (e, t) {
for (var r = 0, i = 1 / t, n = e; n > 0;)
r += i * (n % t),
n = Math.floor(n / t),
i /= t;
return r
};
function cl(e) {
for (var t = new Uint8Array(e * e * 4), r = 0, i = new vt, n = 0; n < e; n++)
for (var a = 0; a < e; a++)
i.set(2 * Math.random() - 1, 2 * Math.random() - 1, 0).normalize(),
t[r++] = 255 * (.5 * i.x + .5),
t[r++] = 255 * (.5 * i.y + .5),
t[r++] = 0,
t[r++] = 255;
return t
}
function dl(e) {
return new Dr({
pixels: cl(e),
wrapS: wr.REPEAT,
wrapT: wr.REPEAT,
width: e,
height: e
})
}
function fl(e, t, r) {
var i = new Float32Array(3 * e);
t = t || 0;
for (var n = 0; n < e; n++) {
var a = ul(n + t, 2) * (r ? 1 : 2) * Math.PI
, o = ul(n + t, 3) * Math.PI
, s = Math.random()
, l = Math.cos(a) * Math.sin(o) * s
, h = Math.cos(o) * s
, u = Math.sin(a) * Math.sin(o) * s;
i[3 * n] = l,
i[3 * n + 1] = h,
i[3 * n + 2] = u
}
return i
}
function pl(e) {
e = e || {},
this._ssaoPass = new pn({
fragment: Xe.source("ecgl.ssao.estimate")
}),
this._blurPass = new pn({
fragment: Xe.source("ecgl.ssao.blur")
}),
this._framebuffer = new zi({
depthBuffer: !1
}),
this._ssaoTexture = new Dr,
this._blurTexture = new Dr,
this._blurTexture2 = new Dr,
this._depthTex = e.depthTexture,
this._normalTex = e.normalTexture,
this.setNoiseSize(4),
this.setKernelSize(e.kernelSize || 12),
null != e.radius && this.setParameter("radius", e.radius),
null != e.power && this.setParameter("power", e.power),
this._normalTex || (this._ssaoPass.material.disableTexture("normalTex"),
this._blurPass.material.disableTexture("normalTex")),
this._depthTex || this._blurPass.material.disableTexture("depthTex"),
this._blurPass.material.setUniform("normalTex", this._normalTex),
this._blurPass.material.setUniform("depthTex", this._depthTex)
}
Xe.import("@export ecgl.ssao.estimate\n\nuniform sampler2D depthTex;\n\nuniform sampler2D normalTex;\n\nuniform sampler2D noiseTex;\n\nuniform vec2 depthTexSize;\n\nuniform vec2 noiseTexSize;\n\nuniform mat4 projection;\n\nuniform mat4 projectionInv;\n\nuniform mat4 viewInverseTranspose;\n\nuniform vec3 kernel[KERNEL_SIZE];\n\nuniform float radius : 1;\n\nuniform float power : 1;\n\nuniform float bias: 1e-2;\n\nuniform float intensity: 1.0;\n\nvarying vec2 v_Texcoord;\n\nfloat ssaoEstimator(in vec3 originPos, in mat3 kernelBasis) {\n float occlusion = 0.0;\n\n for (int i = 0; i < KERNEL_SIZE; i++) {\n vec3 samplePos = kernel[i];\n#ifdef NORMALTEX_ENABLED\n samplePos = kernelBasis * samplePos;\n#endif\n samplePos = samplePos * radius + originPos;\n\n vec4 texCoord = projection * vec4(samplePos, 1.0);\n texCoord.xy /= texCoord.w;\n\n vec4 depthTexel = texture2D(depthTex, texCoord.xy * 0.5 + 0.5);\n\n float sampleDepth = depthTexel.r * 2.0 - 1.0;\n if (projection[3][3] == 0.0) {\n sampleDepth = projection[3][2] / (sampleDepth * projection[2][3] - projection[2][2]);\n }\n else {\n sampleDepth = (sampleDepth - projection[3][2]) / projection[2][2];\n }\n \n float rangeCheck = smoothstep(0.0, 1.0, radius / abs(originPos.z - sampleDepth));\n occlusion += rangeCheck * step(samplePos.z, sampleDepth - bias);\n }\n#ifdef NORMALTEX_ENABLED\n occlusion = 1.0 - occlusion / float(KERNEL_SIZE);\n#else\n occlusion = 1.0 - clamp((occlusion / float(KERNEL_SIZE) - 0.6) * 2.5, 0.0, 1.0);\n#endif\n return pow(occlusion, power);\n}\n\nvoid main()\n{\n\n vec4 depthTexel = texture2D(depthTex, v_Texcoord);\n\n#ifdef NORMALTEX_ENABLED\n vec4 tex = texture2D(normalTex, v_Texcoord);\n if (dot(tex.rgb, tex.rgb) == 0.0) {\n gl_FragColor = vec4(1.0);\n return;\n }\n vec3 N = tex.rgb * 2.0 - 1.0;\n N = (viewInverseTranspose * vec4(N, 0.0)).xyz;\n\n vec2 noiseTexCoord = depthTexSize / vec2(noiseTexSize) * v_Texcoord;\n vec3 rvec = texture2D(noiseTex, noiseTexCoord).rgb * 2.0 - 1.0;\n vec3 T = normalize(rvec - N * dot(rvec, N));\n vec3 BT = normalize(cross(N, T));\n mat3 kernelBasis = mat3(T, BT, N);\n#else\n if (depthTexel.r > 0.99999) {\n gl_FragColor = vec4(1.0);\n return;\n }\n mat3 kernelBasis;\n#endif\n\n float z = depthTexel.r * 2.0 - 1.0;\n\n vec4 projectedPos = vec4(v_Texcoord * 2.0 - 1.0, z, 1.0);\n vec4 p4 = projectionInv * projectedPos;\n\n vec3 position = p4.xyz / p4.w;\n\n float ao = ssaoEstimator(position, kernelBasis);\n ao = clamp(1.0 - (1.0 - ao) * intensity, 0.0, 1.0);\n gl_FragColor = vec4(vec3(ao), 1.0);\n}\n\n@end\n\n\n@export ecgl.ssao.blur\n#define SHADER_NAME SSAO_BLUR\n\nuniform sampler2D ssaoTexture;\n\n#ifdef NORMALTEX_ENABLED\nuniform sampler2D normalTex;\n#endif\n\nvarying vec2 v_Texcoord;\n\nuniform vec2 textureSize;\nuniform float blurSize : 1.0;\n\nuniform int direction: 0.0;\n\n#ifdef DEPTHTEX_ENABLED\nuniform sampler2D depthTex;\nuniform mat4 projection;\nuniform float depthRange : 0.5;\n\nfloat getLinearDepth(vec2 coord)\n{\n float depth = texture2D(depthTex, coord).r * 2.0 - 1.0;\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n}\n#endif\n\nvoid main()\n{\n float kernel[5];\n kernel[0] = 0.122581;\n kernel[1] = 0.233062;\n kernel[2] = 0.288713;\n kernel[3] = 0.233062;\n kernel[4] = 0.122581;\n\n vec2 off = vec2(0.0);\n if (direction == 0) {\n off[0] = blurSize / textureSize.x;\n }\n else {\n off[1] = blurSize / textureSize.y;\n }\n\n vec2 coord = v_Texcoord;\n\n float sum = 0.0;\n float weightAll = 0.0;\n\n#ifdef NORMALTEX_ENABLED\n vec3 centerNormal = texture2D(normalTex, v_Texcoord).rgb * 2.0 - 1.0;\n#endif\n#if defined(DEPTHTEX_ENABLED)\n float centerDepth = getLinearDepth(v_Texcoord);\n#endif\n\n for (int i = 0; i < 5; i++) {\n vec2 coord = clamp(v_Texcoord + vec2(float(i) - 2.0) * off, vec2(0.0), vec2(1.0));\n\n float w = kernel[i];\n#ifdef NORMALTEX_ENABLED\n vec3 normal = texture2D(normalTex, coord).rgb * 2.0 - 1.0;\n w *= clamp(dot(normal, centerNormal), 0.0, 1.0);\n#endif\n#ifdef DEPTHTEX_ENABLED\n float d = getLinearDepth(coord);\n w *= (1.0 - smoothstep(abs(centerDepth - d) / depthRange, 0.0, 1.0));\n#endif\n\n weightAll += w;\n sum += texture2D(ssaoTexture, coord).r * w;\n }\n\n gl_FragColor = vec4(vec3(sum / weightAll), 1.0);\n}\n\n@end\n"),
pl.prototype.setDepthTexture = function (e) {
this._depthTex = e
}
,
pl.prototype.setNormalTexture = function (e) {
this._normalTex = e,
this._ssaoPass.material[e ? "enableTexture" : "disableTexture"]("normalTex"),
this.setKernelSize(this._kernelSize)
}
,
pl.prototype.update = function (e, t, r) {
var i = e.getWidth()
, n = e.getHeight()
, a = this._ssaoPass
, o = this._blurPass;
a.setUniform("kernel", this._kernels[r % this._kernels.length]),
a.setUniform("depthTex", this._depthTex),
null != this._normalTex && a.setUniform("normalTex", this._normalTex),
a.setUniform("depthTexSize", [this._depthTex.width, this._depthTex.height]);
var s = new Ht;
Ht.transpose(s, t.worldTransform),
a.setUniform("projection", t.projectionMatrix.array),
a.setUniform("projectionInv", t.invProjectionMatrix.array),
a.setUniform("viewInverseTranspose", s.array);
var l = this._ssaoTexture
, h = this._blurTexture
, u = this._blurTexture2;
l.width = i / 2,
l.height = n / 2,
h.width = i,
h.height = n,
u.width = i,
u.height = n,
this._framebuffer.attach(l),
this._framebuffer.bind(e),
e.gl.clearColor(1, 1, 1, 1),
e.gl.clear(e.gl.COLOR_BUFFER_BIT),
a.render(e),
o.setUniform("textureSize", [i / 2, n / 2]),
o.setUniform("projection", t.projectionMatrix.array),
this._framebuffer.attach(h),
o.setUniform("direction", 0),
o.setUniform("ssaoTexture", l),
o.render(e),
this._framebuffer.attach(u),
o.setUniform("textureSize", [i, n]),
o.setUniform("direction", 1),
o.setUniform("ssaoTexture", h),
o.render(e),
this._framebuffer.unbind(e);
var c = e.clearColor;
e.gl.clearColor(c[0], c[1], c[2], c[3])
}
,
pl.prototype.getTargetTexture = function () {
return this._blurTexture2
}
,
pl.prototype.setParameter = function (e, t) {
"noiseTexSize" === e ? this.setNoiseSize(t) : "kernelSize" === e ? this.setKernelSize(t) : "intensity" === e ? this._ssaoPass.material.set("intensity", t) : this._ssaoPass.setUniform(e, t)
}
,
pl.prototype.setKernelSize = function (e) {
this._kernelSize = e,
this._ssaoPass.material.define("fragment", "KERNEL_SIZE", e),
this._kernels = this._kernels || [];
for (var t = 0; t < 30; t++)
this._kernels[t] = fl(e, t * e, !!this._normalTex)
}
,
pl.prototype.setNoiseSize = function (e) {
var t = this._ssaoPass.getUniform("noiseTex");
t ? (t.data = cl(e),
t.width = t.height = e,
t.dirty()) : (t = dl(e),
this._ssaoPass.setUniform("noiseTex", dl(e))),
this._ssaoPass.setUniform("noiseTexSize", [e, e])
}
,
pl.prototype.dispose = function (e) {
this._blurTexture.dispose(e),
this._ssaoTexture.dispose(e),
this._blurTexture2.dispose(e)
}
;
const ml = pl;
function gl(e) {
e = e || {},
this._ssrPass = new pn({
fragment: Xe.source("ecgl.ssr.main"),
clearColor: [0, 0, 0, 0]
}),
this._blurPass1 = new pn({
fragment: Xe.source("ecgl.ssr.blur"),
clearColor: [0, 0, 0, 0]
}),
this._blurPass2 = new pn({
fragment: Xe.source("ecgl.ssr.blur"),
clearColor: [0, 0, 0, 0]
}),
this._blendPass = new pn({
fragment: Xe.source("clay.compositor.blend")
}),
this._blendPass.material.disableTexturesAll(),
this._blendPass.material.enableTexture(["texture1", "texture2"]),
this._ssrPass.setUniform("gBufferTexture1", e.normalTexture),
this._ssrPass.setUniform("gBufferTexture2", e.depthTexture),
this._blurPass1.setUniform("gBufferTexture1", e.normalTexture),
this._blurPass1.setUniform("gBufferTexture2", e.depthTexture),
this._blurPass2.setUniform("gBufferTexture1", e.normalTexture),
this._blurPass2.setUniform("gBufferTexture2", e.depthTexture),
this._blurPass2.material.define("fragment", "VERTICAL"),
this._blurPass2.material.define("fragment", "BLEND"),
this._ssrTexture = new Dr({
type: wr.HALF_FLOAT
}),
this._texture2 = new Dr({
type: wr.HALF_FLOAT
}),
this._texture3 = new Dr({
type: wr.HALF_FLOAT
}),
this._prevTexture = new Dr({
type: wr.HALF_FLOAT
}),
this._currentTexture = new Dr({
type: wr.HALF_FLOAT
}),
this._frameBuffer = new zi({
depthBuffer: !1
}),
this._normalDistribution = null,
this._totalSamples = 256,
this._samplePerFrame = 4,
this._ssrPass.material.define("fragment", "SAMPLE_PER_FRAME", this._samplePerFrame),
this._ssrPass.material.define("fragment", "TOTAL_SAMPLES", this._totalSamples),
this._downScale = 1
}
Xe.import("@export ecgl.ssr.main\n\n#define SHADER_NAME SSR\n#define MAX_ITERATION 20;\n#define SAMPLE_PER_FRAME 5;\n#define TOTAL_SAMPLES 128;\n\nuniform sampler2D sourceTexture;\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform samplerCube specularCubemap;\nuniform float specularIntensity: 1;\n\nuniform mat4 projection;\nuniform mat4 projectionInv;\nuniform mat4 toViewSpace;\nuniform mat4 toWorldSpace;\n\nuniform float maxRayDistance: 200;\n\nuniform float pixelStride: 16;\nuniform float pixelStrideZCutoff: 50; \nuniform float screenEdgeFadeStart: 0.9; \nuniform float eyeFadeStart : 0.2; uniform float eyeFadeEnd: 0.8; \nuniform float minGlossiness: 0.2; uniform float zThicknessThreshold: 1;\n\nuniform float nearZ;\nuniform vec2 viewportSize : VIEWPORT_SIZE;\n\nuniform float jitterOffset: 0;\n\nvarying vec2 v_Texcoord;\n\n#ifdef DEPTH_DECODE\n@import clay.util.decode_float\n#endif\n\n#ifdef PHYSICALLY_CORRECT\nuniform sampler2D normalDistribution;\nuniform float sampleOffset: 0;\nuniform vec2 normalDistributionSize;\n\nvec3 transformNormal(vec3 H, vec3 N) {\n vec3 upVector = N.y > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nvec3 importanceSampleNormalGGX(float i, float roughness, vec3 N) {\n float p = fract((i + sampleOffset) / float(TOTAL_SAMPLES));\n vec3 H = texture2D(normalDistribution,vec2(roughness, p)).rgb;\n return transformNormal(H, N);\n}\nfloat G_Smith(float g, float ndv, float ndl) {\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\n#endif\n\nfloat fetchDepth(sampler2D depthTexture, vec2 uv)\n{\n vec4 depthTexel = texture2D(depthTexture, uv);\n return depthTexel.r * 2.0 - 1.0;\n}\n\nfloat linearDepth(float depth)\n{\n if (projection[3][3] == 0.0) {\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n }\n else {\n return (depth - projection[3][2]) / projection[2][2];\n }\n}\n\nbool rayIntersectDepth(float rayZNear, float rayZFar, vec2 hitPixel)\n{\n if (rayZFar > rayZNear)\n {\n float t = rayZFar; rayZFar = rayZNear; rayZNear = t;\n }\n float cameraZ = linearDepth(fetchDepth(gBufferTexture2, hitPixel));\n return rayZFar <= cameraZ && rayZNear >= cameraZ - zThicknessThreshold;\n}\n\n\nbool traceScreenSpaceRay(\n vec3 rayOrigin, vec3 rayDir, float jitter,\n out vec2 hitPixel, out vec3 hitPoint, out float iterationCount\n)\n{\n float rayLength = ((rayOrigin.z + rayDir.z * maxRayDistance) > -nearZ)\n ? (-nearZ - rayOrigin.z) / rayDir.z : maxRayDistance;\n\n vec3 rayEnd = rayOrigin + rayDir * rayLength;\n\n vec4 H0 = projection * vec4(rayOrigin, 1.0);\n vec4 H1 = projection * vec4(rayEnd, 1.0);\n\n float k0 = 1.0 / H0.w, k1 = 1.0 / H1.w;\n\n vec3 Q0 = rayOrigin * k0, Q1 = rayEnd * k1;\n\n vec2 P0 = (H0.xy * k0 * 0.5 + 0.5) * viewportSize;\n vec2 P1 = (H1.xy * k1 * 0.5 + 0.5) * viewportSize;\n\n P1 += dot(P1 - P0, P1 - P0) < 0.0001 ? 0.01 : 0.0;\n vec2 delta = P1 - P0;\n\n bool permute = false;\n if (abs(delta.x) < abs(delta.y)) {\n permute = true;\n delta = delta.yx;\n P0 = P0.yx;\n P1 = P1.yx;\n }\n float stepDir = sign(delta.x);\n float invdx = stepDir / delta.x;\n\n vec3 dQ = (Q1 - Q0) * invdx;\n float dk = (k1 - k0) * invdx;\n\n vec2 dP = vec2(stepDir, delta.y * invdx);\n\n float strideScaler = 1.0 - min(1.0, -rayOrigin.z / pixelStrideZCutoff);\n float pixStride = 1.0 + strideScaler * pixelStride;\n\n dP *= pixStride; dQ *= pixStride; dk *= pixStride;\n\n vec4 pqk = vec4(P0, Q0.z, k0);\n vec4 dPQK = vec4(dP, dQ.z, dk);\n\n pqk += dPQK * jitter;\n float rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n float rayZNear;\n\n bool intersect = false;\n\n vec2 texelSize = 1.0 / viewportSize;\n\n iterationCount = 0.0;\n\n for (int i = 0; i < MAX_ITERATION; i++)\n {\n pqk += dPQK;\n\n rayZNear = rayZFar;\n rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n\n hitPixel = permute ? pqk.yx : pqk.xy;\n hitPixel *= texelSize;\n\n intersect = rayIntersectDepth(rayZNear, rayZFar, hitPixel);\n\n iterationCount += 1.0;\n\n dPQK *= 1.2;\n\n if (intersect) {\n break;\n }\n }\n\n Q0.xy += dQ.xy * iterationCount;\n Q0.z = pqk.z;\n hitPoint = Q0 / pqk.w;\n\n return intersect;\n}\n\nfloat calculateAlpha(\n float iterationCount, float reflectivity,\n vec2 hitPixel, vec3 hitPoint, float dist, vec3 rayDir\n)\n{\n float alpha = clamp(reflectivity, 0.0, 1.0);\n alpha *= 1.0 - (iterationCount / float(MAX_ITERATION));\n vec2 hitPixelNDC = hitPixel * 2.0 - 1.0;\n float maxDimension = min(1.0, max(abs(hitPixelNDC.x), abs(hitPixelNDC.y)));\n alpha *= 1.0 - max(0.0, maxDimension - screenEdgeFadeStart) / (1.0 - screenEdgeFadeStart);\n\n float _eyeFadeStart = eyeFadeStart;\n float _eyeFadeEnd = eyeFadeEnd;\n if (_eyeFadeStart > _eyeFadeEnd) {\n float tmp = _eyeFadeEnd;\n _eyeFadeEnd = _eyeFadeStart;\n _eyeFadeStart = tmp;\n }\n\n float eyeDir = clamp(rayDir.z, _eyeFadeStart, _eyeFadeEnd);\n alpha *= 1.0 - (eyeDir - _eyeFadeStart) / (_eyeFadeEnd - _eyeFadeStart);\n\n alpha *= 1.0 - clamp(dist / maxRayDistance, 0.0, 1.0);\n\n return alpha;\n}\n\n@import clay.util.rand\n\n@import clay.util.rgbm\n\nvoid main()\n{\n vec4 normalAndGloss = texture2D(gBufferTexture1, v_Texcoord);\n\n if (dot(normalAndGloss.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n\n float g = normalAndGloss.a;\n#if !defined(PHYSICALLY_CORRECT)\n if (g <= minGlossiness) {\n discard;\n }\n#endif\n\n float reflectivity = (g - minGlossiness) / (1.0 - minGlossiness);\n\n vec3 N = normalize(normalAndGloss.rgb * 2.0 - 1.0);\n N = normalize((toViewSpace * vec4(N, 0.0)).xyz);\n\n vec4 projectedPos = vec4(v_Texcoord * 2.0 - 1.0, fetchDepth(gBufferTexture2, v_Texcoord), 1.0);\n vec4 pos = projectionInv * projectedPos;\n vec3 rayOrigin = pos.xyz / pos.w;\n vec3 V = -normalize(rayOrigin);\n\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float iterationCount;\n float jitter = rand(fract(v_Texcoord + jitterOffset));\n\n#ifdef PHYSICALLY_CORRECT\n vec4 color = vec4(vec3(0.0), 1.0);\n vec4 albedoMetalness = texture2D(gBufferTexture3, v_Texcoord);\n vec3 albedo = albedoMetalness.rgb;\n float m = albedoMetalness.a;\n vec3 diffuseColor = albedo * (1.0 - m);\n vec3 spec = mix(vec3(0.04), albedo, m);\n\n float jitter2 = rand(fract(v_Texcoord)) * float(TOTAL_SAMPLES);\n\n for (int i = 0; i < SAMPLE_PER_FRAME; i++) {\n vec3 H = importanceSampleNormalGGX(float(i) + jitter2, 1.0 - g, N);\n vec3 rayDir = normalize(reflect(-V, H));\n#else\n vec3 rayDir = normalize(reflect(-V, N));\n#endif\n vec2 hitPixel;\n vec3 hitPoint;\n\n bool intersect = traceScreenSpaceRay(rayOrigin, rayDir, jitter, hitPixel, hitPoint, iterationCount);\n\n float dist = distance(rayOrigin, hitPoint);\n\n vec3 hitNormal = texture2D(gBufferTexture1, hitPixel).rgb * 2.0 - 1.0;\n hitNormal = normalize((toViewSpace * vec4(hitNormal, 0.0)).xyz);\n#ifdef PHYSICALLY_CORRECT\n float ndl = clamp(dot(N, rayDir), 0.0, 1.0);\n float vdh = clamp(dot(V, H), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n vec3 litTexel = vec3(0.0);\n if (dot(hitNormal, rayDir) < 0.0 && intersect) {\n litTexel = texture2D(sourceTexture, hitPixel).rgb;\n litTexel *= pow(clamp(1.0 - dist / 200.0, 0.0, 1.0), 3.0);\n\n }\n else {\n #ifdef SPECULARCUBEMAP_ENABLED\n vec3 rayDirW = normalize(toWorldSpace * vec4(rayDir, 0.0)).rgb;\n litTexel = RGBMDecode(textureCubeLodEXT(specularCubemap, rayDirW, 0.0), 8.12).rgb * specularIntensity;\n#endif\n }\n color.rgb += ndl * litTexel * (\n F_Schlick(ndl, spec) * G_Smith(g, ndv, ndl) * vdh / (ndh * ndv + 0.001)\n );\n }\n color.rgb /= float(SAMPLE_PER_FRAME);\n#else\n #if !defined(SPECULARCUBEMAP_ENABLED)\n if (dot(hitNormal, rayDir) >= 0.0) {\n discard;\n }\n if (!intersect) {\n discard;\n }\n#endif\n float alpha = clamp(calculateAlpha(iterationCount, reflectivity, hitPixel, hitPoint, dist, rayDir), 0.0, 1.0);\n vec4 color = texture2D(sourceTexture, hitPixel);\n color.rgb *= alpha;\n\n#ifdef SPECULARCUBEMAP_ENABLED\n vec3 rayDirW = normalize(toWorldSpace * vec4(rayDir, 0.0)).rgb;\n alpha = alpha * (intersect ? 1.0 : 0.0);\n float bias = (1.0 -g) * 5.0;\n color.rgb += (1.0 - alpha)\n * RGBMDecode(textureCubeLodEXT(specularCubemap, rayDirW, bias), 8.12).rgb\n * specularIntensity;\n#endif\n\n#endif\n\n gl_FragColor = encodeHDR(color);\n}\n@end\n\n@export ecgl.ssr.blur\n\nuniform sampler2D texture;\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform mat4 projection;\nuniform float depthRange : 0.05;\n\nvarying vec2 v_Texcoord;\n\nuniform vec2 textureSize;\nuniform float blurSize : 1.0;\n\n#ifdef BLEND\n #ifdef SSAOTEX_ENABLED\nuniform sampler2D ssaoTex;\n #endif\nuniform sampler2D sourceTexture;\n#endif\n\nfloat getLinearDepth(vec2 coord)\n{\n float depth = texture2D(gBufferTexture2, coord).r * 2.0 - 1.0;\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n}\n\n@import clay.util.rgbm\n\n\nvoid main()\n{\n @import clay.compositor.kernel.gaussian_9\n\n vec4 centerNTexel = texture2D(gBufferTexture1, v_Texcoord);\n float g = centerNTexel.a;\n float maxBlurSize = clamp(1.0 - g, 0.0, 1.0) * blurSize;\n#ifdef VERTICAL\n vec2 off = vec2(0.0, maxBlurSize / textureSize.y);\n#else\n vec2 off = vec2(maxBlurSize / textureSize.x, 0.0);\n#endif\n\n vec2 coord = v_Texcoord;\n\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n\n vec3 cN = centerNTexel.rgb * 2.0 - 1.0;\n float cD = getLinearDepth(v_Texcoord);\n for (int i = 0; i < 9; i++) {\n vec2 coord = clamp((float(i) - 4.0) * off + v_Texcoord, vec2(0.0), vec2(1.0));\n float w = gaussianKernel[i]\n * clamp(dot(cN, texture2D(gBufferTexture1, coord).rgb * 2.0 - 1.0), 0.0, 1.0);\n float d = getLinearDepth(coord);\n w *= (1.0 - smoothstep(abs(cD - d) / depthRange, 0.0, 1.0));\n\n weightAll += w;\n sum += decodeHDR(texture2D(texture, coord)) * w;\n }\n\n#ifdef BLEND\n float aoFactor = 1.0;\n #ifdef SSAOTEX_ENABLED\n aoFactor = texture2D(ssaoTex, v_Texcoord).r;\n #endif\n gl_FragColor = encodeHDR(\n sum / weightAll * aoFactor + decodeHDR(texture2D(sourceTexture, v_Texcoord))\n );\n#else\n gl_FragColor = encodeHDR(sum / weightAll);\n#endif\n}\n\n@end"),
gl.prototype.setAmbientCubemap = function (e, t) {
this._ssrPass.material.set("specularCubemap", e),
this._ssrPass.material.set("specularIntensity", t);
var r = e && t;
this._ssrPass.material[r ? "enableTexture" : "disableTexture"]("specularCubemap")
}
,
gl.prototype.update = function (e, t, r, i) {
var n = e.getWidth()
, a = e.getHeight()
, o = this._ssrTexture
, s = this._texture2
, l = this._texture3;
o.width = this._prevTexture.width = this._currentTexture.width = n / this._downScale,
o.height = this._prevTexture.height = this._currentTexture.height = a / this._downScale,
s.width = l.width = n,
s.height = l.height = a;
var h = this._frameBuffer
, u = this._ssrPass
, c = this._blurPass1
, d = this._blurPass2
, f = this._blendPass
, p = new Ht
, m = new Ht;
Ht.transpose(p, t.worldTransform),
Ht.transpose(m, t.viewMatrix),
u.setUniform("sourceTexture", r),
u.setUniform("projection", t.projectionMatrix.array),
u.setUniform("projectionInv", t.invProjectionMatrix.array),
u.setUniform("toViewSpace", p.array),
u.setUniform("toWorldSpace", m.array),
u.setUniform("nearZ", t.near);
var g = i / this._totalSamples * this._samplePerFrame;
if (u.setUniform("jitterOffset", g),
u.setUniform("sampleOffset", i * this._samplePerFrame),
c.setUniform("textureSize", [o.width, o.height]),
d.setUniform("textureSize", [n, a]),
d.setUniform("sourceTexture", r),
c.setUniform("projection", t.projectionMatrix.array),
d.setUniform("projection", t.projectionMatrix.array),
h.attach(o),
h.bind(e),
u.render(e),
this._physicallyCorrect && (h.attach(this._currentTexture),
f.setUniform("texture1", this._prevTexture),
f.setUniform("texture2", o),
f.material.set({
weight1: i >= 1 ? .95 : 0,
weight2: i >= 1 ? .05 : 1
}),
f.render(e)),
h.attach(s),
c.setUniform("texture", this._physicallyCorrect ? this._currentTexture : o),
c.render(e),
h.attach(l),
d.setUniform("texture", s),
d.render(e),
h.unbind(e),
this._physicallyCorrect) {
var _ = this._prevTexture;
this._prevTexture = this._currentTexture,
this._currentTexture = _
}
}
,
gl.prototype.getTargetTexture = function () {
return this._texture3
}
,
gl.prototype.setParameter = function (e, t) {
"maxIteration" === e ? this._ssrPass.material.define("fragment", "MAX_ITERATION", t) : this._ssrPass.setUniform(e, t)
}
,
gl.prototype.setPhysicallyCorrect = function (e) {
e ? (this._normalDistribution || (this._normalDistribution = _n.generateNormalDistribution(64, this._totalSamples)),
this._ssrPass.material.define("fragment", "PHYSICALLY_CORRECT"),
this._ssrPass.material.set("normalDistribution", this._normalDistribution),
this._ssrPass.material.set("normalDistributionSize", [64, this._totalSamples])) : this._ssrPass.material.undefine("fragment", "PHYSICALLY_CORRECT"),
this._physicallyCorrect = e
}
,
gl.prototype.setSSAOTexture = function (e) {
var t = this._blurPass2;
e ? (t.material.enableTexture("ssaoTex"),
t.material.set("ssaoTex", e)) : t.material.disableTexture("ssaoTex")
}
,
gl.prototype.isFinished = function (e) {
return !this._physicallyCorrect || e > this._totalSamples / this._samplePerFrame
}
,
gl.prototype.dispose = function (e) {
this._ssrTexture.dispose(e),
this._texture2.dispose(e),
this._texture3.dispose(e),
this._prevTexture.dispose(e),
this._currentTexture.dispose(e),
this._frameBuffer.dispose(e)
}
;
const _l = gl
, vl = [0, 0, -.321585265978, -.154972575841, .458126042375, .188473391593, .842080129861, .527766490688, .147304551086, -.659453822776, -.331943915203, -.940619700594, .0479226680259, .54812163202, .701581552186, -.709825561388, -.295436780218, .940589268233, -.901489676764, .237713156085, .973570876096, -.109899459384, -.866792314779, -.451805525005, .330975007087, .800048655954, -.344275183665, .381779221166, -.386139432542, -.437418421534, -.576478634965, -.0148463392551, .385798197415, -.262426961053, -.666302061145, .682427250835, -.628010632582, -.732836215494, .10163141741, -.987658134403, .711995289051, -.320024291314, .0296005138058, .950296523438, .0130612307608, -.351024443122, -.879596633704, -.10478487883, .435712737232, .504254490347, .779203817497, .206477676721, .388264289969, -.896736162545, -.153106280781, -.629203242522, -.245517550697, .657969239148, .126830499058, .26862328493, -.634888119007, -.302301223431, .617074219636, .779817204925];
function yl(e, t, r, i, n) {
var a = e.gl;
t.setUniform(a, "1i", r, n),
a.activeTexture(a.TEXTURE0 + n),
i.isRenderable() ? i.bind(e) : i.unbind(e)
}
function xl(e, t, r, i, n) {
var a, o, s, l, h = e.gl;
return function (n, u, c) {
if (!l || l.material !== n.material) {
var d = n.material
, f = n.__program
, p = d.get("roughness");
null == p && (p = 1);
var m = d.get("normalMap") || t
, g = d.get("roughnessMap")
, _ = d.get("bumpMap")
, v = d.get("uvRepeat")
, y = d.get("uvOffset")
, x = d.get("detailUvRepeat")
, b = d.get("detailUvOffset")
, w = !!_ && d.isTextureEnabled("bumpMap")
, T = !!g && d.isTextureEnabled("roughnessMap")
, S = d.isDefined("fragment", "DOUBLE_SIDED");
_ = _ || r,
g = g || i,
c !== u ? (u.set("normalMap", m),
u.set("bumpMap", _),
u.set("roughnessMap", g),
u.set("useBumpMap", w),
u.set("useRoughnessMap", T),
u.set("doubleSide", S),
null != v && u.set("uvRepeat", v),
null != y && u.set("uvOffset", y),
null != x && u.set("detailUvRepeat", x),
null != b && u.set("detailUvOffset", b),
u.set("roughness", p)) : (f.setUniform(h, "1f", "roughness", p),
a !== m && yl(e, f, "normalMap", m, 0),
o !== _ && _ && yl(e, f, "bumpMap", _, 1),
s !== g && g && yl(e, f, "roughnessMap", g, 2),
null != v && f.setUniform(h, "2f", "uvRepeat", v),
null != y && f.setUniform(h, "2f", "uvOffset", y),
null != x && f.setUniform(h, "2f", "detailUvRepeat", x),
null != b && f.setUniform(h, "2f", "detailUvOffset", b),
f.setUniform(h, "1i", "useBumpMap", +w),
f.setUniform(h, "1i", "useRoughnessMap", +T),
f.setUniform(h, "1i", "doubleSide", +S)),
a = m,
o = _,
s = g,
l = n
}
}
}
function bl(e) {
e = e || {},
this._depthTex = new Dr({
format: wr.DEPTH_COMPONENT,
type: wr.UNSIGNED_INT
}),
this._normalTex = new Dr({
type: wr.HALF_FLOAT
}),
this._framebuffer = new zi,
this._framebuffer.attach(this._normalTex),
this._framebuffer.attach(this._depthTex, zi.DEPTH_ATTACHMENT),
this._normalMaterial = new le({
shader: new Xe(Xe.source("ecgl.normal.vertex"), Xe.source("ecgl.normal.fragment"))
}),
this._normalMaterial.enableTexture(["normalMap", "bumpMap", "roughnessMap"]),
this._defaultNormalMap = an.createBlank("#000"),
this._defaultBumpMap = an.createBlank("#000"),
this._defaultRoughessMap = an.createBlank("#000"),
this._debugPass = new pn({
fragment: Xe.source("clay.compositor.output")
}),
this._debugPass.setUniform("texture", this._normalTex),
this._debugPass.material.undefine("fragment", "OUTPUT_ALPHA")
}
Xe.import("@export ecgl.normal.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n@import ecgl.common.attributes\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\n@import ecgl.common.normalMap.vertexHeader\n\n@import ecgl.common.vertexAnimation.header\n\nvoid main()\n{\n\n @import ecgl.common.vertexAnimation.main\n\n @import ecgl.common.uv.main\n\n v_Normal = normalize((worldInverseTranspose * vec4(normal, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n @import ecgl.common.normalMap.vertexMain\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n}\n\n\n@end\n\n\n@export ecgl.normal.fragment\n\n#define ROUGHNESS_CHANEL 0\n\nuniform bool useBumpMap;\nuniform bool useRoughnessMap;\nuniform bool doubleSide;\nuniform float roughness;\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n@import ecgl.common.normalMap.fragmentHeader\n@import ecgl.common.bumpMap.header\n\nuniform sampler2D roughnessMap;\n\nvoid main()\n{\n vec3 N = v_Normal;\n \n bool flipNormal = false;\n if (doubleSide) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n flipNormal = true;\n }\n }\n\n @import ecgl.common.normalMap.fragmentMain\n\n if (useBumpMap) {\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n }\n\n float g = 1.0 - roughness;\n\n if (useRoughnessMap) {\n float g2 = 1.0 - texture2D(roughnessMap, v_DetailTexcoord)[ROUGHNESS_CHANEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n\n if (flipNormal) {\n N = -N;\n }\n\n gl_FragColor.rgb = (N.xyz + 1.0) * 0.5;\n gl_FragColor.a = g;\n}\n@end"),
bl.prototype.getDepthTexture = function () {
return this._depthTex
}
,
bl.prototype.getNormalTexture = function () {
return this._normalTex
}
,
bl.prototype.update = function (e, t, r) {
var i = e.getWidth()
, n = e.getHeight()
, a = this._depthTex
, o = this._normalTex
, s = this._normalMaterial;
a.width = i,
a.height = n,
o.width = i,
o.height = n;
var l = t.getRenderList(r).opaque;
this._framebuffer.bind(e),
e.gl.clearColor(0, 0, 0, 0),
e.gl.clear(e.gl.COLOR_BUFFER_BIT | e.gl.DEPTH_BUFFER_BIT),
e.gl.disable(e.gl.BLEND),
e.renderPass(l, r, {
getMaterial: function () {
return s
},
ifRender: function (e) {
return e.renderNormal
},
beforeRender: xl(e, this._defaultNormalMap, this._defaultBumpMap, this._defaultRoughessMap, this._normalMaterial),
sort: e.opaqueSortCompare
}),
this._framebuffer.unbind(e)
}
,
bl.prototype.renderDebug = function (e) {
this._debugPass.render(e)
}
,
bl.prototype.dispose = function (e) {
this._depthTex.dispose(e),
this._normalTex.dispose(e)
}
;
const wl = bl;
function Tl(e) {
e = e || {},
this._edgePass = new pn({
fragment: Xe.source("ecgl.edge")
}),
this._edgePass.setUniform("normalTexture", e.normalTexture),
this._edgePass.setUniform("depthTexture", e.depthTexture),
this._targetTexture = new Dr({
type: wr.HALF_FLOAT
}),
this._frameBuffer = new zi,
this._frameBuffer.attach(this._targetTexture)
}
Tl.prototype.update = function (e, t, r, i) {
var n = e.getWidth()
, a = e.getHeight()
, o = this._targetTexture;
o.width = n,
o.height = a;
var s = this._frameBuffer;
s.bind(e),
this._edgePass.setUniform("projectionInv", t.invProjectionMatrix.array),
this._edgePass.setUniform("textureSize", [n, a]),
this._edgePass.setUniform("texture", r),
this._edgePass.render(e),
s.unbind(e)
}
,
Tl.prototype.getTargetTexture = function () {
return this._targetTexture
}
,
Tl.prototype.setParameter = function (e, t) {
this._edgePass.setUniform(e, t)
}
,
Tl.prototype.dispose = function (e) {
this._targetTexture.dispose(e),
this._frameBuffer.dispose(e)
}
;
const Sl = Tl
, Ml = {
type: "compositor",
nodes: [{
name: "source",
type: "texture",
outputs: {
color: {}
}
}, {
name: "source_half",
shader: "#source(clay.compositor.downsample)",
inputs: {
texture: "source"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 2)",
height: "expr(height * 1.0 / 2)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0, height * 1.0] )"
}
}, {
name: "bright",
shader: "#source(clay.compositor.bright)",
inputs: {
texture: "source_half"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 2)",
height: "expr(height * 1.0 / 2)",
type: "HALF_FLOAT"
}
}
},
parameters: {
threshold: 2,
scale: 4,
textureSize: "expr([width * 1.0 / 2, height / 2])"
}
}, {
name: "bright_downsample_4",
shader: "#source(clay.compositor.downsample)",
inputs: {
texture: "bright"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 4)",
height: "expr(height * 1.0 / 4)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0 / 2, height / 2] )"
}
}, {
name: "bright_downsample_8",
shader: "#source(clay.compositor.downsample)",
inputs: {
texture: "bright_downsample_4"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 8)",
height: "expr(height * 1.0 / 8)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0 / 4, height / 4] )"
}
}, {
name: "bright_downsample_16",
shader: "#source(clay.compositor.downsample)",
inputs: {
texture: "bright_downsample_8"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 16)",
height: "expr(height * 1.0 / 16)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0 / 8, height / 8] )"
}
}, {
name: "bright_downsample_32",
shader: "#source(clay.compositor.downsample)",
inputs: {
texture: "bright_downsample_16"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 32)",
height: "expr(height * 1.0 / 32)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0 / 16, height / 16] )"
}
}, {
name: "bright_upsample_16_blur_h",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_downsample_32"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 16)",
height: "expr(height * 1.0 / 16)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 0,
textureSize: "expr( [width * 1.0 / 32, height / 32] )"
}
}, {
name: "bright_upsample_16_blur_v",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_upsample_16_blur_h"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 16)",
height: "expr(height * 1.0 / 16)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 1,
textureSize: "expr( [width * 1.0 / 16, height * 1.0 / 16] )"
}
}, {
name: "bright_upsample_8_blur_h",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_downsample_16"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 8)",
height: "expr(height * 1.0 / 8)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 0,
textureSize: "expr( [width * 1.0 / 16, height * 1.0 / 16] )"
}
}, {
name: "bright_upsample_8_blur_v",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_upsample_8_blur_h"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 8)",
height: "expr(height * 1.0 / 8)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 1,
textureSize: "expr( [width * 1.0 / 8, height * 1.0 / 8] )"
}
}, {
name: "bright_upsample_8_blend",
shader: "#source(clay.compositor.blend)",
inputs: {
texture1: "bright_upsample_8_blur_v",
texture2: "bright_upsample_16_blur_v"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 8)",
height: "expr(height * 1.0 / 8)",
type: "HALF_FLOAT"
}
}
},
parameters: {
weight1: .3,
weight2: .7
}
}, {
name: "bright_upsample_4_blur_h",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_downsample_8"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 4)",
height: "expr(height * 1.0 / 4)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 0,
textureSize: "expr( [width * 1.0 / 8, height * 1.0 / 8] )"
}
}, {
name: "bright_upsample_4_blur_v",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_upsample_4_blur_h"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 4)",
height: "expr(height * 1.0 / 4)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 1,
textureSize: "expr( [width * 1.0 / 4, height * 1.0 / 4] )"
}
}, {
name: "bright_upsample_4_blend",
shader: "#source(clay.compositor.blend)",
inputs: {
texture1: "bright_upsample_4_blur_v",
texture2: "bright_upsample_8_blend"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 4)",
height: "expr(height * 1.0 / 4)",
type: "HALF_FLOAT"
}
}
},
parameters: {
weight1: .3,
weight2: .7
}
}, {
name: "bright_upsample_2_blur_h",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_downsample_4"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 2)",
height: "expr(height * 1.0 / 2)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 0,
textureSize: "expr( [width * 1.0 / 4, height * 1.0 / 4] )"
}
}, {
name: "bright_upsample_2_blur_v",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_upsample_2_blur_h"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 2)",
height: "expr(height * 1.0 / 2)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 1,
textureSize: "expr( [width * 1.0 / 2, height * 1.0 / 2] )"
}
}, {
name: "bright_upsample_2_blend",
shader: "#source(clay.compositor.blend)",
inputs: {
texture1: "bright_upsample_2_blur_v",
texture2: "bright_upsample_4_blend"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0 / 2)",
height: "expr(height * 1.0 / 2)",
type: "HALF_FLOAT"
}
}
},
parameters: {
weight1: .3,
weight2: .7
}
}, {
name: "bright_upsample_full_blur_h",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 0,
textureSize: "expr( [width * 1.0 / 2, height * 1.0 / 2] )"
}
}, {
name: "bright_upsample_full_blur_v",
shader: "#source(clay.compositor.gaussian_blur)",
inputs: {
texture: "bright_upsample_full_blur_h"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
},
parameters: {
blurSize: 1,
blurDir: 1,
textureSize: "expr( [width * 1.0, height * 1.0] )"
}
}, {
name: "bloom_composite",
shader: "#source(clay.compositor.blend)",
inputs: {
texture1: "bright_upsample_full_blur_v",
texture2: "bright_upsample_2_blend"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
},
parameters: {
weight1: .3,
weight2: .7
}
}, {
name: "coc",
shader: "#source(ecgl.dof.coc)",
outputs: {
color: {
parameters: {
minFilter: "NEAREST",
magFilter: "NEAREST",
width: "expr(width * 1.0)",
height: "expr(height * 1.0)"
}
}
},
parameters: {
focalDist: 50,
focalRange: 30
}
}, {
name: "dof_far_blur",
shader: "#source(ecgl.dof.diskBlur)",
inputs: {
texture: "source",
coc: "coc"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0, height * 1.0] )"
}
}, {
name: "dof_near_blur",
shader: "#source(ecgl.dof.diskBlur)",
inputs: {
texture: "source",
coc: "coc"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0, height * 1.0] )"
},
defines: {
BLUR_NEARFIELD: null
}
}, {
name: "dof_coc_blur",
shader: "#source(ecgl.dof.diskBlur)",
inputs: {
texture: "coc"
},
outputs: {
color: {
parameters: {
minFilter: "NEAREST",
magFilter: "NEAREST",
width: "expr(width * 1.0)",
height: "expr(height * 1.0)"
}
}
},
parameters: {
textureSize: "expr( [width * 1.0, height * 1.0] )"
},
defines: {
BLUR_COC: null
}
}, {
name: "dof_composite",
shader: "#source(ecgl.dof.composite)",
inputs: {
original: "source",
blurred: "dof_far_blur",
nearfield: "dof_near_blur",
coc: "coc",
nearcoc: "dof_coc_blur"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)",
type: "HALF_FLOAT"
}
}
}
}, {
name: "composite",
shader: "#source(clay.compositor.hdr.composite)",
inputs: {
texture: "source",
bloom: "bloom_composite"
},
outputs: {
color: {
parameters: {
width: "expr(width * 1.0)",
height: "expr(height * 1.0)"
}
}
},
defines: {}
}, {
name: "FXAA",
shader: "#source(clay.compositor.fxaa)",
inputs: {
texture: "composite"
}
}]
};
function Al(e, t) {
return {
color: {
parameters: {
width: e,
height: t
}
}
}
}
Xe.import(Zs),
Xe.import(Ys),
Xe.import(Ks),
Xe.import(Qs),
Xe.import(Js),
Xe.import($s),
Xe.import(el),
Xe.import(tl),
Xe.import(rl),
Xe.import("@export ecgl.dof.coc\n\nuniform sampler2D depth;\n\nuniform float zNear: 0.1;\nuniform float zFar: 2000;\n\nuniform float focalDistance: 3;\nuniform float focalRange: 1;\nuniform float focalLength: 30;\nuniform float fstop: 2.8;\n\nvarying vec2 v_Texcoord;\n\n@import clay.util.encode_float\n\nvoid main()\n{\n float z = texture2D(depth, v_Texcoord).r * 2.0 - 1.0;\n\n float dist = 2.0 * zNear * zFar / (zFar + zNear - z * (zFar - zNear));\n\n float aperture = focalLength / fstop;\n\n float coc;\n\n float uppper = focalDistance + focalRange;\n float lower = focalDistance - focalRange;\n if (dist <= uppper && dist >= lower) {\n coc = 0.5;\n }\n else {\n float focalAdjusted = dist > uppper ? uppper : lower;\n\n coc = abs(aperture * (focalLength * (dist - focalAdjusted)) / (dist * (focalAdjusted - focalLength)));\n coc = clamp(coc, 0.0, 2.0) / 2.00001;\n\n if (dist < lower) {\n coc = -coc;\n }\n coc = coc * 0.5 + 0.5;\n }\n\n gl_FragColor = encodeFloat(coc);\n}\n@end\n\n\n@export ecgl.dof.composite\n\n#define DEBUG 0\n\nuniform sampler2D original;\nuniform sampler2D blurred;\nuniform sampler2D nearfield;\nuniform sampler2D coc;\nuniform sampler2D nearcoc;\nvarying vec2 v_Texcoord;\n\n@import clay.util.rgbm\n@import clay.util.float\n\nvoid main()\n{\n vec4 blurredColor = texture2D(blurred, v_Texcoord);\n vec4 originalColor = texture2D(original, v_Texcoord);\n\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord));\n\n fCoc = abs(fCoc * 2.0 - 1.0);\n\n float weight = smoothstep(0.0, 1.0, fCoc);\n \n#ifdef NEARFIELD_ENABLED\n vec4 nearfieldColor = texture2D(nearfield, v_Texcoord);\n float fNearCoc = decodeFloat(texture2D(nearcoc, v_Texcoord));\n fNearCoc = abs(fNearCoc * 2.0 - 1.0);\n\n gl_FragColor = encodeHDR(\n mix(\n nearfieldColor, mix(originalColor, blurredColor, weight),\n pow(1.0 - fNearCoc, 4.0)\n )\n );\n#else\n gl_FragColor = encodeHDR(mix(originalColor, blurredColor, weight));\n#endif\n\n}\n\n@end\n\n\n\n@export ecgl.dof.diskBlur\n\n#define POISSON_KERNEL_SIZE 16;\n\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\n\nuniform float blurRadius : 10.0;\nuniform vec2 textureSize : [512.0, 512.0];\n\nuniform vec2 poissonKernel[POISSON_KERNEL_SIZE];\n\nuniform float percent;\n\nfloat nrand(const in vec2 n) {\n return fract(sin(dot(n.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\n@import clay.util.rgbm\n@import clay.util.float\n\n\nvoid main()\n{\n vec2 offset = blurRadius / textureSize;\n\n float rnd = 6.28318 * nrand(v_Texcoord + 0.07 * percent );\n float cosa = cos(rnd);\n float sina = sin(rnd);\n vec4 basis = vec4(cosa, -sina, sina, cosa);\n\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n\n#ifdef BLUR_COC\n float cocSum = 0.0;\n#else\n vec4 color = vec4(0.0);\n#endif\n\n\n float weightSum = 0.0;\n\n for (int i = 0; i < POISSON_KERNEL_SIZE; i++) {\n vec2 ofs = poissonKernel[i];\n\n ofs = vec2(dot(ofs, basis.xy), dot(ofs, basis.zw));\n\n vec2 uv = v_Texcoord + ofs * offset;\n vec4 texel = texture2D(texture, uv);\n\n float w = 1.0;\n#ifdef BLUR_COC\n float fCoc = decodeFloat(texel) * 2.0 - 1.0;\n cocSum += clamp(fCoc, -1.0, 0.0) * w;\n#else\n texel = texel;\n #if !defined(BLUR_NEARFIELD)\n float fCoc = decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0;\n w *= abs(fCoc);\n #endif\n texel.rgb *= texel.a;\n color += texel * w;\n#endif\n\n weightSum += w;\n }\n\n#ifdef BLUR_COC\n gl_FragColor = encodeFloat(clamp(cocSum / weightSum, -1.0, 0.0) * 0.5 + 0.5);\n#else\n color /= weightSum;\n color.rgb /= (color.a + 0.0001);\n gl_FragColor = color;\n#endif\n}\n\n@end"),
Xe.import("@export ecgl.edge\n\nuniform sampler2D texture;\n\nuniform sampler2D normalTexture;\nuniform sampler2D depthTexture;\n\nuniform mat4 projectionInv;\n\nuniform vec2 textureSize;\n\nuniform vec4 edgeColor: [0,0,0,0.8];\n\nvarying vec2 v_Texcoord;\n\nvec3 packColor(vec2 coord) {\n float z = texture2D(depthTexture, coord).r * 2.0 - 1.0;\n vec4 p = vec4(v_Texcoord * 2.0 - 1.0, z, 1.0);\n vec4 p4 = projectionInv * p;\n\n return vec3(\n texture2D(normalTexture, coord).rg,\n -p4.z / p4.w / 5.0\n );\n}\n\nvoid main() {\n vec2 cc = v_Texcoord;\n vec3 center = packColor(cc);\n\n float size = clamp(1.0 - (center.z - 10.0) / 100.0, 0.0, 1.0) * 0.5;\n float dx = size / textureSize.x;\n float dy = size / textureSize.y;\n\n vec2 coord;\n vec3 topLeft = packColor(cc+vec2(-dx, -dy));\n vec3 top = packColor(cc+vec2(0.0, -dy));\n vec3 topRight = packColor(cc+vec2(dx, -dy));\n vec3 left = packColor(cc+vec2(-dx, 0.0));\n vec3 right = packColor(cc+vec2(dx, 0.0));\n vec3 bottomLeft = packColor(cc+vec2(-dx, dy));\n vec3 bottom = packColor(cc+vec2(0.0, dy));\n vec3 bottomRight = packColor(cc+vec2(dx, dy));\n\n vec3 v = -topLeft-2.0*top-topRight+bottomLeft+2.0*bottom+bottomRight;\n vec3 h = -bottomLeft-2.0*left-topLeft+bottomRight+2.0*right+topRight;\n\n float edge = sqrt(dot(h, h) + dot(v, v));\n\n edge = smoothstep(0.8, 1.0, edge);\n\n gl_FragColor = mix(texture2D(texture, v_Texcoord), vec4(edgeColor.rgb, 1.0), edgeColor.a * edge);\n}\n@end");
var El = ["composite", "FXAA"];
function Cl() {
this._width,
this._height,
this._dpr,
this._sourceTexture = new Dr({
type: wr.HALF_FLOAT
}),
this._depthTexture = new Dr({
format: wr.DEPTH_COMPONENT,
type: wr.UNSIGNED_INT
}),
this._framebuffer = new zi,
this._framebuffer.attach(this._sourceTexture),
this._framebuffer.attach(this._depthTexture, zi.DEPTH_ATTACHMENT),
this._normalPass = new wl,
this._compositor = function (e, t) {
var r = new Ws;
t = t || {};
var i = {
textures: {},
parameters: {}
};
for (var n in e.parameters) {
var a = e.parameters[n];
i.parameters[n] = sl(a)
}
return function (e, t, r, i) {
if (e.textures) {
var n = {}
, a = 0
, o = !1
, s = r.textureRootPath;
f.each(e.textures, (function (e, t) {
var r, l = e.path, h = sl(e.parameters);
if (Array.isArray(l) && 6 === l.length)
s && (l = l.map((function (e) {
return f.relative2absolute(e, s)
}
))),
r = new Ai(h);
else {
if ("string" != typeof l)
return;
s && (l = f.relative2absolute(l, s)),
r = new Dr(h)
}
r.load(l),
a++,
r.once("success", (function () {
n[t] = r,
0 == --a && (i(n),
o = !0)
}
))
}
)),
0 !== a || o || i(n)
} else
i({})
}(e, 0, t, (function (n) {
i.textures = n,
function (n, a) {
for (var o = 0; o < e.nodes.length; o++) {
var s = nl(e.nodes[o], i, t);
s && r.addNode(s)
}
}()
}
)),
r
}(Ml);
var e = this._compositor.getNodeByName("source");
e.texture = this._sourceTexture;
var t = this._compositor.getNodeByName("coc");
this._sourceNode = e,
this._cocNode = t,
this._compositeNode = this._compositor.getNodeByName("composite"),
this._fxaaNode = this._compositor.getNodeByName("FXAA"),
this._dofBlurNodes = ["dof_far_blur", "dof_near_blur", "dof_coc_blur"].map((function (e) {
return this._compositor.getNodeByName(e)
}
), this),
this._dofBlurKernel = 0,
this._dofBlurKernelSize = new Float32Array(0),
this._finalNodesChain = El.map((function (e) {
return this._compositor.getNodeByName(e)
}
), this);
var r = {
normalTexture: this._normalPass.getNormalTexture(),
depthTexture: this._normalPass.getDepthTexture()
};
this._ssaoPass = new ml(r),
this._ssrPass = new _l(r),
this._edgePass = new Sl(r)
}
Cl.prototype.resize = function (e, t, r) {
e *= r = r || 1,
t *= r;
var i = this._sourceTexture
, n = this._depthTexture;
i.width = e,
i.height = t,
n.width = e,
n.height = t;
var a = {
getWidth: function () {
return e
},
getHeight: function () {
return t
},
getDevicePixelRatio: function () {
return r
}
};
function o(e, t) {
if ("function" == typeof e[t]) {
var r = e[t].__original || e[t];
e[t] = function (e) {
return r.call(this, a)
}
,
e[t].__original = r
}
}
this._compositor.nodes.forEach((function (e) {
for (var t in e.outputs) {
var r = e.outputs[t].parameters;
r && (o(r, "width"),
o(r, "height"))
}
for (var i in e.parameters)
o(e.parameters, i)
}
)),
this._width = e,
this._height = t,
this._dpr = r
}
,
Cl.prototype.getWidth = function () {
return this._width
}
,
Cl.prototype.getHeight = function () {
return this._height
}
,
Cl.prototype._ifRenderNormalPass = function () {
return this._enableSSAO || this._enableEdge || this._enableSSR
}
,
Cl.prototype._getPrevNode = function (e) {
for (var t = El.indexOf(e.name) - 1, r = this._finalNodesChain[t]; r && !this._compositor.getNodeByName(r.name);)
t -= 1,
r = this._finalNodesChain[t];
return r
}
,
Cl.prototype._getNextNode = function (e) {
for (var t = El.indexOf(e.name) + 1, r = this._finalNodesChain[t]; r && !this._compositor.getNodeByName(r.name);)
t += 1,
r = this._finalNodesChain[t];
return r
}
,
Cl.prototype._addChainNode = function (e) {
var t = this._getPrevNode(e)
, r = this._getNextNode(e);
t && (e.inputs.texture = t.name,
r ? (e.outputs = Al(this.getWidth.bind(this), this.getHeight.bind(this)),
r.inputs.texture = e.name) : e.outputs = null,
this._compositor.addNode(e))
}
,
Cl.prototype._removeChainNode = function (e) {
var t = this._getPrevNode(e)
, r = this._getNextNode(e);
t && (r ? (t.outputs = Al(this.getWidth.bind(this), this.getHeight.bind(this)),
r.inputs.texture = t.name) : t.outputs = null,
this._compositor.removeNode(e))
}
,
Cl.prototype.updateNormal = function (e, t, r, i) {
this._ifRenderNormalPass() && this._normalPass.update(e, t, r)
}
,
Cl.prototype.updateSSAO = function (e, t, r, i) {
this._ssaoPass.update(e, r, i)
}
,
Cl.prototype.enableSSAO = function () {
this._enableSSAO = !0
}
,
Cl.prototype.disableSSAO = function () {
this._enableSSAO = !1
}
,
Cl.prototype.enableSSR = function () {
this._enableSSR = !0
}
,
Cl.prototype.disableSSR = function () {
this._enableSSR = !1
}
,
Cl.prototype.getSSAOTexture = function () {
return this._ssaoPass.getTargetTexture()
}
,
Cl.prototype.getSourceFrameBuffer = function () {
return this._framebuffer
}
,
Cl.prototype.getSourceTexture = function () {
return this._sourceTexture
}
,
Cl.prototype.disableFXAA = function () {
this._removeChainNode(this._fxaaNode)
}
,
Cl.prototype.enableFXAA = function () {
this._addChainNode(this._fxaaNode)
}
,
Cl.prototype.enableBloom = function () {
this._compositeNode.inputs.bloom = "bloom_composite",
this._compositor.dirty()
}
,
Cl.prototype.disableBloom = function () {
this._compositeNode.inputs.bloom = null,
this._compositor.dirty()
}
,
Cl.prototype.enableDOF = function () {
this._compositeNode.inputs.texture = "dof_composite",
this._compositor.dirty()
}
,
Cl.prototype.disableDOF = function () {
this._compositeNode.inputs.texture = "source",
this._compositor.dirty()
}
,
Cl.prototype.enableColorCorrection = function () {
this._compositeNode.define("COLOR_CORRECTION"),
this._enableColorCorrection = !0
}
,
Cl.prototype.disableColorCorrection = function () {
this._compositeNode.undefine("COLOR_CORRECTION"),
this._enableColorCorrection = !1
}
,
Cl.prototype.enableEdge = function () {
this._enableEdge = !0
}
,
Cl.prototype.disableEdge = function () {
this._enableEdge = !1
}
,
Cl.prototype.setBloomIntensity = function (e) {
this._compositeNode.setParameter("bloomIntensity", e)
}
,
Cl.prototype.setSSAOParameter = function (e, t) {
switch (e) {
case "quality":
var r = {
low: 6,
medium: 12,
high: 32,
ultra: 62
}[t] || 12;
this._ssaoPass.setParameter("kernelSize", r);
break;
case "radius":
this._ssaoPass.setParameter(e, t),
this._ssaoPass.setParameter("bias", t / 200);
break;
case "intensity":
this._ssaoPass.setParameter(e, t)
}
}
,
Cl.prototype.setDOFParameter = function (e, t) {
switch (e) {
case "focalDistance":
case "focalRange":
case "fstop":
this._cocNode.setParameter(e, t);
break;
case "blurRadius":
for (var r = 0; r < this._dofBlurNodes.length; r++)
this._dofBlurNodes[r].setParameter("blurRadius", t);
break;
case "quality":
var i = {
low: 4,
medium: 8,
high: 16,
ultra: 32
}[t] || 8;
for (this._dofBlurKernelSize = i,
r = 0; r < this._dofBlurNodes.length; r++)
this._dofBlurNodes[r].pass.material.define("POISSON_KERNEL_SIZE", i);
this._dofBlurKernel = new Float32Array(2 * i)
}
}
,
Cl.prototype.setSSRParameter = function (e, t) {
if (null != t)
switch (e) {
case "quality":
var r = {
low: 10,
medium: 15,
high: 30,
ultra: 80
}[t] || 20
, i = {
low: 32,
medium: 16,
high: 8,
ultra: 4
}[t] || 16;
this._ssrPass.setParameter("maxIteration", r),
this._ssrPass.setParameter("pixelStride", i);
break;
case "maxRoughness":
this._ssrPass.setParameter("minGlossiness", Math.max(Math.min(1 - t, 1), 0));
break;
case "physical":
this.setPhysicallyCorrectSSR(t);
break;
default:
console.warn("Unkown SSR parameter " + e)
}
}
,
Cl.prototype.setPhysicallyCorrectSSR = function (e) {
this._ssrPass.setPhysicallyCorrect(e)
}
,
Cl.prototype.setEdgeColor = function (e) {
var t = Ka.parseColor(e);
this._edgePass.setParameter("edgeColor", t)
}
,
Cl.prototype.setExposure = function (e) {
this._compositeNode.setParameter("exposure", Math.pow(2, e))
}
,
Cl.prototype.setColorLookupTexture = function (e, t) {
this._compositeNode.pass.material.setTextureImage("lut", this._enableColorCorrection ? e : "none", t, {
minFilter: Ka.Texture.NEAREST,
magFilter: Ka.Texture.NEAREST,
flipY: !1
})
}
,
Cl.prototype.setColorCorrection = function (e, t) {
this._compositeNode.setParameter(e, t)
}
,
Cl.prototype.isSSREnabled = function () {
return this._enableSSR
}
,
Cl.prototype.composite = function (e, t, r, i, n) {
var a = this._sourceTexture
, o = a;
this._enableEdge && (this._edgePass.update(e, r, a, n),
a = o = this._edgePass.getTargetTexture()),
this._enableSSR && (this._ssrPass.update(e, r, a, n),
o = this._ssrPass.getTargetTexture(),
this._ssrPass.setSSAOTexture(this._enableSSAO ? this._ssaoPass.getTargetTexture() : null)),
this._sourceNode.texture = o,
this._cocNode.setParameter("depth", this._depthTexture);
for (var s = this._dofBlurKernel, l = this._dofBlurKernelSize, h = n % Math.floor(vl.length / 2 / l), u = 0; u < 2 * l; u++)
s[u] = vl[u + h * l * 2];
for (u = 0; u < this._dofBlurNodes.length; u++)
this._dofBlurNodes[u].setParameter("percent", n / 30),
this._dofBlurNodes[u].setParameter("poissonKernel", s);
this._cocNode.setParameter("zNear", r.near),
this._cocNode.setParameter("zFar", r.far),
this._compositor.render(e, i)
}
,
Cl.prototype.dispose = function (e) {
this._sourceTexture.dispose(e),
this._depthTexture.dispose(e),
this._framebuffer.dispose(e),
this._compositor.dispose(e),
this._normalPass.dispose(e),
this._ssaoPass.dispose(e)
}
;
const Dl = Cl;
function Ll(e) {
for (var t = [], r = 0; r < 30; r++)
t.push([ul(r, 2), ul(r, 3)]);
this._haltonSequence = t,
this._frame = 0,
this._sourceTex = new Dr,
this._sourceFb = new zi,
this._sourceFb.attach(this._sourceTex),
this._prevFrameTex = new Dr,
this._outputTex = new Dr;
var i = this._blendPass = new pn({
fragment: Xe.source("clay.compositor.blend")
});
i.material.disableTexturesAll(),
i.material.enableTexture(["texture1", "texture2"]),
this._blendFb = new zi({
depthBuffer: !1
}),
this._outputPass = new pn({
fragment: Xe.source("clay.compositor.output"),
blendWithPrevious: !0
}),
this._outputPass.material.define("fragment", "OUTPUT_ALPHA"),
this._outputPass.material.blend = function (e) {
e.blendEquationSeparate(e.FUNC_ADD, e.FUNC_ADD),
e.blendFuncSeparate(e.ONE, e.ONE_MINUS_SRC_ALPHA, e.ONE, e.ONE_MINUS_SRC_ALPHA)
}
}
Ll.prototype = {
constructor: Ll,
jitterProjection: function (e, t) {
var r = e.viewport
, i = r.devicePixelRatio || e.getDevicePixelRatio()
, n = r.width * i
, a = r.height * i
, o = this._haltonSequence[this._frame % this._haltonSequence.length]
, s = new Ht;
s.array[12] = (2 * o[0] - 1) / n,
s.array[13] = (2 * o[1] - 1) / a,
Ht.mul(t.projectionMatrix, s, t.projectionMatrix),
Ht.invert(t.invProjectionMatrix, t.projectionMatrix)
},
resetFrame: function () {
this._frame = 0
},
getFrame: function () {
return this._frame
},
getSourceFrameBuffer: function () {
return this._sourceFb
},
getOutputTexture: function () {
return this._outputTex
},
resize: function (e, t) {
this._prevFrameTex.width = e,
this._prevFrameTex.height = t,
this._outputTex.width = e,
this._outputTex.height = t,
this._sourceTex.width = e,
this._sourceTex.height = t,
this._prevFrameTex.dirty(),
this._outputTex.dirty(),
this._sourceTex.dirty()
},
isFinished: function () {
return this._frame >= this._haltonSequence.length
},
render: function (e, t, r) {
var i = this._blendPass;
0 === this._frame ? (i.setUniform("weight1", 0),
i.setUniform("weight2", 1)) : (i.setUniform("weight1", .9),
i.setUniform("weight2", .1)),
i.setUniform("texture1", this._prevFrameTex),
i.setUniform("texture2", t || this._sourceTex),
this._blendFb.attach(this._outputTex),
this._blendFb.bind(e),
i.render(e),
this._blendFb.unbind(e),
r || (this._outputPass.setUniform("texture", this._outputTex),
this._outputPass.render(e));
var n = this._prevFrameTex;
this._prevFrameTex = this._outputTex,
this._outputTex = n,
this._frame++
},
dispose: function (e) {
this._sourceFb.dispose(e),
this._blendFb.dispose(e),
this._prevFrameTex.dispose(e),
this._outputTex.dispose(e),
this._sourceTex.dispose(e),
this._outputPass.dispose(e),
this._blendPass.dispose(e)
}
};
const Pl = Ll;
function Ol(e) {
e = e || "perspective",
this.layer = null,
this.scene = new vi,
this.rootNode = this.scene,
this.viewport = {
x: 0,
y: 0,
width: 0,
height: 0
},
this.setProjection(e),
this._compositor = new Dl,
this._temporalSS = new Pl,
this._shadowMapPass = new ks;
for (var t = [], r = 0, i = 0; i < 30; i++) {
for (var n = [], a = 0; a < 6; a++)
n.push(4 * ul(r, 2) - 2),
n.push(4 * ul(r, 3) - 2),
r++;
t.push(n)
}
this._pcfKernels = t,
this.scene.on("beforerender", (function (e, t, r) {
this.needsTemporalSS() && this._temporalSS.jitterProjection(e, r)
}
), this)
}
Ol.prototype.setProjection = function (e) {
var t = this.camera;
t && t.update(),
"perspective" === e ? this.camera instanceof Ei || (this.camera = new Ei,
t && this.camera.setLocalTransform(t.localTransform)) : this.camera instanceof un || (this.camera = new un,
t && this.camera.setLocalTransform(t.localTransform)),
this.camera.near = .1,
this.camera.far = 2e3
}
,
Ol.prototype.setViewport = function (e, t, r, i, n) {
this.camera instanceof Ei && (this.camera.aspect = r / i),
n = n || 1,
this.viewport.x = e,
this.viewport.y = t,
this.viewport.width = r,
this.viewport.height = i,
this.viewport.devicePixelRatio = n,
this._compositor.resize(r * n, i * n),
this._temporalSS.resize(r * n, i * n)
}
,
Ol.prototype.containPoint = function (e, t) {
var r = this.viewport;
return t = this.layer.renderer.getHeight() - t,
e >= r.x && t >= r.y && e <= r.x + r.width && t <= r.y + r.height
}
;
var Nl = new _e;
Ol.prototype.castRay = function (e, t, r) {
var i = this.layer.renderer
, n = i.viewport;
return i.viewport = this.viewport,
i.screenToNDC(e, t, Nl),
this.camera.castRay(Nl, r),
i.viewport = n,
r
}
,
Ol.prototype.prepareRender = function () {
this.scene.update(),
this.camera.update(),
this.scene.updateLights();
var e = this.scene.updateRenderList(this.camera);
this._needsSortProgressively = !1;
for (var t = 0; t < e.transparent.length; t++) {
var r = e.transparent[t].geometry;
r.needsSortVerticesProgressively && r.needsSortVerticesProgressively() && (this._needsSortProgressively = !0),
r.needsSortTrianglesProgressively && r.needsSortTrianglesProgressively() && (this._needsSortProgressively = !0)
}
this._frame = 0,
this._temporalSS.resetFrame()
}
,
Ol.prototype.render = function (e, t) {
this._doRender(e, t, this._frame),
this._frame++
}
,
Ol.prototype.needsAccumulate = function () {
return this.needsTemporalSS() || this._needsSortProgressively
}
,
Ol.prototype.needsTemporalSS = function () {
var e = this._enableTemporalSS;
return "auto" === e && (e = this._enablePostEffect),
e
}
,
Ol.prototype.hasDOF = function () {
return this._enableDOF
}
,
Ol.prototype.isAccumulateFinished = function () {
return this.needsTemporalSS() ? this._temporalSS.isFinished() : this._frame > 30
}
,
Ol.prototype._doRender = function (e, t, r) {
var i = this.scene
, n = this.camera;
r = r || 0,
this._updateTransparent(e, i, n, r),
t || (this._shadowMapPass.kernelPCF = this._pcfKernels[0],
this._shadowMapPass.render(e, i, n, !0)),
this._updateShadowPCFKernel(r);
var a, o = e.clearColor;
e.gl.clearColor(o[0], o[1], o[2], o[3]),
this._enablePostEffect && (this.needsTemporalSS() && this._temporalSS.jitterProjection(e, n),
this._compositor.updateNormal(e, i, n, this._temporalSS.getFrame())),
this._updateSSAO(e, i, n, this._temporalSS.getFrame()),
this._enablePostEffect ? ((a = this._compositor.getSourceFrameBuffer()).bind(e),
e.gl.clear(e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT),
e.render(i, n, !0, !0),
a.unbind(e),
this.needsTemporalSS() && t ? (this._compositor.composite(e, i, n, this._temporalSS.getSourceFrameBuffer(), this._temporalSS.getFrame()),
e.setViewport(this.viewport),
this._temporalSS.render(e)) : (e.setViewport(this.viewport),
this._compositor.composite(e, i, n, null, 0))) : this.needsTemporalSS() && t ? ((a = this._temporalSS.getSourceFrameBuffer()).bind(e),
e.saveClear(),
e.clearBit = e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT,
e.render(i, n, !0, !0),
e.restoreClear(),
a.unbind(e),
e.setViewport(this.viewport),
this._temporalSS.render(e)) : (e.setViewport(this.viewport),
e.render(i, n, !0, !0))
}
,
Ol.prototype._updateTransparent = function (e, t, r, i) {
for (var n = new vt, a = new Ht, o = r.getWorldPosition(), s = t.getRenderList(r).transparent, l = 0; l < s.length; l++) {
var h = s[l]
, u = h.geometry;
Ht.invert(a, h.worldTransform),
vt.transformMat4(n, o, a),
u.needsSortTriangles && u.needsSortTriangles() && u.doSortTriangles(n, i),
u.needsSortVertices && u.needsSortVertices() && u.doSortVertices(n, i)
}
}
,
Ol.prototype._updateSSAO = function (e, t, r) {
var i = this._enableSSAO && this._enablePostEffect;
i && this._compositor.updateSSAO(e, t, r, this._temporalSS.getFrame());
for (var n = t.getRenderList(r), a = 0; a < n.opaque.length; a++) {
var o = n.opaque[a];
o.renderNormal && o.material[i ? "enableTexture" : "disableTexture"]("ssaoMap"),
i && o.material.set("ssaoMap", this._compositor.getSSAOTexture())
}
}
,
Ol.prototype._updateShadowPCFKernel = function (e) {
for (var t = this._pcfKernels[e % this._pcfKernels.length], r = this.scene.getRenderList(this.camera).opaque, i = 0; i < r.length; i++)
r[i].receiveShadow && (r[i].material.set("pcfKernel", t),
r[i].material.define("fragment", "PCF_KERNEL_SIZE", t.length / 2))
}
,
Ol.prototype.dispose = function (e) {
this._compositor.dispose(e.gl),
this._temporalSS.dispose(e.gl),
this._shadowMapPass.dispose(e)
}
,
Ol.prototype.setPostEffect = function (e, t) {
var r = this._compositor;
this._enablePostEffect = e.get("enable");
var i = e.getModel("bloom")
, n = e.getModel("edge")
, a = e.getModel("DOF", e.getModel("depthOfField"))
, o = e.getModel("SSAO", e.getModel("screenSpaceAmbientOcclusion"))
, s = e.getModel("SSR", e.getModel("screenSpaceReflection"))
, l = e.getModel("FXAA")
, h = e.getModel("colorCorrection");
i.get("enable") ? r.enableBloom() : r.disableBloom(),
a.get("enable") ? r.enableDOF() : r.disableDOF(),
s.get("enable") ? r.enableSSR() : r.disableSSR(),
h.get("enable") ? r.enableColorCorrection() : r.disableColorCorrection(),
n.get("enable") ? r.enableEdge() : r.disableEdge(),
l.get("enable") ? r.enableFXAA() : r.disableFXAA(),
this._enableDOF = a.get("enable"),
this._enableSSAO = o.get("enable"),
this._enableSSAO ? r.enableSSAO() : r.disableSSAO(),
r.setBloomIntensity(i.get("intensity")),
r.setEdgeColor(n.get("color")),
r.setColorLookupTexture(h.get("lookupTexture"), t),
r.setExposure(h.get("exposure")),
["radius", "quality", "intensity"].forEach((function (e) {
r.setSSAOParameter(e, o.get(e))
}
)),
["quality", "maxRoughness", "physical"].forEach((function (e) {
r.setSSRParameter(e, s.get(e))
}
)),
["quality", "focalDistance", "focalRange", "blurRadius", "fstop"].forEach((function (e) {
r.setDOFParameter(e, a.get(e))
}
)),
["brightness", "contrast", "saturation"].forEach((function (e) {
r.setColorCorrection(e, h.get(e))
}
))
}
,
Ol.prototype.setDOFFocusOnPoint = function (e) {
if (this._enablePostEffect) {
if (e > this.camera.far || e < this.camera.near)
return;
return this._compositor.setDOFParameter("focalDistance", e),
!0
}
}
,
Ol.prototype.setTemporalSuperSampling = function (e) {
this._enableTemporalSS = e.get("enable")
}
,
Ol.prototype.isLinearSpace = function () {
return this._enablePostEffect
}
,
Ol.prototype.setRootNode = function (e) {
if (this.rootNode !== e) {
for (var t = this.rootNode.children(), r = 0; r < t.length; r++)
e.add(t[r]);
e !== this.scene && this.scene.add(e),
this.rootNode = e
}
}
,
Ol.prototype.add = function (e) {
this.rootNode.add(e)
}
,
Ol.prototype.remove = function (e) {
this.rootNode.remove(e)
}
,
Ol.prototype.removeAll = function (e) {
this.rootNode.removeAll(e)
}
,
Object.assign(Ol.prototype, h);
const Il = Ol;
function Rl(e, t) {
var r = Ss(e.getBoxLayoutParams(), {
width: t.getWidth(),
height: t.getHeight()
});
r.y = t.getHeight() - r.y - r.height,
this.viewGL.setViewport(r.x, r.y, r.width, r.height, t.getDevicePixelRatio());
var i = e.get("boxWidth")
, n = e.get("boxHeight")
, a = e.get("boxDepth");
this.getAxis("x").setExtent(-i / 2, i / 2),
this.getAxis("y").setExtent(a / 2, -a / 2),
this.getAxis("z").setExtent(-n / 2, n / 2),
this.size = [i, n, a]
}
function Bl(e, t) {
var r = {};
e.eachSeries((function (e) {
if (e.coordinateSystem === this) {
var t = e.getData();
["x", "y", "z"].forEach((function (e) {
t.mapDimensionsAll(e, !0).forEach((function (i) {
var n, a;
n = e,
a = t.getDataExtent(i, !0),
r[n] = r[n] || [1 / 0, -1 / 0],
r[n][0] = Math.min(a[0], r[n][0]),
r[n][1] = Math.max(a[1], r[n][1])
}
))
}
))
}
}
), this),
["xAxis3D", "yAxis3D", "zAxis3D"].forEach((function (t) {
e.eachComponent(t, (function (e) {
var n = t.charAt(0)
, a = e.getReferringComponents("grid3D").models[0]
, o = a.coordinateSystem;
if (o === this) {
var s = o.getAxis(n);
if (!s) {
var l = i.helper.createScale(r[n] || [1 / 0, -1 / 0], e);
(s = new cs(n, l)).type = e.get("type");
var h = "category" === s.type;
s.onBand = h && e.get("boundaryGap"),
s.inverse = e.get("inverse"),
e.axis = s,
s.model = e,
s.getLabelModel = function () {
return e.getModel("axisLabel", a.getModel("axisLabel"))
}
,
s.getTickModel = function () {
return e.getModel("axisTick", a.getModel("axisTick"))
}
,
o.addAxis(s)
}
}
}
), this)
}
), this),
this.resize(this.model, t)
}
const Fl = {
dimensions: hs.prototype.dimensions,
create: function (e, t) {
var r = [];
e.eachComponent("grid3D", (function (e) {
e.__viewGL = e.__viewGL || new Il;
var t = new hs;
t.model = e,
t.viewGL = e.__viewGL,
e.coordinateSystem = t,
r.push(t),
t.resize = Rl,
t.update = Bl
}
));
var i = ["xAxis3D", "yAxis3D", "zAxis3D"];
return e.eachSeries((function (t) {
if ("cartesian3D" === t.get("coordinateSystem")) {
if (null == (n = t.getReferringComponents("grid3D").models[0])) {
var r = function (e, t) {
return i.map((function (r) {
var i = e.getReferringComponents(r).models[0];
return null == i && (i = t.getComponent(r)),
i
}
))
}(t, e)
, n = r[0].getCoordSysModel();
r.forEach((function (e) {
e.getCoordSysModel()
}
))
}
var a = n.coordinateSystem;
t.coordinateSystem = a
}
}
)),
r
}
};
var zl = i.ComponentModel.extend({
type: "cartesian3DAxis",
axis: null,
getCoordSysModel: function () {
return this.ecModel.queryComponents({
mainType: "grid3D",
index: this.option.gridIndex,
id: this.option.gridId
})[0]
}
});
i.helper.mixinAxisModelCommonMethods(zl);
const Gl = zl;
var Ul = {
show: !0,
grid3DIndex: 0,
inverse: !1,
name: "",
nameLocation: "middle",
nameTextStyle: {
fontSize: 16
},
nameGap: 20,
axisPointer: {},
axisLine: {},
axisTick: {},
axisLabel: {},
splitArea: {}
}
, kl = i.util.merge({
boundaryGap: !0,
axisTick: {
alignWithLabel: !1,
interval: "auto"
},
axisLabel: {
interval: "auto"
},
axisPointer: {
label: {
show: !1
}
}
}, Ul)
, Vl = i.util.merge({
boundaryGap: [0, 0],
splitNumber: 5,
axisPointer: {
label: {}
}
}, Ul)
, Hl = i.util.defaults({
scale: !0,
min: "dataMin",
max: "dataMax"
}, Vl)
, Wl = i.util.defaults({
logBase: 10
}, Vl);
Wl.scale = !0;
const jl = {
categoryAxis3D: kl,
valueAxis3D: Vl,
timeAxis3D: Hl,
logAxis3D: Wl
};
function Xl(e) {
return ("function" === (r = typeof (t = e)) || t && "object" === r) && null != e.value ? e.value : e + "";
var t, r
}
const ql = function () {
function e(e) {
this.categories = e.categories || [],
this._needCollect = e.needCollect,
this._deduplication = e.deduplication
}
return e.createByAxisModel = function (t) {
var r = t.option
, i = r.data
, n = i && xa(i, Xl);
return new e({
categories: n,
needCollect: !n,
deduplication: !1 !== r.dedplication
})
}
,
e.prototype.getOrdinal = function (e) {
return this._getOrCreateMap().get(e)
}
,
e.prototype.parseAndCollect = function (e) {
var t, r = this._needCollect;
if ("string" != typeof e && !r)
return e;
if (r && !this._deduplication)
return t = this.categories.length,
this.categories[t] = e,
t;
var i = this._getOrCreateMap();
return null == (t = i.get(e)) && (r ? (t = this.categories.length,
this.categories[t] = e,
i.set(e, t)) : t = NaN),
t
}
,
e.prototype._getOrCreateMap = function () {
return this._map || (this._map = (e = this.categories,
new Ma(e)));
var e
}
,
e
}();
var Zl = ["value", "category", "time", "log"];
function Yl(e, t) {
return t.type || (t.data ? "category" : "value")
}
(0,
i.use)((function (e) {
e.registerComponentModel(mo),
e.registerComponentView(os),
e.registerCoordinateSystem("grid3D", Fl),
["x", "y", "z"].forEach((function (t) {
!function (e, t, r, n, a) {
Zl.forEach((function (o) {
var s = r.extend({
type: t + "Axis3D." + o,
__ordinalMeta: null,
mergeDefaultAndTheme: function (e, r) {
var a = r.getTheme();
i.util.merge(e, a.get(o + "Axis3D")),
i.util.merge(e, this.getDefaultOption()),
e.type = n(t, e)
},
optionUpdated: function () {
"category" === this.option.type && (this.__ordinalMeta = ql.createByAxisModel(this))
},
getCategories: function () {
if ("category" === this.option.type)
return this.__ordinalMeta.categories
},
getOrdinalMeta: function () {
return this.__ordinalMeta
},
defaultOption: i.util.merge(i.util.clone(jl[o + "Axis3D"]), a || {}, !0)
});
e.registerComponentModel(s)
}
)),
e.registerSubTypeDefaulter(t + "Axis3D", i.util.curry(n, t))
}(e, t, Gl, Yl, {
name: t.toUpperCase()
});
const r = e.ComponentView.extend({
type: t + "Axis3D"
});
e.registerComponentView(r)
}
)),
e.registerAction({
type: "grid3DChangeCamera",
event: "grid3dcamerachanged",
update: "series:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "grid3D",
query: e
}, (function (t) {
t.setView(e)
}
))
}
)),
e.registerAction({
type: "grid3DShowAxisPointer",
event: "grid3dshowaxispointer",
update: "grid3D:showAxisPointer"
}, (function (e, t) { }
)),
e.registerAction({
type: "grid3DHideAxisPointer",
event: "grid3dhideaxispointer",
update: "grid3D:hideAxisPointer"
}, (function (e, t) { }
))
}
));
const Kl = {
defaultOption: {
shading: null,
realisticMaterial: {
textureTiling: 1,
textureOffset: 0,
detailTexture: null
},
lambertMaterial: {
textureTiling: 1,
textureOffset: 0,
detailTexture: null
},
colorMaterial: {
textureTiling: 1,
textureOffset: 0,
detailTexture: null
},
hatchingMaterial: {
textureTiling: 1,
textureOffset: 0,
paperColor: "#fff"
}
}
}
, Ql = {
getFilledRegions: function (e, t) {
var r, n = (e || []).slice();
if ("string" == typeof t ? r = (t = i.getMap(t)) && t.geoJson : t && t.features && (r = t),
!r)
return [];
for (var a = {}, o = r.features, s = 0; s < n.length; s++)
a[n[s].name] = n[s];
for (s = 0; s < o.length; s++) {
var l = o[s].properties.name;
a[l] || n.push({
name: l
})
}
return n
},
defaultOption: {
show: !0,
zlevel: -10,
map: "",
left: 0,
top: 0,
width: "100%",
height: "100%",
boxWidth: 100,
boxHeight: 10,
boxDepth: "auto",
regionHeight: 3,
environment: "auto",
groundPlane: {
show: !1,
color: "#aaa"
},
shading: "lambert",
light: {
main: {
alpha: 40,
beta: 30
}
},
viewControl: {
alpha: 40,
beta: 0,
distance: 100,
orthographicSize: 60,
minAlpha: 5,
minBeta: -80,
maxBeta: 80
},
label: {
show: !1,
distance: 2,
textStyle: {
fontSize: 20,
color: "#000",
backgroundColor: "rgba(255,255,255,0.7)",
padding: 3,
borderRadius: 4
}
},
itemStyle: {
color: "#fff",
borderWidth: 0,
borderColor: "#333"
},
emphasis: {
itemStyle: {
color: "#639fc0"
},
label: {
show: !0
}
}
}
};
var Jl = i.ComponentModel.extend({
type: "geo3D",
layoutMode: "box",
coordinateSystem: null,
optionUpdated: function () {
var e = this.option;
e.regions = this.getFilledRegions(e.regions, e.map);
var t = i.helper.createDimensions(e.data || [], {
coordDimensions: ["value"],
encodeDefine: this.get("encode"),
dimensionsDefine: this.get("dimensions")
})
, r = new i.List(t, this);
r.initData(e.regions);
var n = {};
r.each((function (e) {
var t = r.getName(e)
, i = r.getItemModel(e);
n[t] = i
}
)),
this._regionModelMap = n,
this._data = r
},
getData: function () {
return this._data
},
getRegionModel: function (e) {
var t = this.getData().getName(e);
return this._regionModelMap[t] || new i.Model(null, this)
},
getRegionPolygonCoords: function (e) {
var t = this.getData().getName(e)
, r = this.coordinateSystem.getRegion(t);
return r ? r.geometries : []
},
getFormattedLabel: function (e, t) {
var r = this._data.getName(e)
, i = this.getRegionModel(e)
, n = i.get("normal" === t ? ["label", "formatter"] : ["emphasis", "label", "formatter"]);
null == n && (n = i.get(["label", "formatter"]));
var a = {
name: r
};
if ("function" == typeof n)
return a.status = t,
n(a);
if ("string" == typeof n) {
var o = a.seriesName;
return n.replace("{a}", null != o ? o : "")
}
return r
},
defaultOption: {
regions: []
}
});
i.util.merge(Jl.prototype, Ql),
i.util.merge(Jl.prototype, uo),
i.util.merge(Jl.prototype, co),
i.util.merge(Jl.prototype, fo),
i.util.merge(Jl.prototype, Kl);
const $l = Jl
, eh = th;
function th(e, t, r) {
r = r || 2;
var i, n, a, o, s, l, h, u = t && t.length, c = u ? t[0] * r : e.length, d = rh(e, 0, c, r, !0), f = [];
if (!d)
return f;
if (u && (d = function (e, t, r, i) {
var n, a, o, s = [];
for (n = 0,
a = t.length; n < a; n++)
(o = rh(e, t[n] * i, n < a - 1 ? t[n + 1] * i : e.length, i, !1)) === o.next && (o.steiner = !0),
s.push(dh(o));
for (s.sort(hh),
n = 0; n < s.length; n++)
uh(s[n], r),
r = ih(r, r.next);
return r
}(e, t, d, r)),
e.length > 80 * r) {
i = a = e[0],
n = o = e[1];
for (var p = r; p < c; p += r)
(s = e[p]) < i && (i = s),
(l = e[p + 1]) < n && (n = l),
s > a && (a = s),
l > o && (o = l);
h = Math.max(a - i, o - n)
}
return nh(d, f, r, i, n, h),
f
}
function rh(e, t, r, i, n) {
var a, o;
if (n === Th(e, t, r, i) > 0)
for (a = t; a < r; a += i)
o = xh(a, e[a], e[a + 1], o);
else
for (a = r - i; a >= t; a -= i)
o = xh(a, e[a], e[a + 1], o);
return o && gh(o, o.next) && (bh(o),
o = o.next),
o
}
function ih(e, t) {
if (!e)
return e;
t || (t = e);
var r, i = e;
do {
if (r = !1,
i.steiner || !gh(i, i.next) && 0 !== mh(i.prev, i, i.next))
i = i.next;
else {
if (bh(i),
(i = t = i.prev) === i.next)
return null;
r = !0
}
} while (r || i !== t);
return t
}
function nh(e, t, r, i, n, a, o) {
if (e) {
!o && a && function (e, t, r, i) {
var n = e;
do {
null === n.z && (n.z = ch(n.x, n.y, t, r, i)),
n.prevZ = n.prev,
n.nextZ = n.next,
n = n.next
} while (n !== e);
n.prevZ.nextZ = null,
n.prevZ = null,
function (e) {
var t, r, i, n, a, o, s, l, h = 1;
do {
for (r = e,
e = null,
a = null,
o = 0; r;) {
for (o++,
i = r,
s = 0,
t = 0; t < h && (s++,
i = i.nextZ); t++)
;
for (l = h; s > 0 || l > 0 && i;)
0 !== s && (0 === l || !i || r.z <= i.z) ? (n = r,
r = r.nextZ,
s--) : (n = i,
i = i.nextZ,
l--),
a ? a.nextZ = n : e = n,
n.prevZ = a,
a = n;
r = i
}
a.nextZ = null,
h *= 2
} while (o > 1)
}(n)
}(e, i, n, a);
for (var s, l, h = e; e.prev !== e.next;)
if (s = e.prev,
l = e.next,
a ? oh(e, i, n, a) : ah(e))
t.push(s.i / r),
t.push(e.i / r),
t.push(l.i / r),
bh(e),
e = l.next,
h = l.next;
else if ((e = l) === h) {
o ? 1 === o ? nh(e = sh(e, t, r), t, r, i, n, a, 2) : 2 === o && lh(e, t, r, i, n, a) : nh(ih(e), t, r, i, n, a, 1);
break
}
}
}
function ah(e) {
var t = e.prev
, r = e
, i = e.next;
if (mh(t, r, i) >= 0)
return !1;
for (var n = e.next.next; n !== e.prev;) {
if (fh(t.x, t.y, r.x, r.y, i.x, i.y, n.x, n.y) && mh(n.prev, n, n.next) >= 0)
return !1;
n = n.next
}
return !0
}
function oh(e, t, r, i) {
var n = e.prev
, a = e
, o = e.next;
if (mh(n, a, o) >= 0)
return !1;
for (var s = n.x < a.x ? n.x < o.x ? n.x : o.x : a.x < o.x ? a.x : o.x, l = n.y < a.y ? n.y < o.y ? n.y : o.y : a.y < o.y ? a.y : o.y, h = n.x > a.x ? n.x > o.x ? n.x : o.x : a.x > o.x ? a.x : o.x, u = n.y > a.y ? n.y > o.y ? n.y : o.y : a.y > o.y ? a.y : o.y, c = ch(s, l, t, r, i), d = ch(h, u, t, r, i), f = e.nextZ; f && f.z <= d;) {
if (f !== e.prev && f !== e.next && fh(n.x, n.y, a.x, a.y, o.x, o.y, f.x, f.y) && mh(f.prev, f, f.next) >= 0)
return !1;
f = f.nextZ
}
for (f = e.prevZ; f && f.z >= c;) {
if (f !== e.prev && f !== e.next && fh(n.x, n.y, a.x, a.y, o.x, o.y, f.x, f.y) && mh(f.prev, f, f.next) >= 0)
return !1;
f = f.prevZ
}
return !0
}
function sh(e, t, r) {
var i = e;
do {
var n = i.prev
, a = i.next.next;
!gh(n, a) && _h(n, i, i.next, a) && vh(n, a) && vh(a, n) && (t.push(n.i / r),
t.push(i.i / r),
t.push(a.i / r),
bh(i),
bh(i.next),
i = e = a),
i = i.next
} while (i !== e);
return i
}
function lh(e, t, r, i, n, a) {
var o = e;
do {
for (var s = o.next.next; s !== o.prev;) {
if (o.i !== s.i && ph(o, s)) {
var l = yh(o, s);
return o = ih(o, o.next),
l = ih(l, l.next),
nh(o, t, r, i, n, a),
void nh(l, t, r, i, n, a)
}
s = s.next
}
o = o.next
} while (o !== e)
}
function hh(e, t) {
return e.x - t.x
}
function uh(e, t) {
if (t = function (e, t) {
var r, i = t, n = e.x, a = e.y, o = -1 / 0;
do {
if (a <= i.y && a >= i.next.y && i.next.y !== i.y) {
var s = i.x + (a - i.y) * (i.next.x - i.x) / (i.next.y - i.y);
if (s <= n && s > o) {
if (o = s,
s === n) {
if (a === i.y)
return i;
if (a === i.next.y)
return i.next
}
r = i.x < i.next.x ? i : i.next
}
}
i = i.next
} while (i !== t);
if (!r)
return null;
if (n === o)
return r.prev;
var l, h = r, u = r.x, c = r.y, d = 1 / 0;
for (i = r.next; i !== h;)
n >= i.x && i.x >= u && n !== i.x && fh(a < c ? n : o, a, u, c, a < c ? o : n, a, i.x, i.y) && ((l = Math.abs(a - i.y) / (n - i.x)) < d || l === d && i.x > r.x) && vh(i, e) && (r = i,
d = l),
i = i.next;
return r
}(e, t)) {
var r = yh(t, e);
ih(r, r.next)
}
}
function ch(e, t, r, i, n) {
return (e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - r) / n) | e << 8)) | e << 4)) | e << 2)) | e << 1)) | (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - i) / n) | t << 8)) | t << 4)) | t << 2)) | t << 1)) << 1
}
function dh(e) {
var t = e
, r = e;
do {
t.x < r.x && (r = t),
t = t.next
} while (t !== e);
return r
}
function fh(e, t, r, i, n, a, o, s) {
return (n - o) * (t - s) - (e - o) * (a - s) >= 0 && (e - o) * (i - s) - (r - o) * (t - s) >= 0 && (r - o) * (a - s) - (n - o) * (i - s) >= 0
}
function ph(e, t) {
return e.next.i !== t.i && e.prev.i !== t.i && !function (e, t) {
var r = e;
do {
if (r.i !== e.i && r.next.i !== e.i && r.i !== t.i && r.next.i !== t.i && _h(r, r.next, e, t))
return !0;
r = r.next
} while (r !== e);
return !1
}(e, t) && vh(e, t) && vh(t, e) && function (e, t) {
var r = e
, i = !1
, n = (e.x + t.x) / 2
, a = (e.y + t.y) / 2;
do {
r.y > a != r.next.y > a && r.next.y !== r.y && n < (r.next.x - r.x) * (a - r.y) / (r.next.y - r.y) + r.x && (i = !i),
r = r.next
} while (r !== e);
return i
}(e, t)
}
function mh(e, t, r) {
return (t.y - e.y) * (r.x - t.x) - (t.x - e.x) * (r.y - t.y)
}
function gh(e, t) {
return e.x === t.x && e.y === t.y
}
function _h(e, t, r, i) {
return !!(gh(e, t) && gh(r, i) || gh(e, i) && gh(r, t)) || mh(e, t, r) > 0 != mh(e, t, i) > 0 && mh(r, i, e) > 0 != mh(r, i, t) > 0
}
function vh(e, t) {
return mh(e.prev, e, e.next) < 0 ? mh(e, t, e.next) >= 0 && mh(e, e.prev, t) >= 0 : mh(e, t, e.prev) < 0 || mh(e, e.next, t) < 0
}
function yh(e, t) {
var r = new wh(e.i, e.x, e.y)
, i = new wh(t.i, t.x, t.y)
, n = e.next
, a = t.prev;
return e.next = t,
t.prev = e,
r.next = n,
n.prev = r,
i.next = r,
r.prev = i,
a.next = i,
i.prev = a,
i
}
function xh(e, t, r, i) {
var n = new wh(e, t, r);
return i ? (n.next = i.next,
n.prev = i,
i.next.prev = n,
i.next = n) : (n.prev = n,
n.next = n),
n
}
function bh(e) {
e.next.prev = e.prev,
e.prev.next = e.next,
e.prevZ && (e.prevZ.nextZ = e.nextZ),
e.nextZ && (e.nextZ.prevZ = e.prevZ)
}
function wh(e, t, r) {
this.i = e,
this.x = t,
this.y = r,
this.prev = null,
this.next = null,
this.z = null,
this.prevZ = null,
this.nextZ = null,
this.steiner = !1
}
function Th(e, t, r, i) {
for (var n = 0, a = t, o = r - i; a < r; a += i)
n += (e[o] - e[a]) * (e[a + 1] + e[o + 1]),
o = a;
return n
}
function Sh(e, t, r) {
var i = e[t];
e[t] = e[r],
e[r] = i
}
function Mh(e, t, r, i, n) {
var a = r
, o = e[t];
Sh(e, t, i);
for (var s = r; s < i; s++)
n(e[s], o) < 0 && (Sh(e, s, a),
a++);
return Sh(e, i, a),
a
}
function Ah(e, t, r, i) {
if (r < i) {
var n = Mh(e, Math.floor((r + i) / 2), r, i, t);
Ah(e, t, r, n - 1),
Ah(e, t, n + 1, i)
}
}
function Eh() {
this._parts = []
}
th.deviation = function (e, t, r, i) {
var n = t && t.length
, a = n ? t[0] * r : e.length
, o = Math.abs(Th(e, 0, a, r));
if (n)
for (var s = 0, l = t.length; s < l; s++) {
var h = t[s] * r
, u = s < l - 1 ? t[s + 1] * r : e.length;
o -= Math.abs(Th(e, h, u, r))
}
var c = 0;
for (s = 0; s < i.length; s += 3) {
var d = i[s] * r
, f = i[s + 1] * r
, p = i[s + 2] * r;
c += Math.abs((e[d] - e[p]) * (e[f + 1] - e[d + 1]) - (e[d] - e[f]) * (e[p + 1] - e[d + 1]))
}
return 0 === o && 0 === c ? 0 : Math.abs((c - o) / o)
}
,
Eh.prototype.step = function (e, t, r) {
var i = e.length;
if (0 === r) {
this._parts = [],
this._sorted = !1;
var n = Math.floor(i / 2);
this._parts.push({
pivot: n,
left: 0,
right: i - 1
}),
this._currentSortPartIdx = 0
}
if (!this._sorted) {
var a = this._parts;
if (0 === a.length)
return this._sorted = !0,
!0;
if (a.length < 512) {
for (var o = 0; o < a.length; o++)
a[o].pivot = Mh(e, a[o].pivot, a[o].left, a[o].right, t);
var s = [];
for (o = 0; o < a.length; o++) {
var l, h = a[o].left;
(l = a[o].pivot - 1) > h && s.push({
pivot: Math.floor((l + h) / 2),
left: h,
right: l
}),
h = a[o].pivot + 1,
(l = a[o].right) > h && s.push({
pivot: Math.floor((l + h) / 2),
left: h,
right: l
})
}
a = this._parts = s
} else
for (o = 0; o < Math.floor(a.length / 10); o++) {
var u = a.length - 1 - this._currentSortPartIdx;
if (Ah(e, t, a[u].left, a[u].right),
this._currentSortPartIdx++,
this._currentSortPartIdx === a.length)
return this._sorted = !0,
!0
}
return !1
}
}
,
Eh.sort = Ah;
const Ch = Eh;
var Dh = Po.vec3
, Lh = Dh.create()
, Ph = Dh.create()
, Oh = Dh.create();
const Nh = {
needsSortTriangles: function () {
return this.indices && this.sortTriangles
},
needsSortTrianglesProgressively: function () {
return this.needsSortTriangles() && this.triangleCount >= 2e4
},
doSortTriangles: function (e, t) {
var r = this.indices;
if (0 === t) {
var i = this.attributes.position;
e = e.array,
this._triangleZList && this._triangleZList.length === this.triangleCount || (this._triangleZList = new Float32Array(this.triangleCount),
this._sortedTriangleIndices = new Uint32Array(this.triangleCount),
this._indicesTmp = new r.constructor(r.length),
this._triangleZListTmp = new Float32Array(this.triangleCount));
for (var n, a = 0, o = 0; o < r.length;) {
i.get(r[o++], Lh),
i.get(r[o++], Ph),
i.get(r[o++], Oh);
var s = Dh.sqrDist(Lh, e)
, l = Dh.sqrDist(Ph, e)
, h = Dh.sqrDist(Oh, e)
, u = Math.min(s, l);
u = Math.min(u, h),
3 === o ? (n = u,
u = 0) : u -= n,
this._triangleZList[a++] = u
}
}
var c = this._sortedTriangleIndices;
for (o = 0; o < c.length; o++)
c[o] = o;
if (this.triangleCount < 2e4)
0 === t && this._simpleSort(!0);
else
for (o = 0; o < 3; o++)
this._progressiveQuickSort(3 * t + o);
var d = this._indicesTmp
, f = this._triangleZListTmp
, p = this._triangleZList;
for (o = 0; o < this.triangleCount; o++) {
var m = 3 * c[o]
, g = 3 * o;
d[g++] = r[m++],
d[g++] = r[m++],
d[g] = r[m],
f[o] = p[c[o]]
}
var _ = this._indicesTmp;
this._indicesTmp = this.indices,
this.indices = _,
_ = this._triangleZListTmp,
this._triangleZListTmp = this._triangleZList,
this._triangleZList = _,
this.dirtyIndices()
},
_simpleSort: function (e) {
var t = this._triangleZList
, r = this._sortedTriangleIndices;
function i(e, r) {
return t[r] - t[e]
}
e ? Array.prototype.sort.call(r, i) : Ch.sort(r, i, 0, r.length - 1)
},
_progressiveQuickSort: function (e) {
var t = this._triangleZList
, r = this._sortedTriangleIndices;
this._quickSort = this._quickSort || new Ch,
this._quickSort.step(r, (function (e, r) {
return t[r] - t[e]
}
), e)
}
};
function Ih(e, t) {
const r = e.getItemVisual(t, "style");
if (r)
return r[e.getVisual("drawType")]
}
function Rh(e, t) {
const r = e.getItemVisual(t, "style");
return r && r.opacity
}
function Bh(e, t, r) {
this._labelsMesh = new Qo,
this._labelTextureSurface = new zo({
width: 512,
height: 512,
devicePixelRatio: r.getDevicePixelRatio(),
onupdate: function () {
r.getZr().refresh()
}
}),
this._api = r,
this._labelsMesh.material.set("textureAtlas", this._labelTextureSurface.getTexture())
}
Bh.prototype.getLabelPosition = function (e, t, r) {
return [0, 0, 0]
}
,
Bh.prototype.getLabelDistance = function (e, t, r) {
return 0
}
,
Bh.prototype.getMesh = function () {
return this._labelsMesh
}
,
Bh.prototype.updateData = function (e, t, r) {
null == t && (t = 0),
null == r && (r = e.count()),
this._labelsVisibilitiesBits && this._labelsVisibilitiesBits.length === r - t || (this._labelsVisibilitiesBits = new Uint8Array(r - t));
for (var i = ["label", "show"], n = ["emphasis", "label", "show"], a = t; a < r; a++) {
var o = e.getItemModel(a)
, s = o.get(i)
, l = o.get(n);
null == l && (l = s);
var h = (s ? 1 : 0) | (l ? 2 : 0);
this._labelsVisibilitiesBits[a - t] = h
}
this._start = t,
this._end = r,
this._data = e
}
,
Bh.prototype.updateLabels = function (e) {
if (this._data) {
for (var t = (e = e || []).length > 0, r = {}, n = 0; n < e.length; n++)
r[e[n]] = !0;
this._labelsMesh.geometry.convertToDynamicArray(!0),
this._labelTextureSurface.clear();
for (var a = ["label"], o = ["emphasis", "label"], s = this._data.hostModel, l = this._data, h = s.getModel(a), u = s.getModel(o, h), c = {
left: "right",
right: "left",
top: "center",
bottom: "center"
}, d = {
left: "middle",
right: "middle",
top: "bottom",
bottom: "top"
}, f = this._start; f < this._end; f++) {
var p = !1;
if (t && r[f] && (p = !0),
this._labelsVisibilitiesBits[f - this._start] & (p ? 2 : 1)) {
var m = l.getItemModel(f).getModel(p ? o : a, p ? u : h)
, g = m.get("distance") || 0
, _ = m.get("position")
, v = this._api.getDevicePixelRatio()
, y = s.getFormattedLabel(f, p ? "emphasis" : "normal");
if (null == y || "" === y)
return;
var x = new i.graphic.Text({
style: xo(m, {
text: y,
fill: m.get("color") || Ih(l, f) || "#000",
align: "left",
verticalAlign: "top",
opacity: Mn(m.get("opacity"), Rh(l, f), 1)
})
})
, b = x.getBoundingRect();
b.height *= 1.2;
var w = this._labelTextureSurface.add(x)
, T = c[_] || "center"
, S = d[_] || "bottom";
this._labelsMesh.geometry.addSprite(this.getLabelPosition(f, _, g), [b.width * v, b.height * v], w, T, S, this.getLabelDistance(f, _, g) * v)
}
}
this._labelsMesh.material.set("uvScale", this._labelTextureSurface.getCoordsScale()),
this._labelTextureSurface.getZr().refreshImmediately(),
this._labelsMesh.geometry.convertToTypedArray(),
this._labelsMesh.geometry.dirty()
}
}
,
Bh.prototype.dispose = function () {
this._labelTextureSurface.dispose()
}
;
const Fh = Bh;
var zh = Po.vec3;
function Gh(e) {
this.rootNode = new Ka.Node,
this._triangulationResults = {},
this._shadersMap = Ka.COMMON_SHADERS.filter((function (e) {
return "shadow" !== e
}
)).reduce((function (e, t) {
return e[t] = Ka.createShader("ecgl." + t),
e
}
), {}),
this._linesShader = Ka.createShader("ecgl.meshLines3D");
var t = {};
Ka.COMMON_SHADERS.forEach((function (e) {
t[e] = new Ka.Material({
shader: Ka.createShader("ecgl." + e)
})
}
)),
this._groundMaterials = t,
this._groundMesh = new Ka.Mesh({
geometry: new Ka.PlaneGeometry({
dynamic: !0
}),
castShadow: !1,
renderNormal: !0,
$ignorePicking: !0
}),
this._groundMesh.rotation.rotateX(-Math.PI / 2),
this._labelsBuilder = new Fh(512, 512, e),
this._labelsBuilder.getMesh().renderOrder = 100,
this._labelsBuilder.getMesh().material.depthTest = !1,
this.rootNode.add(this._labelsBuilder.getMesh()),
this._initMeshes(),
this._api = e
}
Ka.Shader.import(is),
Gh.prototype = {
constructor: Gh,
extrudeY: !0,
update: function (e, t, r, i, n) {
var a = e.getData();
null == i && (i = 0),
null == n && (n = a.count()),
this._startIndex = i,
this._endIndex = n - 1,
this._triangulation(e, i, n);
var o = this._getShader(e.get("shading"));
this._prepareMesh(e, o, r, i, n),
this.rootNode.updateWorldTransform(),
this._updateRegionMesh(e, r, i, n);
var s = e.coordinateSystem;
"geo3D" === s.type && this._updateGroundPlane(e, s, r);
var l = this;
this._labelsBuilder.updateData(a, i, n),
this._labelsBuilder.getLabelPosition = function (e, t, r) {
var i = a.getName(e)
, n = r;
if ("geo3D" === s.type) {
var o = s.getRegion(i);
return o ? (u = o.getCenter(),
s.dataToPoint([u[0], u[1], n])) : [NaN, NaN, NaN]
}
var h = l._triangulationResults[e - l._startIndex]
, u = l.extrudeY ? [(h.max[0] + h.min[0]) / 2, h.max[1] + n, (h.max[2] + h.min[2]) / 2] : [(h.max[0] + h.min[0]) / 2, (h.max[1] + h.min[1]) / 2, h.max[2] + n]
}
,
this._data = a,
this._labelsBuilder.updateLabels(),
this._updateDebugWireframe(e),
this._lastHoverDataIndex = 0
},
_initMeshes: function () {
var e = this
, t = function () {
var t = new Ka.Mesh({
name: "Polygon",
material: new Ka.Material({
shader: e._shadersMap.lambert
}),
geometry: new Ka.Geometry({
sortTriangles: !0,
dynamic: !0
}),
culling: !1,
ignorePicking: !0,
renderNormal: !0
});
return Object.assign(t.geometry, Nh),
t
}()
, r = new Ka.Mesh({
material: new Ka.Material({
shader: this._linesShader
}),
castShadow: !1,
ignorePicking: !0,
$ignorePicking: !0,
geometry: new Ro({
useNativeLine: !1
})
});
this.rootNode.add(t),
this.rootNode.add(r),
t.material.define("both", "VERTEX_COLOR"),
t.material.define("fragment", "DOUBLE_SIDED"),
this._polygonMesh = t,
this._linesMesh = r,
this.rootNode.add(this._groundMesh)
},
_getShader: function (e) {
var t = this._shadersMap[e];
return t || (t = this._shadersMap.lambert),
t.__shading = e,
t
},
_prepareMesh: function (e, t, r, i, n) {
for (var a = 0, o = 0, s = 0, l = 0, h = i; h < n; h++) {
var u = this._getRegionPolygonInfo(h)
, c = this._getRegionLinesInfo(h, e, this._linesMesh.geometry);
a += u.vertexCount,
o += u.triangleCount,
s += c.vertexCount,
l += c.triangleCount
}
var d = this._polygonMesh
, f = d.geometry;
["position", "normal", "texcoord0", "color"].forEach((function (e) {
f.attributes[e].init(a)
}
)),
f.indices = a > 65535 ? new Uint32Array(3 * o) : new Uint16Array(3 * o),
d.material.shader !== t && d.material.attachShader(t, !0),
Ka.setMaterialFromModel(t.__shading, d.material, e, r),
s > 0 && (this._linesMesh.geometry.resetOffset(),
this._linesMesh.geometry.setVertexCount(s),
this._linesMesh.geometry.setTriangleCount(l)),
this._dataIndexOfVertex = new Uint32Array(a),
this._vertexRangeOfDataIndex = new Uint32Array(2 * (n - i))
},
_updateRegionMesh: function (e, t, r, i) {
for (var n = e.getData(), a = 0, o = 0, s = !1, l = this._polygonMesh, h = this._linesMesh, u = r; u < i; u++) {
var c = e.getRegionModel(u)
, d = c.getModel("itemStyle")
, f = Mn(Ih(n, u), d.get("color"), "#fff")
, p = Mn(Rh(n, u), d.get("opacity"), 1)
, m = Ka.parseColor(f)
, g = Ka.parseColor(d.get("borderColor"));
m[3] *= p,
g[3] *= p;
var _ = m[3] < .99;
l.material.set("color", [1, 1, 1, 1]),
s = s || _;
for (var v = Mn(c.get("height", !0), e.get("regionHeight")), y = this._updatePolygonGeometry(e, l.geometry, u, v, a, o, m), x = a; x < y.vertexOffset; x++)
this._dataIndexOfVertex[x] = u;
this._vertexRangeOfDataIndex[2 * (u - r)] = a,
this._vertexRangeOfDataIndex[2 * (u - r) + 1] = y.vertexOffset,
a = y.vertexOffset,
o = y.triangleOffset;
var b = d.get("borderWidth")
, w = b > 0;
w && (b *= t.getDevicePixelRatio(),
this._updateLinesGeometry(h.geometry, e, u, v, b, e.coordinateSystem.transform)),
h.invisible = !w,
h.material.set({
color: g
})
}
(l = this._polygonMesh).material.transparent = s,
l.material.depthMask = !s,
l.geometry.updateBoundingBox(),
l.frontFace = this.extrudeY ? Ka.Mesh.CCW : Ka.Mesh.CW,
l.material.get("normalMap") && l.geometry.generateTangents(),
l.seriesIndex = e.seriesIndex,
l.on("mousemove", this._onmousemove, this),
l.on("mouseout", this._onmouseout, this)
},
_updateDebugWireframe: function (e) {
var t = e.getModel("debug.wireframe");
if (t.get("show")) {
var r = Ka.parseColor(t.get("lineStyle.color") || "rgba(0,0,0,0.5)")
, i = Mn(t.get("lineStyle.width"), 1)
, n = this._polygonMesh;
n.geometry.generateBarycentric(),
n.material.define("both", "WIREFRAME_TRIANGLE"),
n.material.set("wireframeLineColor", r),
n.material.set("wireframeLineWidth", i)
}
},
_onmousemove: function (e) {
var t = this._dataIndexOfVertex[e.triangle[0]];
null == t && (t = -1),
t !== this._lastHoverDataIndex && (this.downplay(this._lastHoverDataIndex),
this.highlight(t),
this._labelsBuilder.updateLabels([t])),
this._lastHoverDataIndex = t,
this._polygonMesh.dataIndex = t
},
_onmouseout: function (e) {
e.target && (this.downplay(this._lastHoverDataIndex),
this._lastHoverDataIndex = -1,
this._polygonMesh.dataIndex = -1),
this._labelsBuilder.updateLabels([])
},
_updateGroundPlane: function (e, t, r) {
var i = e.getModel("groundPlane", e);
if (this._groundMesh.invisible = !i.get("show", !0),
!this._groundMesh.invisible) {
var n = e.get("shading")
, a = this._groundMaterials[n];
a || (a = this._groundMaterials.lambert),
Ka.setMaterialFromModel(n, a, i, r),
a.get("normalMap") && this._groundMesh.geometry.generateTangents(),
this._groundMesh.material = a,
this._groundMesh.material.set("color", Ka.parseColor(i.get("color"))),
this._groundMesh.scale.set(t.size[0], t.size[2], 1)
}
},
_triangulation: function (e, t, r) {
this._triangulationResults = [];
for (var i = [1 / 0, 1 / 0, 1 / 0], n = [-1 / 0, -1 / 0, -1 / 0], a = e.coordinateSystem, o = t; o < r; o++) {
for (var s = [], l = e.getRegionPolygonCoords(o), h = 0; h < l.length; h++) {
var u = l[h].exterior
, c = l[h].interiors
, d = []
, f = [];
if (!(u.length < 3)) {
for (var p = 0, m = 0; m < u.length; m++) {
var g = u[m];
d[p++] = g[0],
d[p++] = g[1]
}
for (m = 0; m < c.length; m++)
if (!(c[m].length < 3)) {
for (var _ = d.length / 2, v = 0; v < c[m].length; v++)
g = c[m][v],
d.push(g[0]),
d.push(g[1]);
f.push(_)
}
var y = eh(d, f)
, x = new Float64Array(d.length / 2 * 3)
, b = []
, w = [1 / 0, 1 / 0, 1 / 0]
, T = [-1 / 0, -1 / 0, -1 / 0]
, S = 0;
for (m = 0; m < d.length;)
zh.set(b, d[m++], 0, d[m++]),
a && a.transform && zh.transformMat4(b, b, a.transform),
zh.min(w, w, b),
zh.max(T, T, b),
x[S++] = b[0],
x[S++] = b[1],
x[S++] = b[2];
zh.min(i, i, w),
zh.max(n, n, T),
s.push({
points: x,
indices: y,
min: w,
max: T
})
}
}
this._triangulationResults.push(s)
}
this._geoBoundingBox = [i, n]
},
_getRegionPolygonInfo: function (e) {
for (var t = this._triangulationResults[e - this._startIndex], r = 0, i = 0, n = 0; n < t.length; n++)
r += t[n].points.length / 3,
i += t[n].indices.length / 3;
return {
vertexCount: 2 * r + 4 * r,
triangleCount: 2 * i + 2 * r
}
},
_updatePolygonGeometry: function (e, t, r, i, n, a, o) {
var s = e.get("projectUVOnGround")
, l = t.attributes.position
, h = t.attributes.normal
, u = t.attributes.texcoord0
, c = t.attributes.color
, d = this._triangulationResults[r - this._startIndex]
, f = c.value && o
, p = t.indices
, m = this.extrudeY ? 1 : 2
, g = this.extrudeY ? 2 : 1
, _ = [this.rootNode.worldTransform.x.len(), this.rootNode.worldTransform.y.len(), this.rootNode.worldTransform.z.len()]
, v = zh.mul([], this._geoBoundingBox[0], _)
, y = zh.mul([], this._geoBoundingBox[1], _)
, x = Math.max(y[0] - v[0], y[2] - v[2]);
function b(e, t, r) {
var i = n;
!function (e, t, r) {
for (var i = e.points, a = i.length, s = [], h = [], d = 0; d < a; d += 3)
s[0] = i[d],
s[m] = t,
s[g] = i[d + 2],
h[0] = (i[d] * _[0] - v[0]) / x,
h[1] = (i[d + 2] * _[g] - v[2]) / x,
l.set(n, s),
f && c.set(n, o),
u.set(n++, h)
}(e, t);
for (var s = e.indices.length, h = 0; h < s; h++)
p[3 * a + h] = e.indices[h] + i;
a += e.indices.length / 3
}
for (var w = this.extrudeY ? [0, 1, 0] : [0, 0, 1], T = zh.negate([], w), S = 0; S < d.length; S++) {
var M = n
, A = d[S];
b(A, 0),
b(A, i);
for (var E = A.points.length / 3, C = 0; C < E; C++)
h.set(M + C, T),
h.set(M + C + E, w);
var D = [0, 3, 1, 1, 3, 2]
, L = [[], [], [], []]
, P = []
, O = []
, N = []
, I = []
, R = 0;
for (C = 0; C < E; C++) {
for (var B = (C + 1) % E, F = (A.points[3 * B] - A.points[3 * C]) * _[0], z = (A.points[3 * B + 2] - A.points[3 * C + 2]) * _[g], G = Math.sqrt(F * F + z * z), U = 0; U < 4; U++) {
var k = 0 === U || 3 === U
, V = 3 * (k ? C : B);
L[U][0] = A.points[V],
L[U][m] = U > 1 ? i : 0,
L[U][g] = A.points[V + 2],
l.set(n + U, L[U]),
s ? (I[0] = (A.points[V] * _[0] - v[0]) / x,
I[1] = (A.points[V + 2] * _[g] - v[g]) / x) : (I[0] = (k ? R : R + G) / x,
I[1] = (L[U][m] * _[m] - v[m]) / x),
u.set(n + U, I)
}
for (zh.sub(P, L[1], L[0]),
zh.sub(O, L[3], L[0]),
zh.cross(N, P, O),
zh.normalize(N, N),
U = 0; U < 4; U++)
h.set(n + U, N),
f && c.set(n + U, o);
for (U = 0; U < 6; U++)
p[3 * a + U] = D[U] + n;
n += 4,
a += 2,
R += G
}
}
return t.dirty(),
{
vertexOffset: n,
triangleOffset: a
}
},
_getRegionLinesInfo: function (e, t, r) {
var i = 0
, n = 0;
return t.getRegionModel(e).getModel("itemStyle").get("borderWidth") > 0 && t.getRegionPolygonCoords(e).forEach((function (e) {
var t = e.exterior
, a = e.interiors;
i += r.getPolylineVertexCount(t),
n += r.getPolylineTriangleCount(t);
for (var o = 0; o < a.length; o++)
i += r.getPolylineVertexCount(a[o]),
n += r.getPolylineTriangleCount(a[o])
}
), this),
{
vertexCount: i,
triangleCount: n
}
},
_updateLinesGeometry: function (e, t, r, i, n, a) {
function o(e) {
for (var t = new Float64Array(3 * e.length), r = 0, n = [], o = 0; o < e.length; o++)
n[0] = e[o][0],
n[1] = i + .1,
n[2] = e[o][1],
a && zh.transformMat4(n, n, a),
t[r++] = n[0],
t[r++] = n[1],
t[r++] = n[2];
return t
}
var s = [1, 1, 1, 1];
t.getRegionPolygonCoords(r).forEach((function (t) {
var r = t.exterior
, i = t.interiors;
e.addPolyline(o(r), s, n);
for (var a = 0; a < i.length; a++)
e.addPolyline(o(i[a]), s, n)
}
))
},
highlight: function (e) {
var t = this._data;
if (t) {
var r = t.getItemModel(e).getModel(["emphasis", "itemStyle"])
, n = r.get("color")
, a = Mn(r.get("opacity"), Rh(t, e), 1);
if (null == n) {
var o = Ih(t, e);
n = i.color.lift(o, -.4)
}
null == a && (a = Rh(t, e));
var s = Ka.parseColor(n);
s[3] *= a,
this._setColorOfDataIndex(t, e, s)
}
},
downplay: function (e) {
var t = this._data;
if (t) {
var r = t.getItemModel(e)
, i = Mn(Ih(t, e), r.get(["itemStyle", "color"]), "#fff")
, n = Mn(Rh(t, e), r.get(["itemStyle", "opacity"]), 1)
, a = Ka.parseColor(i);
a[3] *= n,
this._setColorOfDataIndex(t, e, a)
}
},
dispose: function () {
this._labelsBuilder.dispose()
},
_setColorOfDataIndex: function (e, t, r) {
if (!(t < this._startIndex && t > this._endIndex)) {
t -= this._startIndex;
for (var i = this._vertexRangeOfDataIndex[2 * t]; i < this._vertexRangeOfDataIndex[2 * t + 1]; i++)
this._polygonMesh.geometry.attributes.color.set(i, r);
this._polygonMesh.geometry.dirty(),
this._api.getZr().refresh()
}
}
};
const Uh = Gh
, kh = i.ComponentView.extend({
type: "geo3D",
__ecgl__: !0,
init: function (e, t) {
this._geo3DBuilder = new Uh(t),
this.groupGL = new Ka.Node,
this._lightRoot = new Ka.Node,
this._sceneHelper = new Uo(this._lightRoot),
this._sceneHelper.initLight(this._lightRoot),
this._control = new Do({
zr: t.getZr()
}),
this._control.init()
},
render: function (e, t, r) {
this.groupGL.add(this._geo3DBuilder.rootNode);
var i = e.coordinateSystem;
if (i && i.viewGL) {
i.viewGL.add(this._lightRoot),
e.get("show") ? i.viewGL.add(this.groupGL) : i.viewGL.remove(this.groupGL);
var n = this._control;
n.setViewGL(i.viewGL);
var a = e.getModel("viewControl");
n.setFromViewControlModel(a, 0),
this._sceneHelper.setScene(i.viewGL.scene),
this._sceneHelper.updateLight(e),
i.viewGL.setPostEffect(e.getModel("postEffect"), r),
i.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling")),
this._geo3DBuilder.update(e, t, r, 0, e.getData().count());
var o = i.viewGL.isLinearSpace() ? "define" : "undefine";
this._geo3DBuilder.rootNode.traverse((function (e) {
e.material && e.material[o]("fragment", "SRGB_DECODE")
}
)),
n.off("update"),
n.on("update", (function () {
r.dispatchAction({
type: "geo3DChangeCamera",
alpha: n.getAlpha(),
beta: n.getBeta(),
distance: n.getDistance(),
center: n.getCenter(),
from: this.uid,
geo3DId: e.id
})
}
)),
n.update()
}
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r)
},
dispose: function () {
this._control.dispose(),
this._geo3DBuilder.dispose()
}
});
var Vh = {
南海诸岛: [32, 80],
广东: [0, -10],
香港: [10, 5],
澳门: [-10, 10],
天津: [5, 5]
}
, Hh = {
Russia: [100, 60],
"United States": [-99, 38],
"United States of America": [-99, 38]
}
, Wh = Po.vec3
, jh = Po.mat4
, Xh = [function (e, t) {
if ("china" === e) {
var r = Vh[t.name];
if (r) {
var i = t.getCenter();
i[0] += r[0] / 10.5,
i[1] += -r[1] / 14,
t.setCenter(i)
}
}
}
, function (e, t) {
if ("world" === e) {
var r = Hh[t.name];
if (r) {
var i = [r[0], r[1]];
t.setCenter(i)
}
}
}
];
function qh(e, t, r, i, n) {
this.name = e,
this.map = t,
this.regionHeight = 0,
this.regions = [],
this._nameCoordMap = {},
this.loadGeoJson(r, i, n),
this.transform = jh.identity(new Float64Array(16)),
this.invTransform = jh.identity(new Float64Array(16)),
this.extrudeY = !0,
this.altitudeAxis
}
qh.prototype = {
constructor: qh,
type: "geo3D",
dimensions: ["lng", "lat", "alt"],
containPoint: function () { },
loadGeoJson: function (e, t, r) {
var n = i.parseGeoJSON || i.parseGeoJson;
try {
this.regions = e ? n(e) : []
} catch (e) {
throw "Invalid geoJson format\n" + e
}
t = t || {},
r = r || {};
for (var a = this.regions, o = {}, s = 0; s < a.length; s++) {
var l = a[s].name;
l = r[l] || l,
a[s].name = l,
o[l] = a[s],
this.addGeoCoord(l, a[s].getCenter());
var h = t[l];
h && a[s].transformTo(h.left, h.top, h.width, h.height)
}
this._regionsMap = o,
this._geoRect = null,
Xh.forEach((function (e) {
e(this)
}
), this)
},
getGeoBoundingRect: function () {
if (this._geoRect)
return this._geoRect;
for (var e, t = this.regions, r = 0; r < t.length; r++) {
var n = t[r].getBoundingRect();
(e = e || n.clone()).union(n)
}
return this._geoRect = e || new i.graphic.BoundingRect(0, 0, 0, 0)
},
addGeoCoord: function (e, t) {
this._nameCoordMap[e] = t
},
getRegion: function (e) {
return this._regionsMap[e]
},
getRegionByCoord: function (e) {
for (var t = this.regions, r = 0; r < t.length; r++)
if (t[r].contain(e))
return t[r]
},
setSize: function (e, t, r) {
this.size = [e, t, r];
var i = this.getGeoBoundingRect()
, n = e / i.width
, a = -r / i.height
, o = -e / 2 - i.x * n
, s = r / 2 - i.y * a
, l = this.extrudeY ? [o, 0, s] : [o, s, 0]
, h = this.extrudeY ? [n, 1, a] : [n, a, 1]
, u = this.transform;
jh.identity(u),
jh.translate(u, u, l),
jh.scale(u, u, h),
jh.invert(this.invTransform, u)
},
dataToPoint: function (e, t) {
t = t || [];
var r = this.extrudeY ? 1 : 2
, i = this.extrudeY ? 2 : 1
, n = e[2];
return isNaN(n) && (n = 0),
t[0] = e[0],
t[i] = e[1],
this.altitudeAxis ? t[r] = this.altitudeAxis.dataToCoord(n) : t[r] = 0,
t[r] += this.regionHeight,
Wh.transformMat4(t, t, this.transform),
t
},
pointToData: function (e, t) { }
};
const Zh = qh;
function Yh(e, t) {
var r = Ss(e.getBoxLayoutParams(), {
width: t.getWidth(),
height: t.getHeight()
});
r.y = t.getHeight() - r.y - r.height,
this.viewGL.setViewport(r.x, r.y, r.width, r.height, t.getDevicePixelRatio());
var i = this.getGeoBoundingRect()
, n = i.width / i.height * (e.get("aspectScale") || .75)
, a = e.get("boxWidth")
, o = e.get("boxDepth")
, s = e.get("boxHeight");
null == s && (s = 5),
isNaN(a) && isNaN(o) && (a = 100),
isNaN(o) ? o = a / n : isNaN(a) && (a = o / n),
this.setSize(a, s, o),
this.regionHeight = e.get("regionHeight"),
this.altitudeAxis && this.altitudeAxis.setExtent(0, Math.max(s - this.regionHeight, 0))
}
function Kh(e, t) {
var r = [1 / 0, -1 / 0];
if (e.eachSeries((function (e) {
if (e.coordinateSystem === this && "series.map3D" !== e.type) {
var t = e.getData()
, i = e.coordDimToDataDim("alt")
, n = i && i[0];
if (n) {
var a = t.getDataExtent(n, !0);
r[0] = Math.min(r[0], a[0]),
r[1] = Math.max(r[1], a[1])
}
}
}
), this),
r && isFinite(r[1] - r[0])) {
var n = i.helper.createScale(r, {
type: "value",
min: "dataMin",
max: "dataMax"
});
this.altitudeAxis = new i.Axis("altitude", n),
this.resize(this.model, t)
}
}
var Qh = 0
, Jh = {
dimensions: Zh.prototype.dimensions,
create: function (e, t) {
var r = [];
if (!i.getMap)
throw new Error("geo3D component depends on geo component");
function n(e, i) {
var n = Jh.createGeo3D(e);
e.__viewGL = e.__viewGL || new Il,
n.viewGL = e.__viewGL,
e.coordinateSystem = n,
n.model = e,
r.push(n),
n.resize = Yh,
n.resize(e, t),
n.update = Kh
}
return e.eachComponent("geo3D", (function (e, t) {
n(e)
}
)),
e.eachSeriesByType("map3D", (function (e, t) {
var r = e.get("coordinateSystem");
null == r && (r = "geo3D"),
"geo3D" === r && n(e)
}
)),
e.eachSeries((function (t) {
if ("geo3D" === t.get("coordinateSystem")) {
if ("series.map3D" === t.type)
return;
var r = t.getReferringComponents("geo3D").models[0];
if (r || (r = e.getComponent("geo3D")),
!r)
throw new Error('geo "' + Mn(t.get("geo3DIndex"), t.get("geo3DId"), 0) + '" not found');
t.coordinateSystem = r.coordinateSystem
}
}
)),
r
},
createGeo3D: function (e) {
var t, r = e.get("map");
return "string" == typeof r ? (t = r,
r = i.getMap(r)) : r && r.features && (r = {
geoJson: r
}),
null == t && (t = "GEO_ANONYMOUS_" + Qh++),
new Zh(t + Qh++, t, r && r.geoJson, r && r.specialAreas, e.get("nameMap"))
}
};
const $h = Jh;
function eu(e) {
e.registerComponentModel($l),
e.registerComponentView(kh),
e.registerAction({
type: "geo3DChangeCamera",
event: "geo3dcamerachanged",
update: "series:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "geo3D",
query: e
}, (function (t) {
t.setView(e)
}
))
}
)),
e.registerCoordinateSystem("geo3D", $h)
}
function tu(e, t) {
e.id = e.id || e.name || t + ""
}
(0,
i.use)(eu);
var ru = i.ComponentModel.extend({
type: "globe",
layoutMode: "box",
coordinateSystem: null,
init: function () {
ru.superApply(this, "init", arguments),
i.util.each(this.option.layers, (function (e, t) {
i.util.merge(e, this.defaultLayerOption),
tu(e, t)
}
), this)
},
mergeOption: function (e) {
var t = this.option.layers;
function r(e) {
return i.util.reduce(e, (function (e, t, r) {
return tu(t, r),
e[t.id] = t,
e
}
), {})
}
if (this.option.layers = null,
ru.superApply(this, "mergeOption", arguments),
t && t.length) {
var n = r(e.layers)
, a = r(t);
for (var o in n)
a[o] ? i.util.merge(a[o], n[o], !0) : t.push(e.layers[o]);
this.option.layers = t
}
i.util.each(this.option.layers, (function (e) {
i.util.merge(e, this.defaultLayerOption)
}
), this)
},
optionUpdated: function () {
this.updateDisplacementHash()
},
defaultLayerOption: {
show: !0,
type: "overlay"
},
defaultOption: {
show: !0,
zlevel: -10,
left: 0,
top: 0,
width: "100%",
height: "100%",
environment: "auto",
baseColor: "#fff",
baseTexture: "",
heightTexture: "",
displacementTexture: "",
displacementScale: 0,
displacementQuality: "medium",
globeRadius: 100,
globeOuterRadius: 150,
shading: "lambert",
light: {
main: {
time: ""
}
},
atmosphere: {
show: !1,
offset: 5,
color: "#ffffff",
glowPower: 6,
innerGlowPower: 2
},
viewControl: {
autoRotate: !0,
panSensitivity: 0,
targetCoord: null
},
layers: []
},
setDisplacementData: function (e, t, r) {
this.displacementData = e,
this.displacementWidth = t,
this.displacementHeight = r
},
getDisplacementTexture: function () {
return this.get("displacementTexture") || this.get("heightTexture")
},
getDisplacemenScale: function () {
var e = this.getDisplacementTexture()
, t = this.get("displacementScale");
return e && "none" !== e || (t = 0),
t
},
hasDisplacement: function () {
return this.getDisplacemenScale() > 0
},
_displacementChanged: !0,
_displacementScale: 0,
updateDisplacementHash: function () {
var e = this.getDisplacementTexture()
, t = this.getDisplacemenScale();
this._displacementChanged = this._displacementTexture !== e || this._displacementScale !== t,
this._displacementTexture = e,
this._displacementScale = t
},
isDisplacementChanged: function () {
return this._displacementChanged
}
});
i.util.merge(ru.prototype, uo),
i.util.merge(ru.prototype, co),
i.util.merge(ru.prototype, fo),
i.util.merge(ru.prototype, Kl);
const iu = ru;
var nu = Math.PI
, au = Math.sin
, ou = Math.cos
, su = Math.tan
, lu = Math.asin
, hu = Math.atan2
, uu = nu / 180
, cu = 23.4397 * uu;
function du(e, t) {
return hu(au(e) * ou(cu) - su(t) * au(cu), ou(e))
}
function fu(e, t, r) {
return hu(au(e), ou(e) * au(t) - su(r) * ou(t))
}
function pu(e, t, r) {
return lu(au(t) * au(r) + ou(t) * ou(r) * ou(e))
}
var mu = {};
mu.getPosition = function (e, t, r) {
var i = uu * -r
, n = uu * t
, a = function (e) {
return function (e) {
return e.valueOf() / 864e5 - .5 + 2440588
}(e) - 2451545
}(e)
, o = function (e) {
var t, r, i = (r = function (e) {
return uu * (357.5291 + .98560028 * e)
}(e)) + uu * (1.9148 * au(r) + .02 * au(2 * r) + 3e-4 * au(3 * r)) + 102.9372 * uu + nu;
return {
dec: (t = i,
lu(au(0) * ou(cu) + ou(0) * au(cu) * au(t))),
ra: du(i, 0)
}
}(a)
, s = function (e, t) {
return uu * (280.16 + 360.9856235 * e) - t
}(a, i) - o.ra;
return {
azimuth: fu(s, n, o.dec),
altitude: pu(s, n, o.dec)
}
}
;
const gu = mu;
Ka.Shader.import(Va),
Ka.Shader.import("@export ecgl.atmosphere.vertex\nattribute vec3 position: POSITION;\nattribute vec3 normal : NORMAL;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 normalMatrix : WORLDINVERSETRANSPOSE;\n\nvarying vec3 v_Normal;\n\nvoid main() {\n v_Normal = normalize((normalMatrix * vec4(normal, 0.0)).xyz);\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n\n\n@export ecgl.atmosphere.fragment\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform float glowPower;\nuniform vec3 glowColor;\n\nvarying vec3 v_Normal;\n\nvoid main() {\n float intensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor = vec4(glowColor, intensity * intensity);\n}\n@end");
const _u = i.ComponentView.extend({
type: "globe",
__ecgl__: !0,
_displacementScale: 0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._sphereGeometry = new Ka.SphereGeometry({
widthSegments: 200,
heightSegments: 100,
dynamic: !0
}),
this._overlayGeometry = new Ka.SphereGeometry({
widthSegments: 80,
heightSegments: 40
}),
this._planeGeometry = new Ka.PlaneGeometry,
this._earthMesh = new Ka.Mesh({
renderNormal: !0
}),
this._atmosphereMesh = new Ka.Mesh,
this._atmosphereGeometry = new Ka.SphereGeometry({
widthSegments: 80,
heightSegments: 40
}),
this._atmosphereMaterial = new Ka.Material({
shader: new Ka.Shader(Ka.Shader.source("ecgl.atmosphere.vertex"), Ka.Shader.source("ecgl.atmosphere.fragment")),
transparent: !0
}),
this._atmosphereMesh.geometry = this._atmosphereGeometry,
this._atmosphereMesh.material = this._atmosphereMaterial,
this._atmosphereMesh.frontFace = Ka.Mesh.CW,
this._lightRoot = new Ka.Node,
this._sceneHelper = new Uo,
this._sceneHelper.initLight(this._lightRoot),
this.groupGL.add(this._atmosphereMesh),
this.groupGL.add(this._earthMesh),
this._control = new Do({
zr: t.getZr()
}),
this._control.init(),
this._layerMeshes = {}
},
render: function (e, t, r) {
var i = e.coordinateSystem
, n = e.get("shading");
i.viewGL.add(this._lightRoot),
e.get("show") ? i.viewGL.add(this.groupGL) : i.viewGL.remove(this.groupGL),
this._sceneHelper.setScene(i.viewGL.scene),
i.viewGL.setPostEffect(e.getModel("postEffect"), r),
i.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling"));
var a = this._earthMesh;
a.geometry = this._sphereGeometry;
var o = "ecgl." + n;
a.material && a.material.shader.name === o || (a.material = Ka.createMaterial(o)),
Ka.setMaterialFromModel(n, a.material, e, r),
["roughnessMap", "metalnessMap", "detailMap", "normalMap"].forEach((function (e) {
var t = a.material.get(e);
t && (t.flipY = !1)
}
)),
a.material.set("color", Ka.parseColor(e.get("baseColor")));
var s = .99 * i.radius;
if (a.scale.set(s, s, s),
e.get("atmosphere.show")) {
a.material.define("both", "ATMOSPHERE_ENABLED"),
this._atmosphereMesh.invisible = !1,
this._atmosphereMaterial.setUniforms({
glowPower: e.get("atmosphere.glowPower") || 6,
glowColor: e.get("atmosphere.color") || "#ffffff"
}),
a.material.setUniforms({
glowPower: e.get("atmosphere.innerGlowPower") || 2,
glowColor: e.get("atmosphere.color") || "#ffffff"
});
var l = e.get("atmosphere.offset") || 5;
this._atmosphereMesh.scale.set(s + l, s + l, s + l)
} else
a.material.undefine("both", "ATMOSPHERE_ENABLED"),
this._atmosphereMesh.invisible = !0;
var h = a.material.setTextureImage("diffuseMap", e.get("baseTexture"), r, {
flipY: !1,
anisotropic: 8
});
h && h.surface && h.surface.attachToMesh(a);
var u = a.material.setTextureImage("bumpMap", e.get("heightTexture"), r, {
flipY: !1,
anisotropic: 8
});
u && u.surface && u.surface.attachToMesh(a),
a.material[e.get("postEffect.enable") ? "define" : "undefine"]("fragment", "SRGB_DECODE"),
this._updateLight(e, r),
this._displaceVertices(e, r),
this._updateViewControl(e, r),
this._updateLayers(e, r)
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r)
},
_updateLayers: function (e, t) {
var r = e.coordinateSystem
, n = e.get("layers")
, a = r.radius
, o = []
, s = []
, l = []
, h = [];
i.util.each(n, (function (e) {
var n = new i.Model(e)
, u = n.get("type")
, c = Ka.loadTexture(n.get("texture"), t, {
flipY: !1,
anisotropic: 8
});
if (c.surface && c.surface.attachToMesh(this._earthMesh),
"blend" === u) {
var d = n.get("blendTo")
, f = Mn(n.get("intensity"), 1);
"emission" === d ? (l.push(c),
h.push(f)) : (o.push(c),
s.push(f))
} else {
var p = n.get("id")
, m = this._layerMeshes[p];
m || (m = this._layerMeshes[p] = new Ka.Mesh({
geometry: this._overlayGeometry,
castShadow: !1,
ignorePicking: !0
})),
"lambert" === n.get("shading") ? (m.material = m.__lambertMaterial || new Ka.Material({
autoUpdateTextureStatus: !1,
shader: Ka.createShader("ecgl.lambert"),
transparent: !0,
depthMask: !1
}),
m.__lambertMaterial = m.material) : (m.material = m.__colorMaterial || new Ka.Material({
autoUpdateTextureStatus: !1,
shader: Ka.createShader("ecgl.color"),
transparent: !0,
depthMask: !1
}),
m.__colorMaterial = m.material),
m.material.enableTexture("diffuseMap");
var g = n.get("distance")
, _ = a + (null == g ? r.radius / 100 : g);
m.scale.set(_, _, _),
a = _;
var v = this._blankTexture || (this._blankTexture = Ka.createBlankTexture("rgba(255, 255, 255, 0)"));
m.material.set("diffuseMap", v),
Ka.loadTexture(n.get("texture"), t, {
flipY: !1,
anisotropic: 8
}, (function (e) {
e.surface && e.surface.attachToMesh(m),
m.material.set("diffuseMap", e),
t.getZr().refresh()
}
)),
n.get("show") ? this.groupGL.add(m) : this.groupGL.remove(m)
}
}
), this);
var u = this._earthMesh.material;
u.define("fragment", "LAYER_DIFFUSEMAP_COUNT", o.length),
u.define("fragment", "LAYER_EMISSIVEMAP_COUNT", l.length),
u.set("layerDiffuseMap", o),
u.set("layerDiffuseIntensity", s),
u.set("layerEmissiveMap", l),
u.set("layerEmissionIntensity", h);
var c = e.getModel("debug.wireframe");
if (c.get("show")) {
u.define("both", "WIREFRAME_TRIANGLE");
var d = Ka.parseColor(c.get("lineStyle.color") || "rgba(0,0,0,0.5)")
, f = Mn(c.get("lineStyle.width"), 1);
u.set("wireframeLineWidth", f),
u.set("wireframeLineColor", d)
} else
u.undefine("both", "WIREFRAME_TRIANGLE")
},
_updateViewControl: function (e, t) {
var r = e.coordinateSystem
, i = e.getModel("viewControl")
, n = (r.viewGL.camera,
this)
, a = this._control;
a.setViewGL(r.viewGL);
var o, s, l = i.get("targetCoord");
null != l && (s = l[0] + 90,
o = l[1]),
a.setFromViewControlModel(i, {
baseDistance: r.radius,
alpha: o,
beta: s
}),
a.off("update"),
a.on("update", (function () {
t.dispatchAction({
type: "globeChangeCamera",
alpha: a.getAlpha(),
beta: a.getBeta(),
distance: a.getDistance() - r.radius,
center: a.getCenter(),
from: n.uid,
globeId: e.id
})
}
))
},
_displaceVertices: function (e, t) {
var r = e.get("displacementQuality")
, i = e.get("debug.wireframe.show")
, n = e.coordinateSystem;
if (e.isDisplacementChanged() || r !== this._displacementQuality || i !== this._showDebugWireframe) {
this._displacementQuality = r,
this._showDebugWireframe = i;
var a = this._sphereGeometry
, o = {
low: 100,
medium: 200,
high: 400,
ultra: 800
}[r] || 200
, s = o / 2;
(a.widthSegments !== o || i) && (a.widthSegments = o,
a.heightSegments = s,
a.build()),
this._doDisplaceVertices(a, n),
i && a.generateBarycentric()
}
},
_doDisplaceVertices: function (e, t) {
var r = e.attributes.position.value
, i = e.attributes.texcoord0.value
, n = e.__originalPosition;
n && n.length === r.length || ((n = new Float32Array(r.length)).set(r),
e.__originalPosition = n);
for (var a = t.displacementWidth, o = t.displacementHeight, s = t.displacementData, l = 0; l < e.vertexCount; l++) {
var h = 3 * l
, u = 2 * l
, c = n[h + 1]
, d = n[h + 2]
, f = n[h + 3]
, p = i[u++]
, m = i[u++]
, g = Math.round(p * (a - 1))
, _ = Math.round(m * (o - 1))
, v = s ? s[_ * a + g] : 0;
r[h + 1] = c + c * v,
r[h + 2] = d + d * v,
r[h + 3] = f + f * v
}
e.generateVertexNormals(),
e.dirty(),
e.updateBoundingBox()
},
_updateLight: function (e, t) {
var r = this._earthMesh;
this._sceneHelper.updateLight(e);
var n = this._sceneHelper.mainLight
, a = e.get("light.main.time") || new Date
, o = gu.getPosition(i.number.parseDate(a), 0, 0)
, s = Math.cos(o.altitude);
n.position.y = -s * Math.cos(o.azimuth),
n.position.x = Math.sin(o.altitude),
n.position.z = s * Math.sin(o.azimuth),
n.lookAt(r.getWorldPosition())
},
dispose: function (e, t) {
this.groupGL.removeAll(),
this._control.dispose()
}
});
var vu = Po.vec3;
function yu(e) {
this.radius = e,
this.viewGL = null,
this.altitudeAxis,
this.displacementData = null,
this.displacementWidth,
this.displacementHeight
}
yu.prototype = {
constructor: yu,
dimensions: ["lng", "lat", "alt"],
type: "globe",
containPoint: function () { },
setDisplacementData: function (e, t, r) {
this.displacementData = e,
this.displacementWidth = t,
this.displacementHeight = r
},
_getDisplacementScale: function (e, t) {
var r = (e + 180) / 360 * (this.displacementWidth - 1)
, i = (90 - t) / 180 * (this.displacementHeight - 1)
, n = Math.round(r) + Math.round(i) * this.displacementWidth;
return this.displacementData[n]
},
dataToPoint: function (e, t) {
var r = e[0]
, i = e[1]
, n = e[2] || 0
, a = this.radius;
this.displacementData && (a *= 1 + this._getDisplacementScale(r, i)),
this.altitudeAxis && (a += this.altitudeAxis.dataToCoord(n)),
r = r * Math.PI / 180,
i = i * Math.PI / 180;
var o = Math.cos(i) * a;
return (t = t || [])[0] = -o * Math.cos(r + Math.PI),
t[1] = Math.sin(i) * a,
t[2] = o * Math.sin(r + Math.PI),
t
},
pointToData: function (e, t) {
var r = e[0]
, i = e[1]
, n = e[2]
, a = vu.len(e);
r /= a,
i /= a,
n /= a;
var o = Math.asin(i)
, s = Math.atan2(n, -r);
s < 0 && (s = 2 * Math.PI + s);
var l = 180 * o / Math.PI
, h = 180 * s / Math.PI - 180;
return (t = t || [])[0] = h,
t[1] = l,
t[2] = a - this.radius,
this.altitudeAxis && (t[2] = this.altitudeAxis.coordToData(t[2])),
t
}
};
const xu = yu;
function bu(e, t) {
var r = Ss(e.getBoxLayoutParams(), {
width: t.getWidth(),
height: t.getHeight()
});
r.y = t.getHeight() - r.y - r.height,
this.viewGL.setViewport(r.x, r.y, r.width, r.height, t.getDevicePixelRatio()),
this.radius = e.get("globeRadius");
var i = e.get("globeOuterRadius");
this.altitudeAxis && this.altitudeAxis.setExtent(0, i - this.radius)
}
function wu(e, t) {
var r = [1 / 0, -1 / 0];
if (e.eachSeries((function (e) {
if (e.coordinateSystem === this) {
var t = e.getData()
, i = e.coordDimToDataDim("alt")
, n = i && i[0];
if (n) {
var a = t.getDataExtent(n, !0);
r[0] = Math.min(r[0], a[0]),
r[1] = Math.max(r[1], a[1])
}
}
}
), this),
r && isFinite(r[1] - r[0])) {
var n = i.helper.createScale(r, {
type: "value",
min: "dataMin",
max: "dataMax"
});
this.altitudeAxis = new i.Axis("altitude", n),
this.resize(this.model, t)
}
}
const Tu = {
dimensions: xu.prototype.dimensions,
create: function (e, t) {
var r = [];
return e.eachComponent("globe", (function (e) {
e.__viewGL = e.__viewGL || new Il;
var i = new xu;
i.viewGL = e.__viewGL,
e.coordinateSystem = i,
i.model = e,
r.push(i),
i.resize = bu,
i.resize(e, t),
i.update = wu
}
)),
e.eachSeries((function (t) {
if ("globe" === t.get("coordinateSystem")) {
var r = t.getReferringComponents("globe").models[0];
if (r || (r = e.getComponent("globe")),
!r)
throw new Error('globe "' + Mn(t.get("globe3DIndex"), t.get("globe3DId"), 0) + '" not found');
var i = r.coordinateSystem;
t.coordinateSystem = i
}
}
)),
e.eachComponent("globe", (function (e, r) {
var i = e.coordinateSystem
, n = e.getDisplacementTexture()
, a = e.getDisplacemenScale();
if (e.isDisplacementChanged()) {
if (e.hasDisplacement()) {
var o = !0;
Ka.loadTexture(n, t, (function (r) {
var i = function (e, t) {
var r = document.createElement("canvas")
, i = r.getContext("2d")
, n = e.width
, a = e.height;
r.width = n,
r.height = a,
i.drawImage(e, 0, 0, n, a);
for (var o = i.getImageData(0, 0, n, a).data, s = new Float32Array(o.length / 4), l = 0; l < o.length / 4; l++) {
var h = o[4 * l];
s[l] = h / 255 * t
}
return {
data: s,
width: n,
height: a
}
}(r.image, a);
e.setDisplacementData(i.data, i.width, i.height),
o || t.dispatchAction({
type: "globeUpdateDisplacment"
})
}
)),
o = !1
} else
i.setDisplacementData(null, 0, 0);
i.setDisplacementData(e.displacementData, e.displacementWidth, e.displacementHeight)
}
}
)),
r
}
};
(0,
i.use)((function (e) {
e.registerComponentModel(iu),
e.registerComponentView(_u),
e.registerCoordinateSystem("globe", Tu),
e.registerAction({
type: "globeChangeCamera",
event: "globecamerachanged",
update: "series:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "globe",
query: e
}, (function (t) {
t.setView(e)
}
))
}
)),
e.registerAction({
type: "globeUpdateDisplacment",
event: "globedisplacementupdated",
update: "update"
}, (function (e, t) { }
))
}
));
var Su = ["zoom", "center", "pitch", "bearing"]
, Mu = i.ComponentModel.extend({
type: "mapbox3D",
layoutMode: "box",
coordinateSystem: null,
defaultOption: {
zlevel: -10,
style: "mapbox://styles/mapbox/light-v9",
center: [0, 0],
zoom: 0,
pitch: 0,
bearing: 0,
light: {
main: {
alpha: 20,
beta: 30
}
},
altitudeScale: 1,
boxHeight: "auto"
},
getMapboxCameraOption: function () {
var e = this;
return Su.reduce((function (t, r) {
return t[r] = e.get(r),
t
}
), {})
},
setMapboxCameraOption: function (e) {
null != e && Su.forEach((function (t) {
null != e[t] && (this.option[t] = e[t])
}
), this)
},
getMapbox: function () {
return this._mapbox
},
setMapbox: function (e) {
this._mapbox = e
}
});
i.util.merge(Mu.prototype, co),
i.util.merge(Mu.prototype, fo);
const Au = Mu;
function Eu(e, t) {
if (this.id = e,
this.zr = t,
this.dom = document.createElement("div"),
this.dom.style.cssText = "position:absolute;left:0;right:0;top:0;bottom:0;",
!mapboxgl)
throw new Error("Mapbox GL library must be included. See https://www.mapbox.com/mapbox-gl-js/api/");
this._mapbox = new mapboxgl.Map({
container: this.dom
}),
this._initEvents()
}
Eu.prototype.setUnpainted = function () { }
,
Eu.prototype.resize = function () {
this._mapbox.resize()
}
,
Eu.prototype.getMapbox = function () {
return this._mapbox
}
,
Eu.prototype.clear = function () { }
,
Eu.prototype.refresh = function () {
this._mapbox.resize()
}
;
var Cu = ["mousedown", "mouseup", "click", "dblclick", "mousemove", "mousewheel", "wheel", "touchstart", "touchend", "touchmove", "touchcancel"];
Eu.prototype._initEvents = function () {
var e = this._mapbox.getCanvasContainer();
this._handlers = this._handlers || {
contextmenu: function (e) {
return e.preventDefault(),
!1
}
},
Cu.forEach((function (t) {
this._handlers[t] = function (t) {
var r = {};
for (var i in t)
r[i] = t[i];
r.bubbles = !1;
var n = new t.constructor(t.type, r);
e.dispatchEvent(n)
}
,
this.zr.dom.addEventListener(t, this._handlers[t])
}
), this),
this.zr.dom.addEventListener("contextmenu", this._handlers.contextmenu)
}
,
Eu.prototype.dispose = function () {
Cu.forEach((function (e) {
this.zr.dom.removeEventListener(e, this._handlers[e])
}
), this)
}
;
const Du = Eu
, Lu = "\n@export ecgl.displayShadow.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n@import ecgl.common.attributes\n\nvarying vec3 v_WorldPosition;\n\nvarying vec3 v_Normal;\n\nvoid main()\n{\n @import ecgl.common.uv.main\n v_Normal = normalize((worldInverseTranspose * vec4(normal, 0.0)).xyz);\n\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n\n@end\n\n\n@export ecgl.displayShadow.fragment\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform float roughness: 0.2;\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n@import ecgl.common.ssaoMap.header\n\n@import clay.plugin.compute_shadow_map\n\nvoid main()\n{\n float shadow = 1.0;\n\n @import ecgl.common.ssaoMap.main\n\n#if defined(DIRECTIONAL_LIGHT_COUNT) && defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n for (int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++) {\n shadow = min(shadow, shadowContribsDir[i] * 0.5 + 0.5);\n }\n#endif\n\n shadow *= 0.5 + ao * 0.5;\n shadow = clamp(shadow, 0.0, 1.0);\n\n gl_FragColor = vec4(vec3(0.0), 1.0 - shadow);\n}\n\n@end";
Ka.Shader.import(Lu);
const Pu = i.ComponentView.extend({
type: "mapbox3D",
__ecgl__: !0,
init: function (e, t) {
var r = t.getZr();
this._zrLayer = new Du("mapbox3D", r),
r.painter.insertLayer(-1e3, this._zrLayer),
this._lightRoot = new Ka.Node,
this._sceneHelper = new Uo(this._lightRoot),
this._sceneHelper.initLight(this._lightRoot);
var i = this._zrLayer.getMapbox()
, n = this._dispatchInteractAction.bind(this, t, i);
["zoom", "rotate", "drag", "pitch", "rotate", "move"].forEach((function (e) {
i.on(e, n)
}
)),
this._groundMesh = new Ka.Mesh({
geometry: new Ka.PlaneGeometry,
material: new Ka.Material({
shader: new Ka.Shader({
vertex: Ka.Shader.source("ecgl.displayShadow.vertex"),
fragment: Ka.Shader.source("ecgl.displayShadow.fragment")
}),
depthMask: !1
}),
renderOrder: -100,
culling: !1,
castShadow: !1,
$ignorePicking: !0,
renderNormal: !0
})
},
render: function (e, t, r) {
var i = this._zrLayer.getMapbox()
, n = e.get("style")
, a = JSON.stringify(n);
a !== this._oldStyleStr && n && i.setStyle(n),
this._oldStyleStr = a,
i.setCenter(e.get("center")),
i.setZoom(e.get("zoom")),
i.setPitch(e.get("pitch")),
i.setBearing(e.get("bearing")),
e.setMapbox(i);
var o = e.coordinateSystem;
o.viewGL.scene.add(this._lightRoot),
o.viewGL.add(this._groundMesh),
this._updateGroundMesh(),
this._sceneHelper.setScene(o.viewGL.scene),
this._sceneHelper.updateLight(e),
o.viewGL.setPostEffect(e.getModel("postEffect"), r),
o.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling")),
this._mapbox3DModel = e
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r),
e.coordinateSystem.viewGL.scene.traverse((function (e) {
e.material && (e.material.define("fragment", "NORMAL_UP_AXIS", 2),
e.material.define("fragment", "NORMAL_FRONT_AXIS", 1))
}
))
},
updateCamera: function (e, t, r, i) {
e.coordinateSystem.setCameraOption(i),
this._updateGroundMesh(),
r.getZr().refresh()
},
_dispatchInteractAction: function (e, t, r) {
e.dispatchAction({
type: "mapbox3DChangeCamera",
pitch: t.getPitch(),
zoom: t.getZoom(),
center: t.getCenter().toArray(),
bearing: t.getBearing(),
mapbox3DId: this._mapbox3DModel && this._mapbox3DModel.id
})
},
_updateGroundMesh: function () {
if (this._mapbox3DModel) {
var e = this._mapbox3DModel.coordinateSystem
, t = e.dataToPoint(e.center);
this._groundMesh.position.set(t[0], t[1], -.001);
var r = new Ka.Plane(new Ka.Vector3(0, 0, 1), 0)
, i = e.viewGL.camera.castRay(new Ka.Vector2(-1, -1))
, n = e.viewGL.camera.castRay(new Ka.Vector2(1, 1))
, a = i.intersectPlane(r)
, o = n.intersectPlane(r)
, s = a.dist(o) / e.viewGL.rootNode.scale.x;
this._groundMesh.scale.set(s, s, 1)
}
},
dispose: function (e, t) {
this._zrLayer && this._zrLayer.dispose(),
t.getZr().painter.delLayer(-1e3)
}
});
var Ou = Po.mat4
, Nu = 512
, Iu = .6435011087932844
, Ru = Math.PI
, Bu = .1;
function Fu() {
this.width = 0,
this.height = 0,
this.altitudeScale = 1,
this.boxHeight = "auto",
this.altitudeExtent,
this.bearing = 0,
this.pitch = 0,
this.center = [0, 0],
this._origin,
this.zoom = 0,
this._initialZoom,
this.maxPitch = 60,
this.zoomOffset = 0
}
Fu.prototype = {
constructor: Fu,
dimensions: ["lng", "lat", "alt"],
containPoint: function () { },
setCameraOption: function (e) {
this.bearing = e.bearing,
this.pitch = e.pitch,
this.center = e.center,
this.zoom = e.zoom,
this._origin || (this._origin = this.projectOnTileWithScale(this.center, Nu)),
null == this._initialZoom && (this._initialZoom = this.zoom),
this.updateTransform()
},
updateTransform: function () {
if (this.height) {
var e = .5 / Math.tan(Iu / 2) * this.height * Bu
, t = Math.max(Math.min(this.pitch, this.maxPitch), 0) / 180 * Math.PI
, r = Iu / 2
, i = Math.PI / 2 + t
, n = Math.sin(r) * e / Math.sin(Math.PI - i - r)
, a = 1.1 * (Math.cos(Math.PI / 2 - t) * n + e);
this.pitch > 50 && (a = 1e3);
var o = [];
Ou.perspective(o, Iu, this.width / this.height, 1, a),
this.viewGL.camera.projectionMatrix.setArray(o),
this.viewGL.camera.decomposeProjectionMatrix(),
o = Ou.identity([]);
var s = this.dataToPoint(this.center);
Ou.scale(o, o, [1, -1, 1]),
Ou.translate(o, o, [0, 0, -e]),
Ou.rotateX(o, o, t),
Ou.rotateZ(o, o, -this.bearing / 180 * Math.PI),
Ou.translate(o, o, [-s[0] * this.getScale() * Bu, -s[1] * this.getScale() * Bu, 0]),
this.viewGL.camera.viewMatrix.array = o;
var l = [];
Ou.invert(l, o),
this.viewGL.camera.worldTransform.array = l,
this.viewGL.camera.decomposeWorldTransform();
var h, u = Nu * this.getScale();
if (this.altitudeExtent && !isNaN(this.boxHeight)) {
var c = this.altitudeExtent[1] - this.altitudeExtent[0];
h = this.boxHeight / c * this.getScale() / Math.pow(2, this._initialZoom - this.zoomOffset)
} else
h = u / (2 * Math.PI * 6378e3 * Math.abs(Math.cos(this.center[1] * (Math.PI / 180)))) * this.altitudeScale * Bu;
this.viewGL.rootNode.scale.set(this.getScale() * Bu, this.getScale() * Bu, h)
}
},
getScale: function () {
return Math.pow(2, this.zoom - this.zoomOffset)
},
projectOnTile: function (e, t) {
return this.projectOnTileWithScale(e, this.getScale() * Nu, t)
},
projectOnTileWithScale: function (e, t, r) {
var i = e[0]
, n = e[1] * Ru / 180
, a = t * (i * Ru / 180 + Ru) / (2 * Ru)
, o = t * (Ru - Math.log(Math.tan(Ru / 4 + .5 * n))) / (2 * Ru);
return (r = r || [])[0] = a,
r[1] = o,
r
},
unprojectFromTile: function (e, t) {
return this.unprojectOnTileWithScale(e, this.getScale() * Nu, t)
},
unprojectOnTileWithScale: function (e, t, r) {
var i = e[0]
, n = e[1]
, a = i / t * (2 * Ru) - Ru
, o = 2 * (Math.atan(Math.exp(Ru - n / t * (2 * Ru))) - Ru / 4);
return (r = r || [])[0] = 180 * a / Ru,
r[1] = 180 * o / Ru,
r
},
dataToPoint: function (e, t) {
return (t = this.projectOnTileWithScale(e, Nu, t))[0] -= this._origin[0],
t[1] -= this._origin[1],
t[2] = isNaN(e[2]) ? 0 : e[2],
isNaN(e[2]) || (t[2] = e[2],
this.altitudeExtent && (t[2] -= this.altitudeExtent[0])),
t
}
};
const zu = Fu;
function Gu() {
zu.apply(this, arguments)
}
function Uu(e, t, r) {
function i(e, t) {
var r = t.getWidth()
, i = t.getHeight()
, n = t.getDevicePixelRatio();
this.viewGL.setViewport(0, 0, r, i, n),
this.width = r,
this.height = i,
this.altitudeScale = e.get("altitudeScale"),
this.boxHeight = e.get("boxHeight")
}
function n(e, t) {
if ("auto" !== this.model.get("boxHeight")) {
var r = [1 / 0, -1 / 0];
e.eachSeries((function (e) {
if (e.coordinateSystem === this) {
var t = e.getData()
, i = e.coordDimToDataDim("alt")[0];
if (i) {
var n = t.getDataExtent(i, !0);
r[0] = Math.min(r[0], n[0]),
r[1] = Math.max(r[1], n[1])
}
}
}
), this),
r && isFinite(r[1] - r[0]) && (this.altitudeExtent = r)
}
}
return {
dimensions: t.prototype.dimensions,
create: function (a, o) {
var s = [];
return a.eachComponent(e, (function (e) {
var r = e.__viewGL;
r || (r = e.__viewGL = new Il).setRootNode(new Ka.Node);
var a = new t;
a.viewGL = e.__viewGL,
a.resize = i,
a.resize(e, o),
s.push(a),
e.coordinateSystem = a,
a.model = e,
a.update = n
}
)),
a.eachSeries((function (t) {
if (t.get("coordinateSystem") === e) {
var r = t.getReferringComponents(e).models[0];
if (r || (r = a.getComponent(e)),
!r)
throw new Error(e + ' "' + Mn(t.get(e + "Index"), t.get(e + "Id"), 0) + '" not found');
t.coordinateSystem = r.coordinateSystem
}
}
)),
r && r(s, a, o),
s
}
}
}
Gu.prototype = new zu,
Gu.prototype.constructor = Gu,
Gu.prototype.type = "mapbox3D";
const ku = Uu("mapbox3D", Gu, (function (e) {
e.forEach((function (e) {
e.setCameraOption(e.model.getMapboxCameraOption())
}
))
}
));
(0,
i.use)((function (e) {
e.registerComponentModel(Au),
e.registerComponentView(Pu),
e.registerCoordinateSystem("mapbox3D", ku),
e.registerAction({
type: "mapbox3DChangeCamera",
event: "mapbox3dcamerachanged",
update: "mapbox3D:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "mapbox3D",
query: e
}, (function (t) {
t.setMapboxCameraOption(e)
}
))
}
))
}
));
var Vu = ["zoom", "center", "pitch", "bearing"]
, Hu = i.ComponentModel.extend({
type: "maptalks3D",
layoutMode: "box",
coordinateSystem: null,
defaultOption: {
zlevel: -10,
urlTemplate: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
attribution: '© OpenStreetMap contributors, © CARTO',
center: [0, 0],
zoom: 0,
pitch: 0,
bearing: 0,
light: {
main: {
alpha: 20,
beta: 30
}
},
altitudeScale: 1,
boxHeight: "auto"
},
getMaptalksCameraOption: function () {
var e = this;
return Vu.reduce((function (t, r) {
return t[r] = e.get(r),
t
}
), {})
},
setMaptalksCameraOption: function (e) {
null != e && Vu.forEach((function (t) {
null != e[t] && (this.option[t] = e[t])
}
), this)
},
getMaptalks: function () {
return this._maptalks
},
setMaptalks: function (e) {
this._maptalks = e
}
});
i.util.merge(Hu.prototype, co),
i.util.merge(Hu.prototype, fo);
const Wu = Hu;
function ju(e, t, r, i) {
if (this.id = e,
this.zr = t,
this.dom = document.createElement("div"),
this.dom.style.cssText = "position:absolute;left:0;right:0;top:0;bottom:0;",
!maptalks)
throw new Error("Maptalks library must be included. See https://maptalks.org");
this._maptalks = new maptalks.Map(this.dom, {
center: r,
zoom: i,
doubleClickZoom: !1,
fog: !1
}),
this._initEvents()
}
ju.prototype.setUnpainted = function () { }
,
ju.prototype.resize = function () {
this._maptalks.checkSize()
}
,
ju.prototype.getMaptalks = function () {
return this._maptalks
}
,
ju.prototype.clear = function () { }
,
ju.prototype.refresh = function () {
this._maptalks.checkSize()
}
;
var Xu = ["mousedown", "mouseup", "click", "dblclick", "mousemove", "mousewheel", "DOMMouseScroll", "touchstart", "touchend", "touchmove", "touchcancel"];
ju.prototype._initEvents = function () {
var e = this.dom;
this._handlers = this._handlers || {
contextmenu: function (e) {
return e.preventDefault(),
!1
}
},
Xu.forEach((function (t) {
this._handlers[t] = function (r) {
var i = {};
for (var n in r)
i[n] = r[n];
i.bubbles = !1;
var a = new r.constructor(r.type, i);
"mousewheel" === t || "DOMMouseScroll" === t ? e.dispatchEvent(a) : e.firstElementChild.dispatchEvent(a)
}
,
this.zr.dom.addEventListener(t, this._handlers[t])
}
), this),
this.zr.dom.addEventListener("contextmenu", this._handlers.contextmenu)
}
,
ju.prototype.dispose = function () {
Xu.forEach((function (e) {
this.zr.dom.removeEventListener(e, this._handlers[e])
}
), this),
this._maptalks.remove()
}
;
const qu = ju;
Ka.Shader.import(Lu);
const Zu = i.ComponentView.extend({
type: "maptalks3D",
__ecgl__: !0,
init: function (e, t) {
this._groundMesh = new Ka.Mesh({
geometry: new Ka.PlaneGeometry,
material: new Ka.Material({
shader: new Ka.Shader({
vertex: Ka.Shader.source("ecgl.displayShadow.vertex"),
fragment: Ka.Shader.source("ecgl.displayShadow.fragment")
}),
depthMask: !1
}),
renderOrder: -100,
culling: !1,
castShadow: !1,
$ignorePicking: !0,
renderNormal: !0
})
},
_initMaptalksLayer: function (e, t) {
var r = t.getZr();
this._zrLayer = new qu("maptalks3D", r, e.get("center"), e.get("zoom")),
r.painter.insertLayer(-1e3, this._zrLayer),
this._lightRoot = new Ka.Node,
this._sceneHelper = new Uo(this._lightRoot),
this._sceneHelper.initLight(this._lightRoot);
var i = this._zrLayer.getMaptalks()
, n = this._dispatchInteractAction.bind(this, t, i);
["zoomend", "zooming", "zoomstart", "dragrotating", "pitch", "pitchend", "movestart", "moving", "moveend", "resize", "touchstart", "touchmove", "touchend", "animating"].forEach((function (e) {
i.on(e, n)
}
))
},
render: function (e, t, r) {
this._zrLayer || this._initMaptalksLayer(e, r);
var i = this._zrLayer.getMaptalks()
, n = e.get("urlTemplate")
, a = i.getBaseLayer();
n !== this._oldUrlTemplate && (a ? a.setOptions({
urlTemplate: n,
attribution: e.get("attribution")
}) : (a = new maptalks.TileLayer("maptalks-echarts-gl-baselayer", {
urlTemplate: n,
subdomains: ["a", "b", "c"],
attribution: e.get("attribution")
}),
i.setBaseLayer(a))),
this._oldUrlTemplate = n,
i.setCenter(e.get("center")),
i.setZoom(e.get("zoom"), {
animation: !1
}),
i.setPitch(e.get("pitch")),
i.setBearing(e.get("bearing")),
e.setMaptalks(i);
var o = e.coordinateSystem;
o.viewGL.scene.add(this._lightRoot),
o.viewGL.add(this._groundMesh),
this._updateGroundMesh(),
this._sceneHelper.setScene(o.viewGL.scene),
this._sceneHelper.updateLight(e),
o.viewGL.setPostEffect(e.getModel("postEffect"), r),
o.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling")),
this._maptalks3DModel = e
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r),
e.coordinateSystem.viewGL.scene.traverse((function (e) {
e.material && (e.material.define("fragment", "NORMAL_UP_AXIS", 2),
e.material.define("fragment", "NORMAL_FRONT_AXIS", 1))
}
))
},
updateCamera: function (e, t, r, i) {
e.coordinateSystem.setCameraOption(i),
this._updateGroundMesh(),
r.getZr().refresh()
},
_dispatchInteractAction: function (e, t, r) {
var i;
e.dispatchAction({
type: "maptalks3DChangeCamera",
pitch: t.getPitch(),
zoom: (i = t.getResolution(),
19 - Math.log(i / Yu) / Math.LN2 + 1),
center: t.getCenter().toArray(),
bearing: t.getBearing(),
maptalks3DId: this._maptalks3DModel && this._maptalks3DModel.id
})
},
_updateGroundMesh: function () {
if (this._maptalks3DModel) {
var e = this._maptalks3DModel.coordinateSystem
, t = e.dataToPoint(e.center);
this._groundMesh.position.set(t[0], t[1], -.001);
var r = new Ka.Plane(new Ka.Vector3(0, 0, 1), 0)
, i = e.viewGL.camera.castRay(new Ka.Vector2(-1, -1))
, n = e.viewGL.camera.castRay(new Ka.Vector2(1, 1))
, a = i.intersectPlane(r)
, o = n.intersectPlane(r)
, s = a.dist(o) / e.viewGL.rootNode.scale.x;
this._groundMesh.scale.set(s, s, 1)
}
},
dispose: function (e, t) {
this._zrLayer && this._zrLayer.dispose(),
t.getZr().painter.delLayer(-1e3)
}
})
, Yu = 12756274 * Math.PI / (256 * Math.pow(2, 20));
function Ku() {
zu.apply(this, arguments),
this.maxPitch = 85,
this.zoomOffset = 1
}
Ku.prototype = new zu,
Ku.prototype.constructor = Ku,
Ku.prototype.type = "maptalks3D";
const Qu = Uu("maptalks3D", Ku, (function (e) {
e.forEach((function (e) {
e.setCameraOption(e.model.getMaptalksCameraOption())
}
))
}
));
(0,
i.use)((function (e) {
e.registerComponentModel(Wu),
e.registerComponentView(Zu),
e.registerCoordinateSystem("maptalks3D", Qu),
e.registerAction({
type: "maptalks3DChangeCamera",
event: "maptalks3dcamerachanged",
update: "maptalks3D:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "maptalks3D",
query: e
}, (function (t) {
t.setMaptalksCameraOption(e)
}
))
}
))
}
));
var Ju = Po.vec3
, $u = i.helper.dataStack.isDimensionStacked;
function ec(e, t, r) {
for (var i = e.getDataExtent(t), n = e.getDataExtent(r), a = i[1] - i[0] || i[0], o = n[1] - n[0] || n[0], s = new Uint8Array(2500), l = 0; l < e.count(); l++) {
var h = e.get(t, l)
, u = e.get(r, l)
, c = Math.floor((h - i[0]) / a * 49)
, d = 50 * Math.floor((u - n[0]) / o * 49) + c;
s[d] = s[d] || 1
}
var f = 0;
for (l = 0; l < s.length; l++)
s[l] && f++;
return f / s.length
}
var tc = Po.vec3
, rc = i.helper.dataStack.isDimensionStacked;
function ic(e, t) {
var r = rc(e, t[2]);
return {
dimension: r ? e.getCalculationInfo("stackResultDimension") : t[2],
isStacked: r
}
}
function nc(e) {
e.registerLayout((function (e, t) {
e.eachSeriesByType("bar3D", (function (e) {
var t = e.coordinateSystem
, r = t && t.type;
"globe" === r ? function (e, t) {
var r = e.getData()
, n = e.get("minHeight") || 0
, a = e.get("barSize")
, o = ["lng", "lat", "alt"].map((function (t) {
return e.coordDimToDataDim(t)[0]
}
));
if (null == a) {
var s = t.radius * Math.PI
, l = ec(r, o[0], o[1]);
a = [s / Math.sqrt(r.count() / l), s / Math.sqrt(r.count() / l)]
} else
i.util.isArray(a) || (a = [a, a]);
var h = ic(r, o);
r.each(o, (function (e, i, o, s) {
var l = r.get(h.dimension, s)
, u = h.isStacked ? l - o : t.altitudeAxis.scale.getExtent()[0]
, c = Math.max(t.altitudeAxis.dataToCoord(o), n)
, d = t.dataToPoint([e, i, u])
, f = t.dataToPoint([e, i, l])
, p = tc.sub([], f, d);
tc.normalize(p, p);
var m = [a[0], c, a[1]];
r.setItemLayout(s, [d, p, m])
}
)),
r.setLayout("orient", vt.UP.array)
}(e, t) : "cartesian3D" === r ? function (e, t) {
var r = e.getData()
, n = e.get("barSize");
if (null == n) {
var a, o, s = t.size, l = t.getAxis("x"), h = t.getAxis("y");
a = "category" === l.type ? .7 * l.getBandWidth() : .6 * Math.round(s[0] / Math.sqrt(r.count())),
o = "category" === h.type ? .7 * h.getBandWidth() : .6 * Math.round(s[1] / Math.sqrt(r.count())),
n = [a, o]
} else
i.util.isArray(n) || (n = [n, n]);
var u, c, d, f = t.getAxis("z").scale.getExtent(), p = (c = (u = f)[0],
d = u[1],
!(c > 0 && d > 0 || c < 0 && d < 0)), m = ["x", "y", "z"].map((function (t) {
return e.coordDimToDataDim(t)[0]
}
)), g = $u(r, m[2]), _ = g ? r.getCalculationInfo("stackResultDimension") : m[2];
r.each(m, (function (e, i, a, o) {
var s = r.get(_, o)
, l = g ? s - a : p ? 0 : f[0]
, h = t.dataToPoint([e, i, l])
, u = t.dataToPoint([e, i, s])
, c = Ju.dist(h, u)
, d = [0, u[1] < h[1] ? -1 : 1, 0];
0 === Math.abs(c) && (c = .1);
var m = [n[0], c, n[1]];
r.setItemLayout(o, [h, d, m])
}
)),
r.setLayout("orient", [1, 0, 0])
}(e, t) : "geo3D" === r ? function (e, t) {
var r = e.getData()
, n = e.get("barSize")
, a = e.get("minHeight") || 0
, o = ["lng", "lat", "alt"].map((function (t) {
return e.coordDimToDataDim(t)[0]
}
));
if (null == n) {
var s = Math.min(t.size[0], t.size[2])
, l = ec(r, o[0], o[1]);
n = [s / Math.sqrt(r.count() / l), s / Math.sqrt(r.count() / l)]
} else
i.util.isArray(n) || (n = [n, n]);
var h = [0, 1, 0]
, u = ic(r, o);
r.each(o, (function (e, i, o, s) {
var l = r.get(u.dimension, s)
, c = u.isStacked ? l - o : t.altitudeAxis.scale.getExtent()[0]
, d = Math.max(t.altitudeAxis.dataToCoord(o), a)
, f = t.dataToPoint([e, i, c])
, p = [n[0], d, n[1]];
r.setItemLayout(s, [f, h, p])
}
)),
r.setLayout("orient", [1, 0, 0])
}(e, t) : ("mapbox3D" === r || "maptalks3D" === r) && function (e, t) {
var r = e.getData()
, n = e.coordDimToDataDim("lng")[0]
, a = e.coordDimToDataDim("lat")[0]
, o = e.coordDimToDataDim("alt")[0]
, s = e.get("barSize")
, l = e.get("minHeight") || 0;
if (null == s) {
var h = r.getDataExtent(n)
, u = r.getDataExtent(a)
, c = t.dataToPoint([h[0], u[0]])
, d = t.dataToPoint([h[1], u[1]])
, f = Math.min(Math.abs(c[0] - d[0]), Math.abs(c[1] - d[1])) || 1
, p = ec(r, n, a);
s = [f / Math.sqrt(r.count() / p), f / Math.sqrt(r.count() / p)]
} else
i.util.isArray(s) || (s = [s, s]),
s[0] /= t.getScale() / 16,
s[1] /= t.getScale() / 16;
var m = [0, 0, 1]
, g = [n, a, o]
, _ = ic(r, g);
r.each(g, (function (e, i, n, a) {
var o = r.get(_.dimension, a)
, h = _.isStacked ? o - n : 0
, u = t.dataToPoint([e, i, h])
, c = t.dataToPoint([e, i, o])
, d = Math.max(c[2] - u[2], l)
, f = [s[0], d, s[1]];
r.setItemLayout(a, [u, m, f])
}
)),
r.setLayout("orient", [1, 0, 0])
}(e, t)
}
))
}
))
}
const ac = {
getFormattedLabel: function (e, t, r, n, a) {
r = r || "normal";
var o = e.getData(n).getItemModel(t)
, s = e.getDataParams(t, n);
null != a && s.value instanceof Array && (s.value = s.value[a]);
var l, h = o.get("normal" === r ? ["label", "formatter"] : ["emphasis", "label", "formatter"]);
return null == h && (h = o.get(["label", "formatter"])),
"function" == typeof h ? (s.status = r,
l = h(s)) : "string" == typeof h && (l = i.format.formatTpl(h, s)),
l
},
normalizeToArray: function (e) {
return e instanceof Array ? e : null == e ? [] : [e]
}
};
function oc(e, t, r) {
var n = e.getData()
, a = e.getRawValue(t)
, o = i.util.isArray(a) ? function (e) {
var a = []
, o = function (e, t) {
var r = [];
return i.util.each(e.dimensions, (function (t) {
var i = e.getDimensionInfo(t)
, n = i.otherDims.tooltip;
null != n && !1 !== n && (r[n] = i.name)
}
)),
r
}(n);
function s(e, t) {
var o = n.getDimensionInfo(t);
if (o && !1 !== o.otherDims.tooltip) {
var s = o.type
, l = "- " + (o.tooltipName || o.name) + ": " + ("ordinal" === s ? e + "" : "time" === s ? r ? "" : i.format.formatTime("yyyy/MM/dd hh:mm:ss", e) : i.format.addCommas(e));
l && a.push(i.format.encodeHTML(l))
}
}
return o.length ? i.util.each(o, (function (e) {
s(n.get(e, t), e)
}
)) : i.util.each(e, s),
"
" + a.join("
")
}(a) : i.format.encodeHTML(i.format.addCommas(a))
, s = n.getName(t)
, l = Ih(n, t);
i.util.isObject(l) && l.colorStops && (l = (l.colorStops[0] || {}).color),
l = l || "transparent";
var h = i.format.getTooltipMarker(l)
, u = e.name;
return "\0-" === u && (u = ""),
u = u ? i.format.encodeHTML(u) + (r ? ": " : "
") : "",
r ? h + u + o : u + h + (s ? i.format.encodeHTML(s) + ": " + o : o)
}
function sc(e, t, r) {
r = r || e.getSource();
var n = t || i.getCoordinateSystemDimensions(e.get("coordinateSystem")) || ["x", "y", "z"]
, a = i.helper.createDimensions(r, {
dimensionsDefine: r.dimensionsDefine || e.get("dimensions"),
encodeDefine: r.encodeDefine || e.get("encode"),
coordDimensions: n.map((function (t) {
var r = e.getReferringComponents(t + "Axis3D").models[0];
return {
type: r && "category" === r.get("type") ? "ordinal" : "float",
name: t
}
}
))
});
"cartesian3D" === e.get("coordinateSystem") && a.forEach((function (t) {
if (n.indexOf(t.coordDim) >= 0) {
var r = e.getReferringComponents(t.coordDim + "Axis3D").models[0];
r && "category" === r.get("type") && (t.ordinalMeta = r.getOrdinalMeta())
}
}
));
var o = i.helper.dataStack.enableDataStack(e, a, {
byIndex: !0,
stackedCoordDimension: "z"
})
, s = new i.List(a, e);
return s.setCalculationInfo(o),
s.initData(r),
s
}
var lc = i.SeriesModel.extend({
type: "series.bar3D",
dependencies: ["globe"],
visualStyleAccessPathvisu: "itemStyle",
getInitialData: function (e, t) {
return sc(this)
},
getFormattedLabel: function (e, t, r, i) {
var n = ac.getFormattedLabel(this, e, t, r, i);
return null == n && (n = this.getData().get("z", e)),
n
},
formatTooltip: function (e) {
return oc(this, e)
},
defaultOption: {
coordinateSystem: "cartesian3D",
globeIndex: 0,
grid3DIndex: 0,
zlevel: -10,
bevelSize: 0,
bevelSmoothness: 2,
onGridPlane: "xy",
shading: "color",
minHeight: 0,
itemStyle: {
opacity: 1
},
label: {
show: !1,
distance: 2,
textStyle: {
fontSize: 14,
color: "#000",
backgroundColor: "rgba(255,255,255,0.7)",
padding: 3,
borderRadius: 3
}
},
emphasis: {
label: {
show: !0
}
},
animationDurationUpdate: 500
}
});
i.util.merge(lc.prototype, Kl);
const hc = lc;
var uc, cc, dc, fc, pc, mc, gc, _c, vc = Po.vec3, yc = Po.mat3, xc = Vr.extend((function () {
return {
attributes: {
position: new Vr.Attribute("position", "float", 3, "POSITION"),
normal: new Vr.Attribute("normal", "float", 3, "NORMAL"),
color: new Vr.Attribute("color", "float", 4, "COLOR"),
prevPosition: new Vr.Attribute("prevPosition", "float", 3),
prevNormal: new Vr.Attribute("prevNormal", "float", 3)
},
dynamic: !0,
enableNormal: !1,
bevelSize: 1,
bevelSegments: 0,
_dataIndices: null,
_vertexOffset: 0,
_triangleOffset: 0
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._triangleOffset = 0
},
setBarCount: function (e) {
var t = this.enableNormal
, r = this.getBarVertexCount() * e
, i = this.getBarTriangleCount() * e;
this.vertexCount !== r && (this.attributes.position.init(r),
t ? this.attributes.normal.init(r) : this.attributes.normal.value = null,
this.attributes.color.init(r)),
this.triangleCount !== i && (this.indices = r > 65535 ? new Uint32Array(3 * i) : new Uint16Array(3 * i),
this._dataIndices = new Uint32Array(r))
},
getBarVertexCount: function () {
var e = this.bevelSize > 0 ? this.bevelSegments : 0;
return e > 0 ? this._getBevelBarVertexCount(e) : this.enableNormal ? 24 : 8
},
getBarTriangleCount: function () {
var e = this.bevelSize > 0 ? this.bevelSegments : 0;
return e > 0 ? this._getBevelBarTriangleCount(e) : 12
},
_getBevelBarVertexCount: function (e) {
return 4 * (e + 1) * (e + 1) * 2
},
_getBevelBarTriangleCount: function (e) {
return (4 * e + 3 + 1) * (2 * e + 1) * 2 + 4
},
setColor: function (e, t) {
for (var r = this.getBarVertexCount(), i = r * (e + 1), n = r * e; n < i; n++)
this.attributes.color.set(n, t);
this.dirtyAttribute("color")
},
getDataIndexOfVertex: function (e) {
return this._dataIndices ? this._dataIndices[e] : null
},
addBar: function () {
for (var e = vc.create, t = vc.scaleAndAdd, r = e(), i = e(), n = e(), a = e(), o = e(), s = e(), l = e(), h = [], u = [], c = 0; c < 8; c++)
h[c] = e();
var d = [[0, 1, 5, 4], [2, 3, 7, 6], [4, 5, 6, 7], [3, 2, 1, 0], [0, 4, 7, 3], [1, 2, 6, 5]]
, f = [0, 1, 2, 0, 2, 3]
, p = [];
for (c = 0; c < d.length; c++)
for (var m = d[c], g = 0; g < 2; g++) {
for (var _ = [], v = 0; v < 3; v++)
_.push(m[f[3 * g + v]]);
p.push(_)
}
return function (e, c, m, g, _, v) {
var y = this._vertexOffset;
if (this.bevelSize > 0 && this.bevelSegments > 0)
this._addBevelBar(e, c, m, g, this.bevelSize, this.bevelSegments, _);
else {
vc.copy(n, c),
vc.normalize(n, n),
vc.cross(a, m, n),
vc.normalize(a, a),
vc.cross(i, n, a),
vc.normalize(a, a),
vc.negate(o, i),
vc.negate(s, n),
vc.negate(l, a),
t(h[0], e, i, g[0] / 2),
t(h[0], h[0], a, g[2] / 2),
t(h[1], e, i, g[0] / 2),
t(h[1], h[1], l, g[2] / 2),
t(h[2], e, o, g[0] / 2),
t(h[2], h[2], l, g[2] / 2),
t(h[3], e, o, g[0] / 2),
t(h[3], h[3], a, g[2] / 2),
t(r, e, n, g[1]),
t(h[4], r, i, g[0] / 2),
t(h[4], h[4], a, g[2] / 2),
t(h[5], r, i, g[0] / 2),
t(h[5], h[5], l, g[2] / 2),
t(h[6], r, o, g[0] / 2),
t(h[6], h[6], l, g[2] / 2),
t(h[7], r, o, g[0] / 2),
t(h[7], h[7], a, g[2] / 2);
var x = this.attributes;
if (this.enableNormal) {
u[0] = i,
u[1] = o,
u[2] = n,
u[3] = s,
u[4] = a,
u[5] = l;
for (var b = this._vertexOffset, w = 0; w < d.length; w++) {
for (var T = 3 * this._triangleOffset, S = 0; S < 6; S++)
this.indices[T++] = b + f[S];
b += 4,
this._triangleOffset += 2
}
for (w = 0; w < d.length; w++) {
var M = u[w];
for (S = 0; S < 4; S++) {
var A = d[w][S];
x.position.set(this._vertexOffset, h[A]),
x.normal.set(this._vertexOffset, M),
x.color.set(this._vertexOffset++, _)
}
}
} else {
for (w = 0; w < p.length; w++) {
for (T = 3 * this._triangleOffset,
S = 0; S < 3; S++)
this.indices[T + S] = p[w][S] + this._vertexOffset;
this._triangleOffset++
}
for (w = 0; w < h.length; w++)
x.position.set(this._vertexOffset, h[w]),
x.color.set(this._vertexOffset++, _)
}
}
var E = this._vertexOffset;
for (w = y; w < E; w++)
this._dataIndices[w] = v
}
}(),
_addBevelBar: (uc = vc.create(),
cc = vc.create(),
dc = vc.create(),
fc = yc.create(),
pc = [],
mc = [1, -1, -1, 1],
gc = [1, 1, -1, -1],
_c = [2, 0],
function (e, t, r, i, n, a, o) {
vc.copy(cc, t),
vc.normalize(cc, cc),
vc.cross(dc, r, cc),
vc.normalize(dc, dc),
vc.cross(uc, cc, dc),
vc.normalize(dc, dc),
fc[0] = uc[0],
fc[1] = uc[1],
fc[2] = uc[2],
fc[3] = cc[0],
fc[4] = cc[1],
fc[5] = cc[2],
fc[6] = dc[0],
fc[7] = dc[1],
fc[8] = dc[2],
n = Math.min(i[0], i[2]) / 2 * n;
for (var s = 0; s < 3; s++)
pc[s] = Math.max(i[s] - 2 * n, 0);
var l = (i[0] - pc[0]) / 2
, h = (i[1] - pc[1]) / 2
, u = (i[2] - pc[2]) / 2
, c = []
, d = []
, f = this._vertexOffset
, p = [];
for (s = 0; s < 2; s++) {
p[s] = p[s] = [];
for (var m = 0; m <= a; m++)
for (var g = 0; g < 4; g++) {
(0 === m && 0 === s || 1 === s && m === a) && p[s].push(f);
for (var _ = 0; _ <= a; _++) {
var v = _ / a * Math.PI / 2 + Math.PI / 2 * g
, y = m / a * Math.PI / 2 + Math.PI / 2 * s;
d[0] = l * Math.cos(v) * Math.sin(y),
d[1] = h * Math.cos(y),
d[2] = u * Math.sin(v) * Math.sin(y),
c[0] = d[0] + mc[g] * pc[0] / 2,
c[1] = d[1] + h + _c[s] * pc[1] / 2,
c[2] = d[2] + gc[g] * pc[2] / 2,
Math.abs(l - h) < 1e-6 && Math.abs(h - u) < 1e-6 || (d[0] /= l * l,
d[1] /= h * h,
d[2] /= u * u),
vc.normalize(d, d),
vc.transformMat3(c, c, fc),
vc.transformMat3(d, d, fc),
vc.add(c, c, e),
this.attributes.position.set(f, c),
this.enableNormal && this.attributes.normal.set(f, d),
this.attributes.color.set(f, o),
f++
}
}
}
var x = 4 * a + 3
, b = 2 * a + 1
, w = x + 1;
for (g = 0; g < b; g++)
for (s = 0; s <= x; s++) {
var T = g * w + s + this._vertexOffset
, S = g * w + (s + 1) % w + this._vertexOffset
, M = (g + 1) * w + (s + 1) % w + this._vertexOffset
, A = (g + 1) * w + s + this._vertexOffset;
this.setTriangleIndices(this._triangleOffset++, [M, T, S]),
this.setTriangleIndices(this._triangleOffset++, [M, A, T])
}
this.setTriangleIndices(this._triangleOffset++, [p[0][0], p[0][2], p[0][1]]),
this.setTriangleIndices(this._triangleOffset++, [p[0][0], p[0][3], p[0][2]]),
this.setTriangleIndices(this._triangleOffset++, [p[1][0], p[1][1], p[1][2]]),
this.setTriangleIndices(this._triangleOffset++, [p[1][0], p[1][2], p[1][3]]),
this._vertexOffset = f
}
)
});
i.util.defaults(xc.prototype, Lo),
i.util.defaults(xc.prototype, Nh);
const bc = xc;
var wc = Po.vec3;
const Tc = i.ChartView.extend({
type: "bar3D",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._api = t,
this._labelsBuilder = new Fh(256, 256, t);
var r = this;
this._labelsBuilder.getLabelPosition = function (e, t, i) {
if (r._data) {
var n = r._data.getItemLayout(e)
, a = n[0]
, o = n[1]
, s = n[2][1];
return wc.scaleAndAdd([], a, o, i + s)
}
return [0, 0]
}
,
this._labelsBuilder.getMesh().renderOrder = 100
},
render: function (e, t, r) {
var i = this._prevBarMesh;
this._prevBarMesh = this._barMesh,
this._barMesh = i,
this._barMesh || (this._barMesh = new Ka.Mesh({
geometry: new bc,
shadowDepthMaterial: new Ka.Material({
shader: new Ka.Shader(Ka.Shader.source("ecgl.sm.depth.vertex"), Ka.Shader.source("ecgl.sm.depth.fragment"))
}),
culling: "cartesian3D" === e.coordinateSystem.type,
renderOrder: 10,
renderNormal: !0
})),
this.groupGL.remove(this._prevBarMesh),
this.groupGL.add(this._barMesh),
this.groupGL.add(this._labelsBuilder.getMesh());
var n = e.coordinateSystem;
if (this._doRender(e, r),
n && n.viewGL) {
n.viewGL.add(this.groupGL);
var a = n.viewGL.isLinearSpace() ? "define" : "undefine";
this._barMesh.material[a]("fragment", "SRGB_DECODE")
}
this._data = e.getData(),
this._labelsBuilder.updateData(this._data),
this._labelsBuilder.updateLabels(),
this._updateAnimation(e)
},
_updateAnimation: function (e) {
Ka.updateVertexAnimation([["prevPosition", "position"], ["prevNormal", "normal"]], this._prevBarMesh, this._barMesh, e)
},
_doRender: function (e, t) {
var r = e.getData()
, i = e.get("shading")
, n = "color" !== i
, a = this
, o = this._barMesh
, s = "ecgl." + i;
o.material && o.material.shader.name === s || (o.material = Ka.createMaterial(s, ["VERTEX_COLOR"])),
Ka.setMaterialFromModel(i, o.material, e, t),
o.geometry.enableNormal = n,
o.geometry.resetOffset();
var l = e.get("bevelSize")
, h = e.get("bevelSmoothness");
o.geometry.bevelSegments = h,
o.geometry.bevelSize = l;
var u = []
, c = new Float32Array(4 * r.count())
, d = 0
, f = 0
, p = !1;
r.each((function (e) {
if (r.hasValue(e)) {
var t = Ih(r, e)
, i = Rh(r, e);
null == i && (i = 1),
Ka.parseColor(t, u),
u[3] *= i,
c[d++] = u[0],
c[d++] = u[1],
c[d++] = u[2],
c[d++] = u[3],
u[3] > 0 && (f++,
u[3] < .99 && (p = !0))
}
}
)),
o.geometry.setBarCount(f);
var m = r.getLayout("orient")
, g = this._barIndexOfData = new Int32Array(r.count());
f = 0,
r.each((function (e) {
if (r.hasValue(e)) {
var t = r.getItemLayout(e)
, i = t[0]
, n = t[1]
, o = t[2]
, s = 4 * e;
u[0] = c[s++],
u[1] = c[s++],
u[2] = c[s++],
u[3] = c[s++],
u[3] > 0 && (a._barMesh.geometry.addBar(i, n, m, o, u, e),
g[e] = f++)
} else
g[e] = -1
}
)),
o.geometry.dirty(),
o.geometry.updateBoundingBox();
var _ = o.material;
_.transparent = p,
_.depthMask = !p,
o.geometry.sortTriangles = p,
this._initHandler(e, t)
},
_initHandler: function (e, t) {
var r = e.getData()
, i = this._barMesh
, n = "cartesian3D" === e.coordinateSystem.type;
i.seriesIndex = e.seriesIndex;
var a = -1;
i.off("mousemove"),
i.off("mouseout"),
i.on("mousemove", (function (e) {
var o = i.geometry.getDataIndexOfVertex(e.triangle[0]);
o !== a && (this._downplay(a),
this._highlight(o),
this._labelsBuilder.updateLabels([o]),
n && t.dispatchAction({
type: "grid3DShowAxisPointer",
value: [r.get("x", o), r.get("y", o), r.get("z", o, !0)]
})),
a = o,
i.dataIndex = o
}
), this),
i.on("mouseout", (function (e) {
this._downplay(a),
this._labelsBuilder.updateLabels(),
a = -1,
i.dataIndex = -1,
n && t.dispatchAction({
type: "grid3DHideAxisPointer"
})
}
), this)
},
_highlight: function (e) {
var t = this._data;
if (t) {
var r = this._barIndexOfData[e];
if (!(r < 0)) {
var n = t.getItemModel(e).getModel("emphasis.itemStyle")
, a = n.get("color")
, o = n.get("opacity");
if (null == a) {
var s = Ih(t, e);
a = i.color.lift(s, -.4)
}
null == o && (o = Rh(t, e));
var l = Ka.parseColor(a);
l[3] *= o,
this._barMesh.geometry.setColor(r, l),
this._api.getZr().refresh()
}
}
},
_downplay: function (e) {
var t = this._data;
if (t) {
var r = this._barIndexOfData[e];
if (!(r < 0)) {
var i = Ih(t, e)
, n = Rh(t, e)
, a = Ka.parseColor(i);
a[3] *= n,
this._barMesh.geometry.setColor(r, a),
this._api.getZr().refresh()
}
}
},
highlight: function (e, t, r, i) {
this._toggleStatus("highlight", e, t, r, i)
},
downplay: function (e, t, r, i) {
this._toggleStatus("downplay", e, t, r, i)
},
_toggleStatus: function (e, t, r, n, a) {
var o = t.getData()
, s = An(o, a)
, l = this;
null != s ? i.util.each(ac.normalizeToArray(s), (function (t) {
"highlight" === e ? this._highlight(t) : this._downplay(t)
}
), this) : o.each((function (t) {
"highlight" === e ? l._highlight(t) : l._downplay(t)
}
))
},
remove: function () {
this.groupGL.removeAll()
},
dispose: function () {
this._labelsBuilder.dispose(),
this.groupGL.removeAll()
}
});
(0,
i.use)((function (e) {
e.registerChartView(Tc),
e.registerSeriesModel(hc),
nc(e),
e.registerProcessor((function (e, t) {
e.eachSeriesByType("bar3d", (function (e) {
var t = e.getData();
t.filterSelf((function (e) {
return t.hasValue(e)
}
))
}
))
}
))
}
));
const Sc = i.SeriesModel.extend({
type: "series.line3D",
dependencies: ["grid3D"],
visualStyleAccessPath: "lineStyle",
visualDrawType: "stroke",
getInitialData: function (e, t) {
return sc(this)
},
formatTooltip: function (e) {
return oc(this, e)
},
defaultOption: {
coordinateSystem: "cartesian3D",
zlevel: -10,
grid3DIndex: 0,
lineStyle: {
width: 2
},
animationDurationUpdate: 500
}
});
function Mc(e, t, r, i, n, a, o) {
if (0 === n)
return !1;
var s, l = n;
if (o > t + l && o > i + l || o < t - l && o < i - l || a > e + l && a > r + l || a < e - l && a < r - l)
return !1;
if (e === r)
return Math.abs(a - e) <= l / 2;
var h = (s = (t - i) / (e - r)) * a - o + (e * i - r * t) / (e - r);
return h * h / (s * s + 1) <= l / 2 * l / 2
}
var Ac = Po.vec3;
Ka.Shader.import(is);
const Ec = i.ChartView.extend({
type: "line3D",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._api = t
},
render: function (e, t, r) {
var i = this._prevLine3DMesh;
this._prevLine3DMesh = this._line3DMesh,
this._line3DMesh = i,
this._line3DMesh || (this._line3DMesh = new Ka.Mesh({
geometry: new Ro({
useNativeLine: !1,
sortTriangles: !0
}),
material: new Ka.Material({
shader: Ka.createShader("ecgl.meshLines3D")
}),
renderOrder: 10
}),
this._line3DMesh.geometry.pick = this._pick.bind(this)),
this.groupGL.remove(this._prevLine3DMesh),
this.groupGL.add(this._line3DMesh);
var n = e.coordinateSystem;
if (n && n.viewGL) {
n.viewGL.add(this.groupGL);
var a = n.viewGL.isLinearSpace() ? "define" : "undefine";
this._line3DMesh.material[a]("fragment", "SRGB_DECODE")
}
this._doRender(e, r),
this._data = e.getData(),
this._camera = n.viewGL.camera,
this.updateCamera(),
this._updateAnimation(e)
},
updateCamera: function () {
this._updateNDCPosition()
},
_doRender: function (e, t) {
var r = e.getData()
, i = this._line3DMesh;
i.geometry.resetOffset();
var n = r.getLayout("points")
, a = []
, o = new Float32Array(n.length / 3 * 4)
, s = 0
, l = !1;
r.each((function (e) {
var t = Ih(r, e)
, i = Rh(r, e);
null == i && (i = 1),
Ka.parseColor(t, a),
a[3] *= i,
o[s++] = a[0],
o[s++] = a[1],
o[s++] = a[2],
o[s++] = a[3],
a[3] < .99 && (l = !0)
}
)),
i.geometry.setVertexCount(i.geometry.getPolylineVertexCount(n)),
i.geometry.setTriangleCount(i.geometry.getPolylineTriangleCount(n)),
i.geometry.addPolyline(n, o, Mn(e.get("lineStyle.width"), 1)),
i.geometry.dirty(),
i.geometry.updateBoundingBox();
var h = i.material;
h.transparent = l,
h.depthMask = !l;
var u = e.getModel("debug.wireframe");
u.get("show") ? (i.geometry.createAttribute("barycentric", "float", 3),
i.geometry.generateBarycentric(),
i.material.set("both", "WIREFRAME_TRIANGLE"),
i.material.set("wireframeLineColor", Ka.parseColor(u.get("lineStyle.color") || "rgba(0,0,0,0.5)")),
i.material.set("wireframeLineWidth", Mn(u.get("lineStyle.width"), 1))) : i.material.set("both", "WIREFRAME_TRIANGLE"),
this._points = n,
this._initHandler(e, t)
},
_updateAnimation: function (e) {
Ka.updateVertexAnimation([["prevPosition", "position"], ["prevPositionPrev", "positionPrev"], ["prevPositionNext", "positionNext"]], this._prevLine3DMesh, this._line3DMesh, e)
},
_initHandler: function (e, t) {
var r = e.getData()
, i = e.coordinateSystem
, n = this._line3DMesh
, a = -1;
n.seriesIndex = e.seriesIndex,
n.off("mousemove"),
n.off("mouseout"),
n.on("mousemove", (function (e) {
var o = i.pointToData(e.point.array)
, s = r.indicesOfNearest("x", o[0])[0];
s !== a && (t.dispatchAction({
type: "grid3DShowAxisPointer",
value: [r.get("x", s), r.get("y", s), r.get("z", s)]
}),
n.dataIndex = s),
a = s
}
), this),
n.on("mouseout", (function (e) {
a = -1,
n.dataIndex = -1,
t.dispatchAction({
type: "grid3DHideAxisPointer"
})
}
), this)
},
_updateNDCPosition: function () {
var e = new Ht
, t = this._camera;
Ht.multiply(e, t.projectionMatrix, t.viewMatrix);
var r = this._positionNDC
, i = this._points
, n = i.length / 3;
r && r.length / 2 === n || (r = this._positionNDC = new Float32Array(2 * n));
for (var a = [], o = 0; o < n; o++) {
var s = 3 * o
, l = 2 * o;
a[0] = i[s],
a[1] = i[s + 1],
a[2] = i[s + 2],
a[3] = 1,
Ac.transformMat4(a, a, e.array),
r[l] = a[0] / a[3],
r[l + 1] = a[1] / a[3]
}
},
_pick: function (e, t, r, i, n, a) {
var o = this._positionNDC
, s = this._data.hostModel.get("lineStyle.width")
, l = -1
, h = .5 * r.viewport.width
, u = .5 * r.viewport.height;
e = (e + 1) * h,
t = (t + 1) * u;
for (var c = 1; c < o.length / 2; c++) {
var d = (o[2 * (c - 1)] + 1) * h
, f = (o[2 * (c - 1) + 1] + 1) * u
, p = (o[2 * c] + 1) * h
, m = (o[2 * c + 1] + 1) * u;
Mc(d, f, p, m, s, e, t) && (l = (d - e) * (d - e) + (f - t) * (f - t) < (p - e) * (p - e) + (m - t) * (m - t) ? c - 1 : c)
}
if (l >= 0) {
var g = 3 * l
, _ = new vt(this._points[g], this._points[g + 1], this._points[g + 2]);
a.push({
dataIndex: l,
point: _,
pointWorld: _.clone(),
target: this._line3DMesh,
distance: this._camera.getWorldPosition().dist(_)
})
}
},
remove: function () {
this.groupGL.removeAll()
},
dispose: function () {
this.groupGL.removeAll()
}
});
(0,
i.use)((function (e) {
e.registerChartView(Ec),
e.registerSeriesModel(Sc),
e.registerLayout((function (e, t) {
e.eachSeriesByType("line3D", (function (e) {
var t = e.getData()
, r = e.coordinateSystem;
if (r) {
if ("cartesian3D" !== r.type)
return;
var i = new Float32Array(3 * t.count())
, n = []
, a = []
, o = r.dimensions.map((function (t) {
return e.coordDimToDataDim(t)[0]
}
));
r && t.each(o, (function (e, t, o, s) {
n[0] = e,
n[1] = t,
n[2] = o,
r.dataToPoint(n, a),
i[3 * s] = a[0],
i[3 * s + 1] = a[1],
i[3 * s + 2] = a[2]
}
)),
t.setLayout("points", i)
}
}
))
}
))
}
));
const Cc = i.SeriesModel.extend({
type: "series.scatter3D",
dependencies: ["globe", "grid3D", "geo3D"],
visualStyleAccessPath: "itemStyle",
hasSymbolVisual: !0,
getInitialData: function (e, t) {
return sc(this)
},
getFormattedLabel: function (e, t, r, i) {
var n = ac.getFormattedLabel(this, e, t, r, i);
if (null == n) {
var a = this.getData()
, o = a.dimensions[a.dimensions.length - 1];
n = a.get(o, e)
}
return n
},
formatTooltip: function (e) {
return oc(this, e)
},
defaultOption: {
coordinateSystem: "cartesian3D",
zlevel: -10,
progressive: 1e5,
progressiveThreshold: 1e5,
grid3DIndex: 0,
globeIndex: 0,
symbol: "circle",
symbolSize: 10,
blendMode: "source-over",
label: {
show: !1,
position: "right",
distance: 5,
textStyle: {
fontSize: 14,
color: "#000",
backgroundColor: "rgba(255,255,255,0.7)",
padding: 3,
borderRadius: 3
}
},
itemStyle: {
opacity: .8
},
emphasis: {
label: {
show: !0
}
},
animationDurationUpdate: 500
}
});
function Dc(e, t, r) {
(t = t || document.createElement("canvas")).width = e,
t.height = e;
var i = t.getContext("2d");
return r && r(i),
t
}
var Lc = {
getMarginByStyle: function (e) {
var t = e.minMargin || 0
, r = 0;
e.stroke && "none" !== e.stroke && (r = null == e.lineWidth ? 1 : e.lineWidth);
var i = e.shadowBlur || 0
, n = e.shadowOffsetX || 0
, a = e.shadowOffsetY || 0
, o = {};
return o.left = Math.max(r / 2, -n + i, t),
o.right = Math.max(r / 2, n + i, t),
o.top = Math.max(r / 2, -a + i, t),
o.bottom = Math.max(r / 2, a + i, t),
o
},
createSymbolSprite: function (e, t, r, n) {
var a = function (e, t, r, n) {
i.util.isArray(t) || (t = [t, t]);
var a = Lc.getMarginByStyle(r, void 0)
, o = t[0] + a.left + a.right
, s = t[1] + a.top + a.bottom
, l = i.helper.createSymbol(e, 0, 0, t[0], t[1])
, h = Math.max(o, s);
l.x = a.left,
l.y = a.top,
o > s ? l.y += (h - s) / 2 : l.x += (h - o) / 2;
var u = l.getBoundingRect();
return l.x -= u.x,
l.y -= u.y,
l.setStyle(r),
l.update(),
l.__size = h,
l
}(e, t, r)
, o = Lc.getMarginByStyle(r);
return {
image: Dc(a.__size, n, (function (e) {
i.innerDrawElementOnCanvas(e, a)
}
)),
margin: o
}
},
createSDFFromCanvas: function (e, t, r, i) {
return Dc(t, i, (function (t) {
var i = e.getContext("2d").getImageData(0, 0, e.width, e.height);
t.putImageData(function (e, t, r) {
var i = t.width
, n = t.height
, a = e.canvas.width
, o = e.canvas.height
, s = i / a
, l = n / o;
function h(e) {
return e < 128 ? 1 : -1
}
function u(e, a) {
var o = 1 / 0;
e = Math.floor(e * s);
for (var u = (a = Math.floor(a * l)) * i + e, c = h(t.data[4 * u]), d = Math.max(a - r, 0); d < Math.min(a + r, n); d++)
for (var f = Math.max(e - r, 0); f < Math.min(e + r, i); f++) {
u = d * i + f;
var p = f - e
, m = d - a;
if (c !== h(t.data[4 * u])) {
var g = p * p + m * m;
g < o && (o = g)
}
}
return c * Math.sqrt(o)
}
for (var c = e.createImageData(a, o), d = 0; d < o; d++)
for (var f = 0; f < a; f++) {
var p = u(f, d) / r * .5 + .5
, m = 4 * (d * a + f);
c.data[m++] = 255 * (1 - p),
c.data[m++] = 255 * (1 - p),
c.data[m++] = 255 * (1 - p),
c.data[m++] = 255
}
return c
}(t, i, r), 0, 0)
}
))
},
createSimpleSprite: function (e, t) {
return Dc(e, t, (function (t) {
var r = e / 2;
t.beginPath(),
t.arc(r, r, 60, 0, 2 * Math.PI, !1),
t.closePath();
var i = t.createRadialGradient(r, r, 0, r, r, r);
i.addColorStop(0, "rgba(255, 255, 255, 1)"),
i.addColorStop(.5, "rgba(255, 255, 255, 0.5)"),
i.addColorStop(1, "rgba(255, 255, 255, 0)"),
t.fillStyle = i,
t.fill()
}
))
}
};
const Pc = Lc;
var Oc = Po.vec3;
const Nc = {
needsSortVertices: function () {
return this.sortVertices
},
needsSortVerticesProgressively: function () {
return this.needsSortVertices() && this.vertexCount >= 2e4
},
doSortVertices: function (e, t) {
var r = this.indices
, i = Oc.create();
if (!r) {
r = this.indices = this.vertexCount > 65535 ? new Uint32Array(this.vertexCount) : new Uint16Array(this.vertexCount);
for (var n = 0; n < r.length; n++)
r[n] = n
}
if (0 === t) {
var a, o = this.attributes.position, s = (e = e.array,
0);
for (this._zList && this._zList.length === this.vertexCount || (this._zList = new Float32Array(this.vertexCount)),
n = 0; n < this.vertexCount; n++) {
o.get(n, i);
var l = Oc.sqrDist(i, e);
isNaN(l) && (l = 1e7,
s++),
0 === n ? (a = l,
l = 0) : l -= a,
this._zList[n] = l
}
this._noneCount = s
}
if (this.vertexCount < 2e4)
0 === t && this._simpleSort(this._noneCount / this.vertexCount > .05);
else
for (n = 0; n < 3; n++)
this._progressiveQuickSort(3 * t + n);
this.dirtyIndices()
},
_simpleSort: function (e) {
var t = this._zList
, r = this.indices;
function i(e, r) {
return t[r] - t[e]
}
e ? Array.prototype.sort.call(r, i) : Ch.sort(r, i, 0, r.length - 1)
},
_progressiveQuickSort: function (e) {
var t = this._zList
, r = this.indices;
this._quickSort = this._quickSort || new Ch,
this._quickSort.step(r, (function (e, r) {
return t[r] - t[e]
}
), e)
}
};
var Ic = Po.vec4;
Ka.Shader.import("@export ecgl.sdfSprite.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform float elapsedTime : 0;\n\nattribute vec3 position : POSITION;\n\n#ifdef VERTEX_SIZE\nattribute float size;\n#else\nuniform float u_Size;\n#endif\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_FillColor: COLOR;\nvarying vec4 v_Color;\n#endif\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nattribute float prevSize;\nuniform float percent : 1.0;\n#endif\n\n\n#ifdef POSITIONTEXTURE_ENABLED\nuniform sampler2D positionTexture;\n#endif\n\nvarying float v_Size;\n\nvoid main()\n{\n\n#ifdef POSITIONTEXTURE_ENABLED\n gl_Position = worldViewProjection * vec4(texture2D(positionTexture, position.xy).xy, -10.0, 1.0);\n#else\n\n #ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n #else\n vec3 pos = position;\n #endif\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n#endif\n\n#ifdef VERTEX_SIZE\n#ifdef VERTEX_ANIMATION\n v_Size = mix(prevSize, size, percent);\n#else\n v_Size = size;\n#endif\n#else\n v_Size = u_Size;\n#endif\n\n#ifdef VERTEX_COLOR\n v_Color = a_FillColor;\n #endif\n\n gl_PointSize = v_Size;\n}\n\n@end\n\n@export ecgl.sdfSprite.fragment\n\nuniform vec4 color: [1, 1, 1, 1];\nuniform vec4 strokeColor: [1, 1, 1, 1];\nuniform float smoothing: 0.07;\n\nuniform float lineWidth: 0.0;\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\nvarying float v_Size;\n\nuniform sampler2D sprite;\n\n@import clay.util.srgb\n\nvoid main()\n{\n gl_FragColor = color;\n\n vec4 _strokeColor = strokeColor;\n\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n #endif\n\n#ifdef SPRITE_ENABLED\n float d = texture2D(sprite, gl_PointCoord).r;\n gl_FragColor.a *= smoothstep(0.5 - smoothing, 0.5 + smoothing, d);\n\n if (lineWidth > 0.0) {\n float sLineWidth = lineWidth / 2.0;\n\n float outlineMaxValue0 = 0.5 + sLineWidth;\n float outlineMaxValue1 = 0.5 + sLineWidth + smoothing;\n float outlineMinValue0 = 0.5 - sLineWidth - smoothing;\n float outlineMinValue1 = 0.5 - sLineWidth;\n\n if (d <= outlineMaxValue1 && d >= outlineMinValue0) {\n float a = _strokeColor.a;\n if (d <= outlineMinValue1) {\n a = a * smoothstep(outlineMinValue0, outlineMinValue1, d);\n }\n else {\n a = a * smoothstep(outlineMaxValue1, outlineMaxValue0, d);\n }\n gl_FragColor.rgb = mix(gl_FragColor.rgb * gl_FragColor.a, _strokeColor.rgb, a);\n gl_FragColor.a = gl_FragColor.a * (1.0 - a) + a;\n }\n }\n#endif\n\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(gl_FragColor);\n#endif\n}\n@end");
const Rc = Ka.Mesh.extend((function () {
var e = new Ka.Geometry({
dynamic: !0,
attributes: {
color: new Ka.Geometry.Attribute("color", "float", 4, "COLOR"),
position: new Ka.Geometry.Attribute("position", "float", 3, "POSITION"),
size: new Ka.Geometry.Attribute("size", "float", 1),
prevPosition: new Ka.Geometry.Attribute("prevPosition", "float", 3),
prevSize: new Ka.Geometry.Attribute("prevSize", "float", 1)
}
});
Object.assign(e, Nc);
var t = new Ka.Material({
shader: Ka.createShader("ecgl.sdfSprite"),
transparent: !0,
depthMask: !1
});
t.enableTexture("sprite"),
t.define("both", "VERTEX_COLOR"),
t.define("both", "VERTEX_SIZE");
var r = new Ka.Texture2D({
image: document.createElement("canvas"),
flipY: !1
});
return t.set("sprite", r),
e.pick = this._pick.bind(this),
{
geometry: e,
material: t,
mode: Ka.Mesh.POINTS,
sizeScale: 1
}
}
), {
_pick: function (e, t, r, i, n, a) {
var o = this._positionNDC;
if (o)
for (var s = r.viewport, l = 2 / s.width, h = 2 / s.height, u = this.geometry.vertexCount - 1; u >= 0; u--) {
var c, d = o[2 * (c = this.geometry.indices ? this.geometry.indices[u] : u)], f = o[2 * c + 1], p = this.geometry.attributes.size.get(c) / this.sizeScale / 2;
if (e > d - p * l && e < d + p * l && t > f - p * h && t < f + p * h) {
var m = new Ka.Vector3
, g = new Ka.Vector3;
this.geometry.attributes.position.get(c, m.array),
Ka.Vector3.transformMat4(g, m, this.worldTransform),
a.push({
vertexIndex: c,
point: m,
pointWorld: g,
target: this,
distance: g.distance(i.getWorldPosition())
})
}
}
},
updateNDCPosition: function (e, t, r) {
var i = this._positionNDC
, n = this.geometry;
i && i.length / 2 === n.vertexCount || (i = this._positionNDC = new Float32Array(2 * n.vertexCount));
for (var a = Ic.create(), o = 0; o < n.vertexCount; o++)
n.attributes.position.get(o, a),
a[3] = 1,
Ic.transformMat4(a, a, e.array),
Ic.scale(a, a, 1 / a[3]),
i[2 * o] = a[0],
i[2 * o + 1] = a[1]
}
});
function Bc(e, t) {
this.rootNode = new Ka.Node,
this.is2D = e,
this._labelsBuilder = new Fh(256, 256, t),
this._labelsBuilder.getMesh().renderOrder = 100,
this.rootNode.add(this._labelsBuilder.getMesh()),
this._api = t,
this._spriteImageCanvas = document.createElement("canvas"),
this._startDataIndex = 0,
this._endDataIndex = 0,
this._sizeScale = 1
}
Bc.prototype = {
constructor: Bc,
highlightOnMouseover: !0,
update: function (e, t, r, i, n) {
var a = this._prevMesh;
this._prevMesh = this._mesh,
this._mesh = a;
var o = e.getData();
if (null == i && (i = 0),
null == n && (n = o.count()),
this._startDataIndex = i,
this._endDataIndex = n - 1,
!this._mesh) {
var s = this._prevMesh && this._prevMesh.material;
this._mesh = new Rc({
renderOrder: 10,
frustumCulling: !1
}),
s && (this._mesh.material = s)
}
s = this._mesh.material;
var l = this._mesh.geometry
, h = l.attributes;
this.rootNode.remove(this._prevMesh),
this.rootNode.add(this._mesh),
this._setPositionTextureToMesh(this._mesh, this._positionTexture);
var u = this._getSymbolInfo(e, i, n)
, c = r.getDevicePixelRatio()
, d = e.getModel("itemStyle").getItemStyle()
, f = e.get("large")
, p = 1;
u.maxSize > 2 ? (p = this._updateSymbolSprite(e, d, u, c),
s.enableTexture("sprite")) : s.disableTexture("sprite"),
h.position.init(n - i);
var m = [];
if (f) {
s.undefine("VERTEX_SIZE"),
s.undefine("VERTEX_COLOR");
var g = function (e) {
const t = e.getVisual("style");
if (t)
return t[e.getVisual("drawType")]
}(o)
, _ = function (e) {
return e.getVisual("style").opacity
}(o);
Ka.parseColor(g, m),
m[3] *= _,
s.set({
color: m,
u_Size: u.maxSize * this._sizeScale
})
} else
s.set({
color: [1, 1, 1, 1]
}),
s.define("VERTEX_SIZE"),
s.define("VERTEX_COLOR"),
h.size.init(n - i),
h.color.init(n - i),
this._originalOpacity = new Float32Array(n - i);
for (var v = o.getLayout("points"), y = h.position.value, x = 0; x < n - i; x++) {
var b = 3 * x
, w = 2 * x;
if (this.is2D ? (y[b] = v[w],
y[b + 1] = v[w + 1],
y[b + 2] = -10) : (y[b] = v[b],
y[b + 1] = v[b + 1],
y[b + 2] = v[b + 2]),
!f) {
g = Ih(o, x),
_ = Rh(o, x),
Ka.parseColor(g, m),
m[3] *= _,
h.color.set(x, m),
m[3];
var T = o.getItemVisual(x, "symbolSize");
T = T instanceof Array ? Math.max(T[0], T[1]) : T,
isNaN(T) && (T = 0),
h.size.value[x] = T * p * this._sizeScale,
this._originalOpacity[x] = m[3]
}
}
this._mesh.sizeScale = p,
l.updateBoundingBox(),
l.dirty(),
this._updateMaterial(e, d);
var S = e.coordinateSystem;
S && S.viewGL && s[S.viewGL.isLinearSpace() ? "define" : "undefine"]("fragment", "SRGB_DECODE"),
f || this._updateLabelBuilder(e, i, n),
this._updateHandler(e, t, r),
this._updateAnimation(e),
this._api = r
},
getPointsMesh: function () {
return this._mesh
},
updateLabels: function (e) {
this._labelsBuilder.updateLabels(e)
},
hideLabels: function () {
this.rootNode.remove(this._labelsBuilder.getMesh())
},
showLabels: function () {
this.rootNode.add(this._labelsBuilder.getMesh())
},
dispose: function () {
this._labelsBuilder.dispose()
},
_updateSymbolSprite: function (e, t, r, i) {
r.maxSize = Math.min(2 * r.maxSize, 200);
var n, a, o = [];
return r.aspect > 1 ? (o[0] = r.maxSize,
o[1] = r.maxSize / r.aspect) : (o[1] = r.maxSize,
o[0] = r.maxSize * r.aspect),
o[0] = o[0] || 1,
o[1] = o[1] || 1,
this._symbolType === r.type && (a = o,
(n = this._symbolSize) && a && n[0] === a[0] && n[1] === a[1]) && this._lineWidth === t.lineWidth || (Pc.createSymbolSprite(r.type, o, {
fill: "#fff",
lineWidth: t.lineWidth,
stroke: "transparent",
shadowColor: "transparent",
minMargin: Math.min(o[0] / 2, 10)
}, this._spriteImageCanvas),
Pc.createSDFFromCanvas(this._spriteImageCanvas, Math.min(this._spriteImageCanvas.width, 32), 20, this._mesh.material.get("sprite").image),
this._symbolType = r.type,
this._symbolSize = o,
this._lineWidth = t.lineWidth),
this._spriteImageCanvas.width / r.maxSize * i
},
_updateMaterial: function (e, t) {
var r = "lighter" === e.get("blendMode") ? Ka.additiveBlend : null
, i = this._mesh.material;
i.blend = r,
i.set("lineWidth", t.lineWidth / 20);
var n = Ka.parseColor(t.stroke);
i.set("strokeColor", n),
i.transparent = !0,
i.depthMask = !1,
i.depthTest = !this.is2D,
i.sortVertices = !this.is2D
},
_updateLabelBuilder: function (e, t, r) {
var i = e.getData()
, n = this._mesh.geometry
, a = n.attributes.position.value
, o = (t = this._startDataIndex,
this._mesh.sizeScale);
this._labelsBuilder.updateData(i, t, r),
this._labelsBuilder.getLabelPosition = function (e, r, i) {
var n = 3 * (e - t);
return [a[n], a[n + 1], a[n + 2]]
}
,
this._labelsBuilder.getLabelDistance = function (e, r, i) {
return n.attributes.size.get(e - t) / o / 2 + i
}
,
this._labelsBuilder.updateLabels()
},
_updateAnimation: function (e) {
Ka.updateVertexAnimation([["prevPosition", "position"], ["prevSize", "size"]], this._prevMesh, this._mesh, e)
},
_updateHandler: function (e, t, r) {
var i, n = e.getData(), a = this._mesh, o = this, s = -1, l = e.coordinateSystem && "cartesian3D" === e.coordinateSystem.type;
l && (i = e.coordinateSystem.model),
a.seriesIndex = e.seriesIndex,
a.off("mousemove"),
a.off("mouseout"),
a.on("mousemove", (function (t) {
var h = t.vertexIndex + o._startDataIndex;
h !== s && (this.highlightOnMouseover && (this.downplay(n, s),
this.highlight(n, h),
this._labelsBuilder.updateLabels([h])),
l && r.dispatchAction({
type: "grid3DShowAxisPointer",
value: [n.get(e.coordDimToDataDim("x")[0], h), n.get(e.coordDimToDataDim("y")[0], h), n.get(e.coordDimToDataDim("z")[0], h)],
grid3DIndex: i.componentIndex
})),
a.dataIndex = h,
s = h
}
), this),
a.on("mouseout", (function (e) {
var t = e.vertexIndex + o._startDataIndex;
this.highlightOnMouseover && (this.downplay(n, t),
this._labelsBuilder.updateLabels()),
s = -1,
a.dataIndex = -1,
l && r.dispatchAction({
type: "grid3DHideAxisPointer",
grid3DIndex: i.componentIndex
})
}
), this)
},
updateLayout: function (e, t, r) {
var i = e.getData();
if (this._mesh) {
var n = this._mesh.geometry.attributes.position.value
, a = i.getLayout("points");
if (this.is2D)
for (var o = 0; o < a.length / 2; o++) {
var s = 3 * o
, l = 2 * o;
n[s] = a[l],
n[s + 1] = a[l + 1],
n[s + 2] = -10
}
else
for (o = 0; o < a.length; o++)
n[o] = a[o];
this._mesh.geometry.dirty(),
r.getZr().refresh()
}
},
updateView: function (e) {
if (this._mesh) {
var t = new Ht;
Ht.mul(t, e.viewMatrix, this._mesh.worldTransform),
Ht.mul(t, e.projectionMatrix, t),
this._mesh.updateNDCPosition(t, this.is2D, this._api)
}
},
highlight: function (e, t) {
if (!(t > this._endDataIndex || t < this._startDataIndex)) {
var r = e.getItemModel(t).getModel("emphasis.itemStyle")
, n = r.get("color")
, a = r.get("opacity");
if (null == n) {
var o = Ih(e, t);
n = i.color.lift(o, -.4)
}
null == a && (a = Rh(e, t));
var s = Ka.parseColor(n);
s[3] *= a,
this._mesh.geometry.attributes.color.set(t - this._startDataIndex, s),
this._mesh.geometry.dirtyAttribute("color"),
this._api.getZr().refresh()
}
},
downplay: function (e, t) {
if (!(t > this._endDataIndex || t < this._startDataIndex)) {
var r = Ih(e, t)
, i = Rh(e, t)
, n = Ka.parseColor(r);
n[3] *= i,
this._mesh.geometry.attributes.color.set(t - this._startDataIndex, n),
this._mesh.geometry.dirtyAttribute("color"),
this._api.getZr().refresh()
}
},
fadeOutAll: function (e) {
if (this._originalOpacity) {
for (var t = this._mesh.geometry, r = 0; r < t.vertexCount; r++) {
var i = this._originalOpacity[r] * e;
t.attributes.color.value[4 * r + 3] = i
}
t.dirtyAttribute("color"),
this._api.getZr().refresh()
}
},
fadeInAll: function () {
this.fadeOutAll(1)
},
setPositionTexture: function (e) {
this._mesh && this._setPositionTextureToMesh(this._mesh, e),
this._positionTexture = e
},
removePositionTexture: function () {
this._positionTexture = null,
this._mesh && this._setPositionTextureToMesh(this._mesh, null)
},
setSizeScale: function (e) {
if (e !== this._sizeScale) {
if (this._mesh) {
var t = this._mesh.material.get("u_Size");
this._mesh.material.set("u_Size", t / this._sizeScale * e);
var r = this._mesh.geometry.attributes;
if (r.size.value)
for (var i = 0; i < r.size.value.length; i++)
r.size.value[i] = r.size.value[i] / this._sizeScale * e
}
this._sizeScale = e
}
},
_setPositionTextureToMesh: function (e, t) {
t && e.material.set("positionTexture", t),
e.material[t ? "enableTexture" : "disableTexture"]("positionTexture")
},
_getSymbolInfo: function (e, t, r) {
if (e.get("large"))
return (h = Mn(e.get("symbolSize"), 1)) instanceof Array ? (o = Math.max(h[0], h[1]),
i = h[0] / h[1]) : (o = h,
i = 1),
{
maxSize: h,
type: e.get("symbol"),
aspect: i
};
for (var i, n = e.getData(), a = n.getItemVisual(0, "symbol") || "circle", o = 0, s = t; s < r; s++) {
var l, h = n.getItemVisual(s, "symbolSize"), u = n.getItemVisual(s, "symbol");
if (h instanceof Array)
l = h[0] / h[1],
o = Math.max(Math.max(h[0], h[1]), o);
else {
if (isNaN(h))
continue;
l = 1,
o = Math.max(h, o)
}
a = u,
i = l
}
return {
maxSize: o,
type: a,
aspect: i
}
}
};
const Fc = Bc
, zc = i.ChartView.extend({
type: "scatter3D",
hasSymbolVisual: !0,
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._pointsBuilderList = [],
this._currentStep = 0
},
render: function (e, t, r) {
if (this.groupGL.removeAll(),
e.getData().count()) {
var i = e.coordinateSystem;
if (i && i.viewGL) {
i.viewGL.add(this.groupGL),
this._camera = i.viewGL.camera;
var n = this._pointsBuilderList[0];
n || (n = this._pointsBuilderList[0] = new Fc(!1, r)),
this._pointsBuilderList.length = 1,
this.groupGL.add(n.rootNode),
n.update(e, t, r),
n.updateView(i.viewGL.camera)
}
}
},
incrementalPrepareRender: function (e, t, r) {
var i = e.coordinateSystem;
i && i.viewGL && (i.viewGL.add(this.groupGL),
this._camera = i.viewGL.camera),
this.groupGL.removeAll(),
this._currentStep = 0
},
incrementalRender: function (e, t, r, i) {
if (!(e.end <= e.start)) {
var n = this._pointsBuilderList[this._currentStep];
n || (n = new Fc(!1, i),
this._pointsBuilderList[this._currentStep] = n),
this.groupGL.add(n.rootNode),
n.update(t, r, i, e.start, e.end),
n.updateView(t.coordinateSystem.viewGL.camera),
this._currentStep++
}
},
updateCamera: function () {
this._pointsBuilderList.forEach((function (e) {
e.updateView(this._camera)
}
), this)
},
highlight: function (e, t, r, i) {
this._toggleStatus("highlight", e, t, r, i)
},
downplay: function (e, t, r, i) {
this._toggleStatus("downplay", e, t, r, i)
},
_toggleStatus: function (e, t, r, n, a) {
var o = t.getData()
, s = An(o, a)
, l = "highlight" === e;
null != s ? i.util.each(ac.normalizeToArray(s), (function (e) {
for (var t = 0; t < this._pointsBuilderList.length; t++) {
var r = this._pointsBuilderList[t];
l ? r.highlight(o, e) : r.downplay(o, e)
}
}
), this) : o.each((function (e) {
for (var t = 0; t < this._pointsBuilderList.length; t++) {
var r = this._pointsBuilderList[t];
l ? r.highlight(o, e) : r.downplay(o, e)
}
}
))
},
dispose: function () {
this._pointsBuilderList.forEach((function (e) {
e.dispose()
}
)),
this.groupGL.removeAll()
},
remove: function () {
this.groupGL.removeAll()
}
});
(0,
i.use)((function (e) {
e.registerChartView(zc),
e.registerSeriesModel(Cc),
e.registerLayout({
seriesType: "scatter3D",
reset: function (e) {
var t = e.coordinateSystem;
if (t) {
var r = t.dimensions;
if (r.length < 3)
return;
var i = r.map((function (t) {
return e.coordDimToDataDim(t)[0]
}
))
, n = []
, a = [];
return {
progress: function (e, r) {
for (var o = new Float32Array(3 * (e.end - e.start)), s = e.start; s < e.end; s++) {
var l = 3 * (s - e.start);
n[0] = r.get(i[0], s),
n[1] = r.get(i[1], s),
n[2] = r.get(i[2], s),
t.dataToPoint(n, a),
o[l] = a[0],
o[l + 1] = a[1],
o[l + 2] = a[2]
}
r.setLayout("points", o)
}
}
}
}
})
}
));
var Gc = Po.vec3
, Uc = Po.vec2
, kc = Gc.normalize
, Vc = Gc.cross
, Hc = Gc.sub
, Wc = Gc.add
, jc = Gc.create
, Xc = jc()
, qc = jc()
, Zc = jc()
, Yc = jc()
, Kc = []
, Qc = [];
function Jc(e, t) {
Uc.copy(Kc, e[0]),
Uc.copy(Qc, e[1]);
var r = []
, i = r[0] = jc()
, n = r[1] = jc()
, a = r[2] = jc()
, o = r[3] = jc();
t.dataToPoint(Kc, i),
t.dataToPoint(Qc, o),
kc(Xc, i),
Hc(qc, o, i),
kc(qc, qc),
Vc(Zc, qc, Xc),
kc(Zc, Zc),
Vc(qc, Xc, Zc),
Wc(n, Xc, qc),
kc(n, n),
kc(Xc, o),
Hc(qc, i, o),
kc(qc, qc),
Vc(Zc, qc, Xc),
kc(Zc, Zc),
Vc(qc, Xc, Zc),
Wc(a, Xc, qc),
kc(a, a),
Wc(Yc, i, o),
kc(Yc, Yc);
var s = Gc.dot(i, Yc)
, l = Gc.dot(Yc, n)
, h = (Math.max(Gc.len(i), Gc.len(o)) - s) / l * 2;
return Gc.scaleAndAdd(n, i, n, h),
Gc.scaleAndAdd(a, o, a, h),
r
}
function $c(e, t) {
for (var r = new Float32Array(3 * e.length), i = 0, n = [], a = 0; a < e.length; a++)
t.dataToPoint(e[a], n),
r[i++] = n[0],
r[i++] = n[1],
r[i++] = n[2];
return r
}
function ed(e) {
var t = [];
return e.each((function (r) {
var i = e.getItemModel(r)
, n = i.option instanceof Array ? i.option : i.getShallow("coords", !0);
t.push(n)
}
)),
{
coordsList: t
}
}
function td(e, t, r) {
var i = e.getData()
, n = e.get("polyline")
, a = ed(i);
i.setLayout("lineType", n ? "polyline" : "cubicBezier"),
i.each((function (e) {
var o = a.coordsList[e]
, s = n ? $c(o, t) : function (e, t, r) {
var i = []
, n = i[0] = Gc.create()
, a = i[1] = Gc.create()
, o = i[2] = Gc.create()
, s = i[3] = Gc.create();
t.dataToPoint(e[0], n),
t.dataToPoint(e[1], s);
var l = Gc.dist(n, s);
return Gc.lerp(a, n, s, .3),
Gc.lerp(o, n, s, .3),
Gc.scaleAndAdd(a, a, r, Math.min(.1 * l, 10)),
Gc.scaleAndAdd(o, o, r, Math.min(.1 * l, 10)),
i
}(o, t, r);
i.setItemLayout(e, s)
}
))
}
function rd(e, t) {
e.eachSeriesByType("lines3D", (function (e) {
var t = e.coordinateSystem;
"globe" === t.type ? function (e, t) {
var r = e.getData()
, i = e.get("polyline");
r.setLayout("lineType", i ? "polyline" : "cubicBezier");
var n = ed(r);
r.each((function (e) {
var a = n.coordsList[e]
, o = i ? $c : Jc;
r.setItemLayout(e, o(a, t))
}
))
}(e, t) : "geo3D" === t.type ? td(e, t, [0, 1, 0]) : "mapbox3D" !== t.type && "maptalks3D" !== t.type || td(e, t, [0, 0, 1])
}
))
}
const id = i.SeriesModel.extend({
type: "series.lines3D",
dependencies: ["globe"],
visualStyleAccessPath: "lineStyle",
visualDrawType: "stroke",
getInitialData: function (e, t) {
var r = new i.List(["value"], this);
return r.hasItemOption = !1,
r.initData(e.data, [], (function (e, t, i, n) {
if (e instanceof Array)
return NaN;
r.hasItemOption = !0;
var a = e.value;
return null != a ? a instanceof Array ? a[n] : a : void 0
}
)),
r
},
defaultOption: {
coordinateSystem: "globe",
globeIndex: 0,
geo3DIndex: 0,
zlevel: -10,
polyline: !1,
effect: {
show: !1,
period: 4,
trailWidth: 4,
trailLength: .2,
spotIntensity: 6
},
silent: !0,
blendMode: "source-over",
lineStyle: {
width: 1,
opacity: .5
}
}
});
var nd = Po.vec3;
Ka.Shader.import("@export ecgl.trail2.vertex\nattribute vec3 position: POSITION;\nattribute vec3 positionPrev;\nattribute vec3 positionNext;\nattribute float offset;\nattribute float dist;\nattribute float distAll;\nattribute float start;\n\nattribute vec4 a_Color : COLOR;\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\nuniform float near : NEAR;\n\nuniform float speed : 0;\nuniform float trailLength: 0.3;\nuniform float time;\nuniform float period: 1000;\n\nuniform float spotSize: 1;\n\nvarying vec4 v_Color;\nvarying float v_Percent;\nvarying float v_SpotPercent;\n\n@import ecgl.common.wireframe.vertexHeader\n\n@import ecgl.lines3D.clipNear\n\nvoid main()\n{\n @import ecgl.lines3D.expandLine\n\n gl_Position = currProj;\n\n v_Color = a_Color;\n\n @import ecgl.common.wireframe.vertexMain\n\n#ifdef CONSTANT_SPEED\n float t = mod((speed * time + start) / distAll, 1. + trailLength) - trailLength;\n#else\n float t = mod((time + start) / period, 1. + trailLength) - trailLength;\n#endif\n\n float trailLen = distAll * trailLength;\n\n v_Percent = (dist - t * distAll) / trailLen;\n\n v_SpotPercent = spotSize / distAll;\n\n }\n@end\n\n\n@export ecgl.trail2.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\nuniform float spotIntensity: 5;\n\nvarying vec4 v_Color;\nvarying float v_Percent;\nvarying float v_SpotPercent;\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.util.srgb\n\nvoid main()\n{\n if (v_Percent > 1.0 || v_Percent < 0.0) {\n discard;\n }\n\n float fade = v_Percent;\n\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color * v_Color);\n#else\n gl_FragColor = color * v_Color;\n#endif\n\n @import ecgl.common.wireframe.fragmentMain\n\n if (v_Percent > (1.0 - v_SpotPercent)) {\n gl_FragColor.rgb *= spotIntensity;\n }\n\n gl_FragColor.a *= fade;\n}\n\n@end");
const ad = Ka.Mesh.extend((function () {
var e = new Ka.Material({
shader: new Ka.Shader(Ka.Shader.source("ecgl.trail2.vertex"), Ka.Shader.source("ecgl.trail2.fragment")),
transparent: !0,
depthMask: !1
})
, t = new Ro({
dynamic: !0
});
return t.createAttribute("dist", "float", 1),
t.createAttribute("distAll", "float", 1),
t.createAttribute("start", "float", 1),
{
geometry: t,
material: e,
culling: !1,
$ignorePicking: !0
}
}
), {
updateData: function (e, t, r) {
var i = e.hostModel
, n = this.geometry
, a = i.getModel("effect")
, o = a.get("trailWidth") * t.getDevicePixelRatio()
, s = a.get("trailLength")
, l = i.get("effect.constantSpeed")
, h = 1e3 * i.get("effect.period")
, u = null != l;
u ? this.material.set("speed", l / 1e3) : this.material.set("period", h),
this.material[u ? "define" : "undefine"]("vertex", "CONSTANT_SPEED");
var c = i.get("polyline");
n.trailLength = s,
this.material.set("trailLength", s),
n.resetOffset(),
["position", "positionPrev", "positionNext"].forEach((function (e) {
n.attributes[e].value = r.attributes[e].value
}
)),
["dist", "distAll", "start", "offset", "color"].forEach((function (e) {
n.attributes[e].init(n.vertexCount)
}
)),
n.indices = r.indices;
var d = []
, f = a.get("trailColor")
, p = a.get("trailOpacity")
, m = null != f
, g = null != p;
this.updateWorldTransform();
var _ = this.worldTransform.x.len()
, v = this.worldTransform.y.len()
, y = this.worldTransform.z.len()
, x = 0
, b = 0;
e.each((function (t) {
var i = e.getItemLayout(t)
, a = g ? p : Rh(e, t)
, s = Ih(e, t);
null == a && (a = 1),
(d = Ka.parseColor(m ? f : s, d))[3] *= a;
for (var l = c ? r.getPolylineVertexCount(i) : r.getCubicCurveVertexCount(i[0], i[1], i[2], i[3]), w = 0, T = [], S = [], M = x; M < x + l; M++)
n.attributes.position.get(M, T),
T[0] *= _,
T[1] *= v,
T[2] *= y,
M > x && (w += nd.dist(T, S)),
n.attributes.dist.set(M, w),
nd.copy(S, T);
b = Math.max(b, w);
var A = Math.random() * (u ? w : h);
for (M = x; M < x + l; M++)
n.attributes.distAll.set(M, w),
n.attributes.start.set(M, A),
n.attributes.offset.set(M, (r.attributes.offset.get(M) > 0 ? 1 : -1) * o / 2),
n.attributes.color.set(M, d);
x += l
}
)),
this.material.set("spotSize", .1 * b * s),
this.material.set("spotIntensity", a.get("spotIntensity")),
n.dirty()
},
setAnimationTime: function (e) {
this.material.set("time", e)
}
});
Ka.Shader.import(is);
const od = i.ChartView.extend({
type: "lines3D",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._meshLinesMaterial = new Ka.Material({
shader: Ka.createShader("ecgl.meshLines3D"),
transparent: !0,
depthMask: !1
}),
this._linesMesh = new Ka.Mesh({
geometry: new Ro,
material: this._meshLinesMaterial,
$ignorePicking: !0
}),
this._trailMesh = new ad
},
render: function (e, t, r) {
this.groupGL.add(this._linesMesh);
var i = e.coordinateSystem
, n = e.getData();
if (i && i.viewGL) {
i.viewGL.add(this.groupGL),
this._updateLines(e, t, r);
var a = i.viewGL.isLinearSpace() ? "define" : "undefine";
this._linesMesh.material[a]("fragment", "SRGB_DECODE"),
this._trailMesh.material[a]("fragment", "SRGB_DECODE")
}
var o = this._trailMesh;
if (o.stopAnimation(),
e.get("effect.show")) {
this.groupGL.add(o),
o.updateData(n, r, this._linesMesh.geometry),
o.__time = o.__time || 0;
var s = 36e5;
this._curveEffectsAnimator = o.animate("", {
loop: !0
}).when(s, {
__time: s
}).during((function () {
o.setAnimationTime(o.__time)
}
)).start()
} else
this.groupGL.remove(o),
this._curveEffectsAnimator = null;
this._linesMesh.material.blend = this._trailMesh.material.blend = "lighter" === e.get("blendMode") ? Ka.additiveBlend : null
},
pauseEffect: function () {
this._curveEffectsAnimator && this._curveEffectsAnimator.pause()
},
resumeEffect: function () {
this._curveEffectsAnimator && this._curveEffectsAnimator.resume()
},
toggleEffect: function () {
var e = this._curveEffectsAnimator;
e && (e.isPaused() ? e.resume() : e.pause())
},
_updateLines: function (e, t, r) {
var i = e.getData()
, n = e.coordinateSystem
, a = this._linesMesh.geometry
, o = e.get("polyline");
a.expandLine = !0;
var s = function (e) {
return null != e.radius ? e.radius : null != e.size ? Math.max(e.size[0], e.size[1], e.size[2]) : 100
}(n);
a.segmentScale = s / 20;
var l = "lineStyle.width".split(".")
, h = r.getDevicePixelRatio()
, u = 0;
i.each((function (e) {
var t = i.getItemModel(e).get(l);
null == t && (t = 1),
i.setItemVisual(e, "lineWidth", t),
u = Math.max(t, u)
}
)),
a.useNativeLine = !1;
var c = 0
, d = 0;
i.each((function (e) {
var t = i.getItemLayout(e);
o ? (c += a.getPolylineVertexCount(t),
d += a.getPolylineTriangleCount(t)) : (c += a.getCubicCurveVertexCount(t[0], t[1], t[2], t[3]),
d += a.getCubicCurveTriangleCount(t[0], t[1], t[2], t[3]))
}
)),
a.setVertexCount(c),
a.setTriangleCount(d),
a.resetOffset();
var f = [];
i.each((function (e) {
var t = i.getItemLayout(e)
, r = Ih(i, e)
, n = Rh(i, e)
, s = i.getItemVisual(e, "lineWidth") * h;
null == n && (n = 1),
(f = Ka.parseColor(r, f))[3] *= n,
o ? a.addPolyline(t, f, s) : a.addCubicCurve(t[0], t[1], t[2], t[3], f, s)
}
)),
a.dirty()
},
remove: function () {
this.groupGL.removeAll()
},
dispose: function () {
this.groupGL.removeAll()
}
});
function sd(e, t) {
for (var r = [], i = 0; i < t.length; i++)
r.push(e.dataToPoint(t[i]));
return r
}
(0,
i.use)((function (e) {
e.registerChartView(od),
e.registerSeriesModel(id),
e.registerLayout(rd),
e.registerAction({
type: "lines3DPauseEffect",
event: "lines3deffectpaused",
update: "series.lines3D:pauseEffect"
}, (function () { }
)),
e.registerAction({
type: "lines3DResumeEffect",
event: "lines3deffectresumed",
update: "series.lines3D:resumeEffect"
}, (function () { }
)),
e.registerAction({
type: "lines3DToggleEffect",
event: "lines3deffectchanged",
update: "series.lines3D:toggleEffect"
}, (function () { }
))
}
));
var ld = i.SeriesModel.extend({
type: "series.polygons3D",
getRegionModel: function (e) {
return this.getData().getItemModel(e)
},
getRegionPolygonCoords: function (e) {
var t = this.coordinateSystem
, r = this.getData().getItemModel(e)
, i = r.option instanceof Array ? r.option : r.getShallow("coords");
r.get("multiPolygon") || (i = [i]);
for (var n = [], a = 0; a < i.length; a++) {
for (var o = [], s = 1; s < i[a].length; s++)
o.push(sd(t, i[a][s]));
n.push({
exterior: sd(t, i[a][0]),
interiors: o
})
}
return n
},
getInitialData: function (e) {
var t = new i.List(["value"], this);
return t.hasItemOption = !1,
t.initData(e.data, [], (function (e, r, i, n) {
if (e instanceof Array)
return NaN;
t.hasItemOption = !0;
var a = e.value;
return null != a ? a instanceof Array ? a[n] : a : void 0
}
)),
t
},
defaultOption: {
show: !0,
data: null,
multiPolygon: !1,
progressiveThreshold: 1e3,
progressive: 1e3,
zlevel: -10,
label: {
show: !1,
distance: 2,
textStyle: {
fontSize: 20,
color: "#000",
backgroundColor: "rgba(255,255,255,0.7)",
padding: 3,
borderRadius: 4
}
},
itemStyle: {
color: "#fff",
borderWidth: 0,
borderColor: "#333"
},
emphasis: {
itemStyle: {
color: "#639fc0"
},
label: {
show: !0
}
}
}
});
i.util.merge(ld.prototype, Kl);
const hd = ld
, ud = i.ChartView.extend({
type: "polygons3D",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this._geo3DBuilderList = [],
this._currentStep = 0
},
render: function (e, t, r) {
this.groupGL.removeAll();
var i = e.coordinateSystem;
i && i.viewGL && i.viewGL.add(this.groupGL);
var n = this._geo3DBuilderList[0];
n || ((n = new Uh(r)).extrudeY = "mapbox3D" !== i.type && "maptalks3D" !== i.type,
this._geo3DBuilderList[0] = n),
this._updateShaderDefines(i, n),
n.update(e, t, r),
this._geo3DBuilderList.length = 1,
this.groupGL.add(n.rootNode)
},
incrementalPrepareRender: function (e, t, r) {
this.groupGL.removeAll();
var i = e.coordinateSystem;
i && i.viewGL && i.viewGL.add(this.groupGL),
this._currentStep = 0
},
incrementalRender: function (e, t, r, i) {
var n = this._geo3DBuilderList[this._currentStep]
, a = t.coordinateSystem;
n || ((n = new Uh(i)).extrudeY = "mapbox3D" !== a.type && "maptalks3D" !== a.type,
this._geo3DBuilderList[this._currentStep] = n),
n.update(t, r, i, e.start, e.end),
this.groupGL.add(n.rootNode),
this._updateShaderDefines(a, n),
this._currentStep++
},
_updateShaderDefines: function (e, t) {
var r = e.viewGL.isLinearSpace() ? "define" : "undefine";
t.rootNode.traverse((function (t) {
t.material && (t.material[r]("fragment", "SRGB_DECODE"),
"mapbox3D" !== e.type && "maptalks3D" !== e.type || (t.material.define("fragment", "NORMAL_UP_AXIS", 2),
t.material.define("fragment", "NORMAL_FRONT_AXIS", 1)))
}
))
},
remove: function () {
this.groupGL.removeAll()
},
dispose: function () {
this.groupGL.removeAll(),
this._geo3DBuilderList.forEach((function (e) {
e.dispose()
}
))
}
});
(0,
i.use)((function (e) {
e.registerChartView(ud),
e.registerSeriesModel(hd)
}
));
var cd = i.SeriesModel.extend({
type: "series.surface",
dependencies: ["globe", "grid3D", "geo3D"],
visualStyleAccessPath: "itemStyle",
formatTooltip: function (e) {
return oc(this, e)
},
getInitialData: function (e, t) {
var r = e.data;
function n(e) {
return !(isNaN(e.min) || isNaN(e.max) || isNaN(e.step))
}
function a(e) {
var t = i.number.getPrecisionSafe;
return Math.max(t(e.min), t(e.max), t(e.step)) + 1
}
if (!r)
if (e.parametric) {
var o = e.parametricEquation || {}
, s = o.u || {}
, l = o.v || {};
["u", "v"].forEach((function (e) {
n(o[e])
}
)),
["x", "y", "z"].forEach((function (e) {
o[e]
}
));
var h = Math.floor((s.max + s.step - s.min) / s.step)
, u = Math.floor((l.max + l.step - l.min) / l.step);
r = new Float32Array(h * u * 5);
var c = a(s)
, d = a(l);
for (S = 0,
M = 0; M < u; M++)
for (A = 0; A < h; A++) {
var f = A * s.step + s.min
, p = M * l.step + l.min
, m = i.number.round(Math.min(f, s.max), c)
, g = i.number.round(Math.min(p, l.max), d);
E = o.x(m, g),
C = o.y(m, g),
P = o.z(m, g),
r[S++] = E,
r[S++] = C,
r[S++] = P,
r[S++] = m,
r[S++] = g
}
} else {
var _ = e.equation || {}
, v = _.x || {}
, y = _.y || {};
if (["x", "y"].forEach((function (e) {
n(_[e])
}
)),
"function" != typeof _.z)
return;
var x = Math.floor((v.max + v.step - v.min) / v.step)
, b = Math.floor((y.max + y.step - y.min) / y.step);
r = new Float32Array(x * b * 3);
for (var w = a(v), T = a(y), S = 0, M = 0; M < b; M++)
for (var A = 0; A < x; A++) {
var E = A * v.step + v.min
, C = M * y.step + y.min
, D = i.number.round(Math.min(E, v.max), w)
, L = i.number.round(Math.min(C, y.max), T)
, P = _.z(D, L);
r[S++] = D,
r[S++] = L,
r[S++] = P
}
}
var O = ["x", "y", "z"];
return e.parametric && O.push("u", "v"),
sc(this, O, r)
},
defaultOption: {
coordinateSystem: "cartesian3D",
zlevel: -10,
grid3DIndex: 0,
shading: "lambert",
parametric: !1,
wireframe: {
show: !0,
lineStyle: {
color: "rgba(0,0,0,0.5)",
width: 1
}
},
equation: {
x: {
min: -1,
max: 1,
step: .1
},
y: {
min: -1,
max: 1,
step: .1
},
z: null
},
parametricEquation: {
u: {
min: -1,
max: 1,
step: .1
},
v: {
min: -1,
max: 1,
step: .1
},
x: null,
y: null,
z: null
},
dataShape: null,
itemStyle: {},
animationDurationUpdate: 500
}
});
i.util.merge(cd.prototype, Kl);
const dd = cd;
var fd = Po.vec3;
const pd = i.ChartView.extend({
type: "surface",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node
},
render: function (e, t, r) {
var i = this._prevSurfaceMesh;
this._prevSurfaceMesh = this._surfaceMesh,
this._surfaceMesh = i,
this._surfaceMesh || (this._surfaceMesh = this._createSurfaceMesh()),
this.groupGL.remove(this._prevSurfaceMesh),
this.groupGL.add(this._surfaceMesh);
var n = e.coordinateSystem
, a = e.get("shading")
, o = e.getData()
, s = "ecgl." + a;
if (this._surfaceMesh.material && this._surfaceMesh.material.shader.name === s || (this._surfaceMesh.material = Ka.createMaterial(s, ["VERTEX_COLOR", "DOUBLE_SIDED"])),
Ka.setMaterialFromModel(a, this._surfaceMesh.material, e, r),
n && n.viewGL) {
n.viewGL.add(this.groupGL);
var l = n.viewGL.isLinearSpace() ? "define" : "undefine";
this._surfaceMesh.material[l]("fragment", "SRGB_DECODE")
}
var h = e.get("parametric")
, u = e.get("dataShape");
u || (u = this._getDataShape(o, h));
var c = e.getModel("wireframe")
, d = c.get("lineStyle.width")
, f = c.get("show") && d > 0;
this._updateSurfaceMesh(this._surfaceMesh, e, u, f);
var p = this._surfaceMesh.material;
f ? (p.define("WIREFRAME_QUAD"),
p.set("wireframeLineWidth", d),
p.set("wireframeLineColor", Ka.parseColor(c.get("lineStyle.color")))) : p.undefine("WIREFRAME_QUAD"),
this._initHandler(e, r),
this._updateAnimation(e)
},
_updateAnimation: function (e) {
Ka.updateVertexAnimation([["prevPosition", "position"], ["prevNormal", "normal"]], this._prevSurfaceMesh, this._surfaceMesh, e)
},
_createSurfaceMesh: function () {
var e = new Ka.Mesh({
geometry: new Ka.Geometry({
dynamic: !0,
sortTriangles: !0
}),
shadowDepthMaterial: new Ka.Material({
shader: new Ka.Shader(Ka.Shader.source("ecgl.sm.depth.vertex"), Ka.Shader.source("ecgl.sm.depth.fragment"))
}),
culling: !1,
renderOrder: 10,
renderNormal: !0
});
return e.geometry.createAttribute("barycentric", "float", 4),
e.geometry.createAttribute("prevPosition", "float", 3),
e.geometry.createAttribute("prevNormal", "float", 3),
Object.assign(e.geometry, Nh),
e
},
_initHandler: function (e, t) {
var r = e.getData()
, i = this._surfaceMesh
, n = e.coordinateSystem;
i.seriesIndex = e.seriesIndex;
var a = -1;
i.off("mousemove"),
i.off("mouseout"),
i.on("mousemove", (function (e) {
var o = function (e, t) {
for (var r = 1 / 0, n = -1, a = [], o = 0; o < e.length; o++) {
i.geometry.attributes.position.get(e[o], a);
var s = fd.dist(t.array, a);
s < r && (r = s,
n = e[o])
}
return n
}(e.triangle, e.point);
if (o >= 0) {
var s = [];
i.geometry.attributes.position.get(o, s);
for (var l = n.pointToData(s), h = 1 / 0, u = -1, c = [], d = 0; d < r.count(); d++) {
c[0] = r.get("x", d),
c[1] = r.get("y", d),
c[2] = r.get("z", d);
var f = fd.squaredDistance(c, l);
f < h && (u = d,
h = f)
}
u !== a && t.dispatchAction({
type: "grid3DShowAxisPointer",
value: l
}),
a = u,
i.dataIndex = u
} else
i.dataIndex = -1
}
), this),
i.on("mouseout", (function (e) {
a = -1,
i.dataIndex = -1,
t.dispatchAction({
type: "grid3DHideAxisPointer"
})
}
), this)
},
_updateSurfaceMesh: function (e, t, r, i) {
var n = e.geometry
, a = t.getData()
, o = a.getLayout("points")
, s = 0;
a.each((function (e) {
a.hasValue(e) || s++
}
));
var l = s || i
, h = n.attributes.position
, u = n.attributes.normal
, c = n.attributes.texcoord0
, d = n.attributes.barycentric
, f = n.attributes.color
, p = r[0]
, m = r[1]
, g = "color" !== t.get("shading");
if (l) {
var _ = (p - 1) * (m - 1) * 4;
h.init(_),
i && d.init(_)
} else
h.value = new Float32Array(o);
f.init(n.vertexCount),
c.init(n.vertexCount);
var v, y = [0, 3, 1, 1, 3, 2], x = [[1, 1, 0, 0], [0, 1, 0, 1], [1, 0, 0, 1], [1, 0, 1, 0]], b = n.indices = new (n.vertexCount > 65535 ? Uint32Array : Uint16Array)((p - 1) * (m - 1) * 6), w = function (e, t, r) {
r[1] = e * m + t,
r[0] = e * m + t + 1,
r[3] = (e + 1) * m + t + 1,
r[2] = (e + 1) * m + t
}, T = !1;
if (l) {
var S = []
, M = []
, A = 0;
g ? u.init(n.vertexCount) : u.value = null;
for (var E = [[], [], []], C = [], D = [], L = fd.create(), P = function (e, t, r) {
var i = 3 * t;
return r[0] = e[i],
r[1] = e[i + 1],
r[2] = e[i + 2],
r
}, O = new Float32Array(o.length), N = new Float32Array(o.length / 3 * 4), I = 0; I < a.count(); I++)
if (a.hasValue(I)) {
var R = Ka.parseColor(Ih(a, I));
null != (X = Rh(a, I)) && (R[3] *= X),
R[3] < .99 && (T = !0);
for (var B = 0; B < 4; B++)
N[4 * I + B] = R[B]
}
var F = [1e7, 1e7, 1e7];
for (I = 0; I < p - 1; I++)
for (var z = 0; z < m - 1; z++) {
var G = 4 * (I * (m - 1) + z);
w(I, z, S);
var U = !1;
for (B = 0; B < 4; B++)
P(o, S[B], M),
v = M,
(isNaN(v[0]) || isNaN(v[1]) || isNaN(v[2])) && (U = !0);
for (B = 0; B < 4; B++)
U ? h.set(G + B, F) : (P(o, S[B], M),
h.set(G + B, M)),
i && d.set(G + B, x[B]);
for (B = 0; B < 6; B++)
b[A++] = y[B] + G;
if (g && !U)
for (B = 0; B < 2; B++) {
for (var k = 3 * B, V = 0; V < 3; V++)
P(o, j = S[y[k] + V], E[V]);
for (fd.sub(C, E[0], E[1]),
fd.sub(D, E[1], E[2]),
fd.cross(L, C, D),
V = 0; V < 3; V++) {
var H = 3 * S[y[k] + V];
O[H] = O[H] + L[0],
O[H + 1] = O[H + 1] + L[1],
O[H + 2] = O[H + 2] + L[2]
}
}
}
if (g)
for (I = 0; I < O.length / 3; I++)
P(O, I, L),
fd.normalize(L, L),
O[3 * I] = L[0],
O[3 * I + 1] = L[1],
O[3 * I + 2] = L[2];
R = [];
var W = [];
for (I = 0; I < p - 1; I++)
for (z = 0; z < m - 1; z++)
for (G = 4 * (I * (m - 1) + z),
w(I, z, S),
B = 0; B < 4; B++) {
for (V = 0; V < 4; V++)
R[V] = N[4 * S[B] + V];
f.set(G + B, R),
g && (P(O, S[B], L),
u.set(G + B, L));
var j = S[B];
W[0] = j % m / (m - 1),
W[1] = Math.floor(j / m) / (p - 1),
c.set(G + B, W)
}
} else {
for (W = [],
I = 0; I < a.count(); I++) {
var X;
W[0] = I % m / (m - 1),
W[1] = Math.floor(I / m) / (p - 1),
R = Ka.parseColor(Ih(a, I)),
null != (X = Rh(a, I)) && (R[3] *= X),
R[3] < .99 && (T = !0),
f.set(I, R),
c.set(I, W)
}
S = [];
var q = 0;
for (I = 0; I < p - 1; I++)
for (z = 0; z < m - 1; z++)
for (w(I, z, S),
B = 0; B < 6; B++)
b[q++] = S[y[B]];
g ? n.generateVertexNormals() : u.value = null
}
e.material.get("normalMap") && n.generateTangents(),
n.updateBoundingBox(),
n.dirty(),
e.material.transparent = T,
e.material.depthMask = !T
},
_getDataShape: function (e, t) {
for (var r = -1 / 0, i = 0, n = 0, a = !1, o = t ? "u" : "x", s = e.count(), l = 0; l < s; l++) {
var h = e.get(o, l);
h < r && (n = 0,
i++),
r = h,
n++
}
if (i && 1 !== n || (a = !0),
!a)
return [i + 1, n];
for (var u = Math.floor(Math.sqrt(s)); u > 0;) {
if (Math.floor(s / u) === s / u)
return [u, s / u];
u--
}
return [u = Math.floor(Math.sqrt(s)), u]
},
dispose: function () {
this.groupGL.removeAll()
},
remove: function () {
this.groupGL.removeAll()
}
});
function md(e, t) {
for (var r = [], i = 0; i < t.length; i++)
r.push(e.dataToPoint(t[i]));
return r
}
(0,
i.use)((function (e) {
e.registerChartView(pd),
e.registerSeriesModel(dd),
e.registerLayout((function (e, t) {
e.eachSeriesByType("surface", (function (e) {
var t = e.coordinateSystem;
t && t.type;
var r = e.getData()
, i = new Float32Array(3 * r.count())
, n = [NaN, NaN, NaN];
if (t && "cartesian3D" === t.type) {
var a = t.dimensions.map((function (t) {
return e.coordDimToDataDim(t)[0]
}
));
r.each(a, (function (e, a, o, s) {
var l;
l = r.hasValue(s) ? t.dataToPoint([e, a, o]) : n,
i[3 * s] = l[0],
i[3 * s + 1] = l[1],
i[3 * s + 2] = l[2]
}
))
}
r.setLayout("points", i)
}
))
}
))
}
));
var gd = i.SeriesModel.extend({
type: "series.map3D",
layoutMode: "box",
coordinateSystem: null,
visualStyleAccessPath: "itemStyle",
optionUpdated: function (e) {
e = e || {};
var t = this.get("coordinateSystem");
null != t && "geo3D" !== t && (this.get("groundPlane.show") && (this.option.groundPlane.show = !1),
this._geo = null)
},
getInitialData: function (e) {
e.data = this.getFilledRegions(e.data, e.map);
var t = i.helper.createDimensions(e.data, {
coordDimensions: ["value"]
})
, r = new i.List(t, this);
r.initData(e.data);
var n = {};
return r.each((function (e) {
var t = r.getName(e)
, i = r.getItemModel(e);
n[t] = i
}
)),
this._regionModelMap = n,
r
},
formatTooltip: function (e) {
return oc(this, e)
},
getRegionModel: function (e) {
var t = this.getData().getName(e);
return this._regionModelMap[t] || new i.Model(null, this)
},
getRegionPolygonCoords: function (e) {
var t = this.coordinateSystem
, r = this.getData().getName(e);
if (t.transform)
return (i = t.getRegion(r)) ? i.geometries : [];
this._geo || (this._geo = $h.createGeo3D(this));
for (var i = this._geo.getRegion(r), n = [], a = 0; a < i.geometries.length; a++) {
var o = i.geometries[a]
, s = []
, l = md(t, o.exterior);
if (s && s.length)
for (var h = 0; h < o.interiors.length; h++)
s.push(md(t, s[h]));
n.push({
interiors: s,
exterior: l
})
}
return n
},
getFormattedLabel: function (e, t) {
var r = ac.getFormattedLabel(this, e, t);
return null == r && (r = this.getData().getName(e)),
r
},
defaultOption: {
coordinateSystem: "geo3D",
data: null
}
});
i.util.merge(gd.prototype, Ql),
i.util.merge(gd.prototype, uo),
i.util.merge(gd.prototype, co),
i.util.merge(gd.prototype, fo),
i.util.merge(gd.prototype, Kl);
const _d = gd
, vd = i.ChartView.extend({
type: "map3D",
__ecgl__: !0,
init: function (e, t) {
this._geo3DBuilder = new Uh(t),
this.groupGL = new Ka.Node
},
render: function (e, t, r) {
var i = e.coordinateSystem;
if (i && i.viewGL) {
if (this.groupGL.add(this._geo3DBuilder.rootNode),
i.viewGL.add(this.groupGL),
"geo3D" === i.type) {
this._sceneHelper || (this._sceneHelper = new Uo,
this._sceneHelper.initLight(this.groupGL)),
this._sceneHelper.setScene(i.viewGL.scene),
this._sceneHelper.updateLight(e),
i.viewGL.setPostEffect(e.getModel("postEffect"), r),
i.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling"));
var n = this._control;
n || (n = this._control = new Do({
zr: r.getZr()
}),
this._control.init());
var a = e.getModel("viewControl");
n.setViewGL(i.viewGL),
n.setFromViewControlModel(a, 0),
n.off("update"),
n.on("update", (function () {
r.dispatchAction({
type: "map3DChangeCamera",
alpha: n.getAlpha(),
beta: n.getBeta(),
distance: n.getDistance(),
from: this.uid,
map3DId: e.id
})
}
)),
this._geo3DBuilder.extrudeY = !0
} else
this._control && (this._control.dispose(),
this._control = null),
this._sceneHelper && (this._sceneHelper.dispose(),
this._sceneHelper = null),
e.getData().getLayout("geo3D"),
this._geo3DBuilder.extrudeY = !1;
this._geo3DBuilder.update(e, t, r, 0, e.getData().count());
var o = i.viewGL.isLinearSpace() ? "define" : "undefine";
this._geo3DBuilder.rootNode.traverse((function (e) {
e.material && e.material[o]("fragment", "SRGB_DECODE")
}
))
}
},
afterRender: function (e, t, r, i) {
var n = i.renderer
, a = e.coordinateSystem;
a && "geo3D" === a.type && (this._sceneHelper.updateAmbientCubemap(n, e, r),
this._sceneHelper.updateSkybox(n, e, r))
},
dispose: function () {
this.groupGL.removeAll(),
this._control.dispose(),
this._geo3DBuilder.dispose()
}
});
(0,
i.use)((function (e) {
eu(e),
e.registerChartView(vd),
e.registerSeriesModel(_d),
e.registerAction({
type: "map3DChangeCamera",
event: "map3dcamerachanged",
update: "series:updateCamera"
}, (function (e, t) {
t.eachComponent({
mainType: "series",
subType: "map3D",
query: e
}, (function (t) {
t.setView(e)
}
))
}
))
}
));
const yd = i.SeriesModel.extend({
type: "series.scatterGL",
dependencies: ["grid", "polar", "geo", "singleAxis"],
visualStyleAccessPath: "itemStyle",
hasSymbolVisual: !0,
getInitialData: function () {
return i.helper.createList(this)
},
defaultOption: {
coordinateSystem: "cartesian2d",
zlevel: 10,
progressive: 1e5,
progressiveThreshold: 1e5,
large: !1,
symbol: "circle",
symbolSize: 10,
zoomScale: 0,
blendMode: "source-over",
itemStyle: {
opacity: .8
},
postEffect: {
enable: !1,
colorCorrection: {
exposure: 0,
brightness: 0,
contrast: 1,
saturation: 1,
enable: !0
}
}
}
});
function xd(e, t, r) {
var i = t[0]
, n = t[1];
return e[0] = r[0] * i + r[2] * n + r[4],
e[1] = r[1] * i + r[3] * n + r[5],
e
}
function bd(e) {
this.viewGL = e
}
bd.prototype.reset = function (e, t) {
this._updateCamera(t.getWidth(), t.getHeight(), t.getDevicePixelRatio()),
this._viewTransform = [1, 0, 0, 1, 0, 0],
this.updateTransform(e, t)
}
,
bd.prototype.updateTransform = function (e, t) {
var r, i, n, a, o, s, l, h, u, c = e.coordinateSystem;
c.getRoamTransform && (r = this._viewTransform,
n = (i = c.getRoamTransform())[0],
a = i[2],
o = i[4],
s = i[1],
l = i[3],
h = i[5],
(u = n * l - s * a) && (u = 1 / u,
r[0] = l * u,
r[1] = -s * u,
r[2] = -a * u,
r[3] = n * u,
r[4] = (a * h - l * o) * u,
r[5] = (s * o - n * h) * u),
this._setCameraTransform(this._viewTransform),
t.getZr().refresh())
}
,
bd.prototype.dataToPoint = function (e, t, r) {
r = e.dataToPoint(t, null, r);
var i = this._viewTransform;
i && xd(r, r, i)
}
,
bd.prototype.removeTransformInPoint = function (e) {
return this._viewTransform && xd(e, e, this._viewTransform),
e
}
,
bd.prototype.getZoom = function () {
if (this._viewTransform) {
var e = this._viewTransform;
return 1 / Math.max(Math.sqrt(e[0] * e[0] + e[1] * e[1]), Math.sqrt(e[2] * e[2] + e[3] * e[3]))
}
return 1
}
,
bd.prototype._setCameraTransform = function (e) {
var t = this.viewGL.camera;
t.position.set(e[4], e[5], 0),
t.scale.set(Math.sqrt(e[0] * e[0] + e[1] * e[1]), Math.sqrt(e[2] * e[2] + e[3] * e[3]), 1)
}
,
bd.prototype._updateCamera = function (e, t, r) {
this.viewGL.setViewport(0, 0, e, t, r);
var i = this.viewGL.camera;
i.left = i.top = 0,
i.bottom = t,
i.right = e,
i.near = 0,
i.far = 100
}
;
const wd = bd
, Td = i.ChartView.extend({
type: "scatterGL",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this.viewGL = new Il("orthographic"),
this.viewGL.add(this.groupGL),
this._pointsBuilderList = [],
this._currentStep = 0,
this._sizeScale = 1,
this._glViewHelper = new wd(this.viewGL)
},
render: function (e, t, r) {
if (this.groupGL.removeAll(),
this._glViewHelper.reset(e, r),
e.getData().count()) {
var i = this._pointsBuilderList[0];
i || (i = this._pointsBuilderList[0] = new Fc(!0, r)),
this._pointsBuilderList.length = 1,
this.groupGL.add(i.rootNode),
this._removeTransformInPoints(e.getData().getLayout("points")),
i.update(e, t, r),
this.viewGL.setPostEffect(e.getModel("postEffect"), r)
}
},
incrementalPrepareRender: function (e, t, r) {
this.groupGL.removeAll(),
this._glViewHelper.reset(e, r),
this._currentStep = 0,
this.viewGL.setPostEffect(e.getModel("postEffect"), r)
},
incrementalRender: function (e, t, r, i) {
if (!(e.end <= e.start)) {
var n = this._pointsBuilderList[this._currentStep];
n || (n = new Fc(!0, i),
this._pointsBuilderList[this._currentStep] = n),
this.groupGL.add(n.rootNode),
this._removeTransformInPoints(t.getData().getLayout("points")),
n.setSizeScale(this._sizeScale),
n.update(t, r, i, e.start, e.end),
i.getZr().refresh(),
this._currentStep++
}
},
updateTransform: function (e, t, r) {
if (e.coordinateSystem.getRoamTransform) {
this._glViewHelper.updateTransform(e, r);
var i = this._glViewHelper.getZoom()
, n = Math.max((e.get("zoomScale") || 0) * (i - 1) + 1, 0);
this._sizeScale = n,
this._pointsBuilderList.forEach((function (e) {
e.setSizeScale(n)
}
))
}
},
_removeTransformInPoints: function (e) {
if (e)
for (var t = [], r = 0; r < e.length; r += 2)
t[0] = e[r],
t[1] = e[r + 1],
this._glViewHelper.removeTransformInPoint(t),
e[r] = t[0],
e[r + 1] = t[1]
},
dispose: function () {
this.groupGL.removeAll(),
this._pointsBuilderList.forEach((function (e) {
e.dispose()
}
))
},
remove: function () {
this.groupGL.removeAll()
}
});
function Sd(e) {
return "_EC_" + e
}
(0,
i.use)((function (e) {
e.registerChartView(Td),
e.registerSeriesModel(yd),
e.registerLayout({
seriesType: "scatterGL",
reset: function (e) {
var t, r = e.coordinateSystem, i = e.getData();
if (r) {
var n = r.dimensions.map((function (e) {
return i.mapDimension(e)
}
)).slice(0, 2)
, a = [];
1 === n.length ? t = function (e) {
for (var t = new Float32Array(2 * (e.end - e.start)), a = e.start; a < e.end; a++) {
var o = 2 * (a - e.start)
, s = i.get(n[0], a)
, l = r.dataToPoint(s);
t[o] = l[0],
t[o + 1] = l[1]
}
i.setLayout("points", t)
}
: 2 === n.length && (t = function (e) {
for (var t = new Float32Array(2 * (e.end - e.start)), o = e.start; o < e.end; o++) {
var s = 2 * (o - e.start)
, l = i.get(n[0], o)
, h = i.get(n[1], o);
a[0] = l,
a[1] = h,
a = r.dataToPoint(a),
t[s] = a[0],
t[s + 1] = a[1]
}
i.setLayout("points", t)
}
)
}
return {
progress: t
}
}
})
}
));
var Md = function () {
function e(e) {
this.type = "graph",
this.nodes = [],
this.edges = [],
this._nodesMap = {},
this._edgesMap = {},
this._directed = e || !1
}
return e.prototype.isDirected = function () {
return this._directed
}
,
e.prototype.addNode = function (e, t) {
e = null == e ? "" + t : "" + e;
var r = this._nodesMap;
if (!r[Sd(e)]) {
var i = new Ad(e, t);
return i.hostGraph = this,
this.nodes.push(i),
r[Sd(e)] = i,
i
}
}
,
e.prototype.getNodeByIndex = function (e) {
var t = this.data.getRawIndex(e);
return this.nodes[t]
}
,
e.prototype.getNodeById = function (e) {
return this._nodesMap[Sd(e)]
}
,
e.prototype.addEdge = function (e, t, r) {
var i = this._nodesMap
, n = this._edgesMap;
if ("number" == typeof e && (e = this.nodes[e]),
"number" == typeof t && (t = this.nodes[t]),
e instanceof Ad || (e = i[Sd(e)]),
t instanceof Ad || (t = i[Sd(t)]),
e && t) {
var a = e.id + "-" + t.id
, o = new Ed(e, t, r);
return o.hostGraph = this,
this._directed && (e.outEdges.push(o),
t.inEdges.push(o)),
e.edges.push(o),
e !== t && t.edges.push(o),
this.edges.push(o),
n[a] = o,
o
}
}
,
e.prototype.getEdgeByIndex = function (e) {
var t = this.edgeData.getRawIndex(e);
return this.edges[t]
}
,
e.prototype.getEdge = function (e, t) {
e instanceof Ad && (e = e.id),
t instanceof Ad && (t = t.id);
var r = this._edgesMap;
return this._directed ? r[e + "-" + t] : r[e + "-" + t] || r[t + "-" + e]
}
,
e.prototype.eachNode = function (e, t) {
for (var r = this.nodes, i = r.length, n = 0; n < i; n++)
r[n].dataIndex >= 0 && e.call(t, r[n], n)
}
,
e.prototype.eachEdge = function (e, t) {
for (var r = this.edges, i = r.length, n = 0; n < i; n++)
r[n].dataIndex >= 0 && r[n].node1.dataIndex >= 0 && r[n].node2.dataIndex >= 0 && e.call(t, r[n], n)
}
,
e.prototype.breadthFirstTraverse = function (e, t, r, i) {
if (t instanceof Ad || (t = this._nodesMap[Sd(t)]),
t) {
for (var n = "out" === r ? "outEdges" : "in" === r ? "inEdges" : "edges", a = 0; a < this.nodes.length; a++)
this.nodes[a].__visited = !1;
if (!e.call(i, t, null))
for (var o = [t]; o.length;) {
var s = o.shift()
, l = s[n];
for (a = 0; a < l.length; a++) {
var h = l[a]
, u = h.node1 === s ? h.node2 : h.node1;
if (!u.__visited) {
if (e.call(i, u, s))
return;
o.push(u),
u.__visited = !0
}
}
}
}
}
,
e.prototype.update = function () {
for (var e = this.data, t = this.edgeData, r = this.nodes, i = this.edges, n = 0, a = r.length; n < a; n++)
r[n].dataIndex = -1;
for (n = 0,
a = e.count(); n < a; n++)
r[e.getRawIndex(n)].dataIndex = n;
for (t.filterSelf((function (e) {
var r = i[t.getRawIndex(e)];
return r.node1.dataIndex >= 0 && r.node2.dataIndex >= 0
}
)),
n = 0,
a = i.length; n < a; n++)
i[n].dataIndex = -1;
for (n = 0,
a = t.count(); n < a; n++)
i[t.getRawIndex(n)].dataIndex = n
}
,
e.prototype.clone = function () {
for (var t = new e(this._directed), r = this.nodes, i = this.edges, n = 0; n < r.length; n++)
t.addNode(r[n].id, r[n].dataIndex);
for (n = 0; n < i.length; n++) {
var a = i[n];
t.addEdge(a.node1.id, a.node2.id, a.dataIndex)
}
return t
}
,
e
}()
, Ad = function () {
function e(e, t) {
this.inEdges = [],
this.outEdges = [],
this.edges = [],
this.dataIndex = -1,
this.id = null == e ? "" : e,
this.dataIndex = null == t ? -1 : t
}
return e.prototype.degree = function () {
return this.edges.length
}
,
e.prototype.inDegree = function () {
return this.inEdges.length
}
,
e.prototype.outDegree = function () {
return this.outEdges.length
}
,
e.prototype.getModel = function (e) {
if (!(this.dataIndex < 0))
return this.hostGraph.data.getItemModel(this.dataIndex).getModel(e)
}
,
e.prototype.getAdjacentDataIndices = function () {
for (var e = {
edge: [],
node: []
}, t = 0; t < this.edges.length; t++) {
var r = this.edges[t];
r.dataIndex < 0 || (e.edge.push(r.dataIndex),
e.node.push(r.node1.dataIndex, r.node2.dataIndex))
}
return e
}
,
e
}()
, Ed = function () {
function e(e, t, r) {
this.dataIndex = -1,
this.node1 = e,
this.node2 = t,
this.dataIndex = null == r ? -1 : r
}
return e.prototype.getModel = function (e) {
if (!(this.dataIndex < 0))
return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(e)
}
,
e.prototype.getAdjacentDataIndices = function () {
return {
edge: [this.dataIndex],
node: [this.node1.dataIndex, this.node2.dataIndex]
}
}
,
e
}();
function Cd(e, t) {
return {
getValue: function (r) {
var i = this[e][t];
return i.get(i.getDimension(r || "value"), this.dataIndex)
},
setVisual: function (r, i) {
this.dataIndex >= 0 && this[e][t].setItemVisual(this.dataIndex, r, i)
},
getVisual: function (r) {
return this[e][t].getItemVisual(this.dataIndex, r)
},
setLayout: function (r, i) {
this.dataIndex >= 0 && this[e][t].setItemLayout(this.dataIndex, r, i)
},
getLayout: function () {
return this[e][t].getItemLayout(this.dataIndex)
},
getGraphicEl: function () {
return this[e][t].getItemGraphicEl(this.dataIndex)
},
getRawIndex: function () {
return this[e][t].getRawIndex(this.dataIndex)
}
}
}
_a(Ad, Cd("hostGraph", "data")),
_a(Ed, Cd("hostGraph", "edgeData"));
const Dd = Md;
var Ld = _o();
function Pd(e, t) {
if (Ld(this).mainData === this) {
var r = ga({}, Ld(this).datas);
r[this.dataType] = t,
Bd(t, r, e)
} else
Fd(t, this.dataType, Ld(this).mainData, e);
return t
}
function Od(e, t) {
return e.struct && e.struct.update(),
t
}
function Nd(e, t) {
return ya(Ld(t).datas, (function (r, i) {
r !== t && Fd(r.cloneShallow(), i, t, e)
}
)),
t
}
function Id(e) {
var t = Ld(this).mainData;
return null == e || null == t ? t : Ld(t).datas[e]
}
function Rd() {
var e = Ld(this).mainData;
return null == e ? [{
data: e
}] : xa(ba(Ld(e).datas), (function (t) {
return {
type: t,
data: Ld(e).datas[t]
}
}
))
}
function Bd(e, t, r) {
Ld(e).datas = {},
ya(t, (function (t, i) {
Fd(t, i, e, r)
}
))
}
function Fd(e, t, r, i) {
Ld(r).datas[t] = e,
Ld(e).mainData = r,
e.dataType = t,
i.struct && (e[i.structAttr] = i.struct,
i.struct[i.datasAttr[t]] = e),
e.getLinkedData = Id,
e.getLinkedDataAll = Rd
}
var zd = i.SeriesModel.extend({
type: "series.graphGL",
visualStyleAccessPath: "itemStyle",
hasSymbolVisual: !0,
init: function (e) {
zd.superApply(this, "init", arguments),
this.legendDataProvider = function () {
return this._categoriesData
}
,
this._updateCategoriesData()
},
mergeOption: function (e) {
zd.superApply(this, "mergeOption", arguments),
this._updateCategoriesData()
},
getFormattedLabel: function (e, t, r, i) {
var n = ac.getFormattedLabel(this, e, t, r, i);
if (null == n) {
var a = this.getData()
, o = a.dimensions[a.dimensions.length - 1];
n = a.get(o, e)
}
return n
},
getInitialData: function (e, t) {
var r = e.edges || e.links || []
, n = e.data || e.nodes || []
, a = this;
if (n && r)
return function (e, t, r, n, a) {
for (var o = new Dd(!0), s = 0; s < e.length; s++)
o.addNode(Mn(e[s].id, e[s].name, s), s);
var l, h = [], u = [], c = 0;
for (s = 0; s < t.length; s++) {
var d = t[s]
, f = d.source
, p = d.target;
o.addEdge(f, p, c) && (u.push(d),
h.push(Mn(d.id, f + " > " + p)),
c++)
}
var m = i.helper.createDimensions(e, {
coordDimensions: ["value"]
});
(l = new i.List(m, r)).initData(e);
var g, _, v, y = new i.List(["value"], r);
return y.initData(u, h),
a && a(l, y),
_ = (g = {
mainData: l,
struct: o,
structAttr: "graph",
datas: {
node: l,
edge: y
},
datasAttr: {
node: "data",
edge: "edgeData"
}
}).mainData,
(v = g.datas) || (v = {
main: _
},
g.datasAttr = {
main: "data"
}),
g.datas = g.mainData = null,
Bd(_, v, g),
ya(v, (function (e) {
ya(_.TRANSFERABLE_METHODS, (function (t) {
e.wrapMethod(t, wa(Pd, g))
}
))
}
)),
_.wrapMethod("cloneShallow", wa(Nd, g)),
ya(_.CHANGABLE_METHODS, (function (e) {
_.wrapMethod(e, wa(Od, g))
}
)),
function (e, t) {
if (!e)
throw new Error(void 0)
}(v[_.dataType] === _),
o.update(),
o
}(n, r, this, 0, (function (e, r) {
e.wrapMethod("getItemModel", (function (e) {
const t = a._categoriesModels[e.getShallow("category")];
return t && (t.parentModel = e.parentModel,
e.parentModel = t),
e
}
));
const i = t.getModel([]).getModel;
function n(e, t) {
const r = i.call(this, e, t);
return r.resolveParentPath = o,
r
}
function o(e) {
if (e && ("label" === e[0] || "label" === e[1])) {
const t = e.slice();
return "label" === e[0] ? t[0] = "edgeLabel" : "label" === e[1] && (t[1] = "edgeLabel"),
t
}
return e
}
r.wrapMethod("getItemModel", (function (e) {
return e.resolveParentPath = o,
e.getModel = n,
e
}
))
}
)).data
},
getGraph: function () {
return this.getData().graph
},
getEdgeData: function () {
return this.getGraph().edgeData
},
getCategoriesData: function () {
return this._categoriesData
},
formatTooltip: function (e, t, r) {
if ("edge" === r) {
var n = this.getData()
, a = this.getDataParams(e, r)
, o = n.graph.getEdgeByIndex(e)
, s = n.getName(o.node1.dataIndex)
, l = n.getName(o.node2.dataIndex)
, h = [];
return null != s && h.push(s),
null != l && h.push(l),
h = i.format.encodeHTML(h.join(" > ")),
a.value && (h += " : " + i.format.encodeHTML(a.value)),
h
}
return zd.superApply(this, "formatTooltip", arguments)
},
_updateCategoriesData: function () {
var e = (this.option.categories || []).map((function (e) {
return null != e.value ? e : Object.assign({
value: 0
}, e)
}
))
, t = new i.List(["value"], this);
t.initData(e),
this._categoriesData = t,
this._categoriesModels = t.mapArray((function (e) {
return t.getItemModel(e, !0)
}
))
},
setView: function (e) {
null != e.zoom && (this.option.zoom = e.zoom),
null != e.offset && (this.option.offset = e.offset)
},
setNodePosition: function (e) {
for (var t = 0; t < e.length / 2; t++) {
var r = e[2 * t]
, i = e[2 * t + 1]
, n = this.getData().getRawDataItem(t);
n.x = r,
n.y = i
}
},
isAnimationEnabled: function () {
return zd.superCall(this, "isAnimationEnabled") && !("force" === this.get("layout") && this.get("force.layoutAnimation"))
},
defaultOption: {
zlevel: 10,
z: 2,
legendHoverLink: !0,
layout: "forceAtlas2",
forceAtlas2: {
initLayout: null,
GPU: !0,
steps: 1,
maxSteps: 1e3,
repulsionByDegree: !0,
linLogMode: !1,
strongGravityMode: !1,
gravity: 1,
edgeWeightInfluence: 1,
edgeWeight: [1, 4],
nodeWeight: [1, 4],
preventOverlap: !1,
gravityCenter: null
},
focusNodeAdjacency: !0,
focusNodeAdjacencyOn: "mouseover",
left: "center",
top: "center",
symbol: "circle",
symbolSize: 5,
roam: !1,
center: null,
zoom: 1,
label: {
show: !1,
formatter: "{b}",
position: "right",
distance: 5,
textStyle: {
fontSize: 14
}
},
itemStyle: {},
lineStyle: {
color: "#aaa",
width: 1,
opacity: .5
},
emphasis: {
label: {
show: !0
}
},
animation: !1
}
});
const Gd = zd;
var Ud = Po.vec2
, kd = [[0, 0], [1, 1]]
, Vd = Vr.extend((function () {
return {
segmentScale: 4,
dynamic: !0,
useNativeLine: !0,
attributes: {
position: new Vr.Attribute("position", "float", 2, "POSITION"),
normal: new Vr.Attribute("normal", "float", 2),
offset: new Vr.Attribute("offset", "float", 1),
color: new Vr.Attribute("color", "float", 4, "COLOR")
}
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._faceOffset = 0,
this._itemVertexOffsets = []
},
setVertexCount: function (e) {
var t = this.attributes;
this.vertexCount !== e && (t.position.init(e),
t.color.init(e),
this.useNativeLine || (t.offset.init(e),
t.normal.init(e)),
e > 65535 ? this.indices instanceof Uint16Array && (this.indices = new Uint32Array(this.indices)) : this.indices instanceof Uint32Array && (this.indices = new Uint16Array(this.indices)))
},
setTriangleCount: function (e) {
this.triangleCount !== e && (this.indices = 0 === e ? null : this.vertexCount > 65535 ? new Uint32Array(3 * e) : new Uint16Array(3 * e))
},
_getCubicCurveApproxStep: function (e, t, r, i) {
return 1 / (Ud.dist(e, t) + Ud.dist(r, t) + Ud.dist(i, r) + 1) * this.segmentScale
},
getCubicCurveVertexCount: function (e, t, r, i) {
var n = this._getCubicCurveApproxStep(e, t, r, i)
, a = Math.ceil(1 / n);
return this.useNativeLine ? 2 * a : 2 * a + 2
},
getCubicCurveTriangleCount: function (e, t, r, i) {
var n = this._getCubicCurveApproxStep(e, t, r, i)
, a = Math.ceil(1 / n);
return this.useNativeLine ? 0 : 2 * a
},
getLineVertexCount: function () {
return this.getPolylineVertexCount(kd)
},
getLineTriangleCount: function () {
return this.getPolylineTriangleCount(kd)
},
getPolylineVertexCount: function (e) {
var t;
return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 2,
this.useNativeLine ? 2 * (t - 1) : 2 * (t - 1) + 2
},
getPolylineTriangleCount: function (e) {
var t;
return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 2,
this.useNativeLine ? 0 : 2 * (t - 1)
},
addCubicCurve: function (e, t, r, i, n, a) {
null == a && (a = 1);
var o = e[0]
, s = e[1]
, l = t[0]
, h = t[1]
, u = r[0]
, c = r[1]
, d = i[0]
, f = i[1]
, p = this._getCubicCurveApproxStep(e, t, r, i)
, m = p * p
, g = m * p
, _ = 3 * p
, v = 3 * m
, y = 6 * m
, x = 6 * g
, b = o - 2 * l + u
, w = s - 2 * h + c
, T = 3 * (l - u) - o + d
, S = 3 * (h - c) - s + f
, M = o
, A = s
, E = (l - o) * _ + b * v + T * g
, C = (h - s) * _ + w * v + S * g
, D = b * y + T * x
, L = w * y + S * x
, P = T * x
, O = S * x
, N = 0
, I = 0
, R = Math.ceil(1 / p)
, B = new Float32Array(3 * (R + 1))
, F = (B = [],
0);
for (I = 0; I < R + 1; I++)
B[F++] = M,
B[F++] = A,
M += E,
A += C,
E += D,
C += L,
D += P,
L += O,
(N += p) > 1 && (M = E > 0 ? Math.min(M, d) : Math.max(M, d),
A = C > 0 ? Math.min(A, f) : Math.max(A, f));
this.addPolyline(B, n, a)
},
addLine: function (e, t, r, i) {
this.addPolyline([e, t], r, i)
},
addPolyline: function () {
var e = Ud.create()
, t = Ud.create()
, r = Ud.create()
, i = Ud.create()
, n = []
, a = []
, o = [];
return function (s, l, h, u, c) {
if (s.length) {
var d = "number" != typeof s[0];
if (null == c && (c = d ? s.length : s.length / 2),
!(c < 2)) {
null == u && (u = 0),
null == h && (h = 1),
this._itemVertexOffsets.push(this._vertexOffset);
for (var f, p = d ? "number" != typeof l[0] : l.length / 4 === c, m = this.attributes.position, g = this.attributes.color, _ = this.attributes.offset, v = this.attributes.normal, y = this.indices, x = this._vertexOffset, b = 0; b < c; b++) {
if (d)
n = s[b + u],
f = p ? l[b + u] : l;
else {
var w = 2 * b + u;
if ((n = n || [])[0] = s[w],
n[1] = s[w + 1],
p) {
var T = 4 * b + u;
(f = f || [])[0] = l[T],
f[1] = l[T + 1],
f[2] = l[T + 2],
f[3] = l[T + 3]
} else
f = l
}
if (this.useNativeLine)
b > 1 && (m.copy(x, x - 1),
g.copy(x, x - 1),
x++);
else {
var S;
if (b < c - 1)
if (d ? Ud.copy(a, s[b + 1]) : (w = 2 * (b + 1) + u,
(a = a || [])[0] = s[w],
a[1] = s[w + 1]),
b > 0) {
Ud.sub(e, n, o),
Ud.sub(t, a, n),
Ud.normalize(e, e),
Ud.normalize(t, t),
Ud.add(i, e, t),
Ud.normalize(i, i);
var M = h / 2 * Math.min(1 / Ud.dot(e, i), 2);
r[0] = -i[1],
r[1] = i[0],
S = M
} else
Ud.sub(e, a, n),
Ud.normalize(e, e),
r[0] = -e[1],
r[1] = e[0],
S = h / 2;
else
Ud.sub(e, n, o),
Ud.normalize(e, e),
r[0] = -e[1],
r[1] = e[0],
S = h / 2;
v.set(x, r),
v.set(x + 1, r),
_.set(x, S),
_.set(x + 1, -S),
Ud.copy(o, n),
m.set(x, n),
m.set(x + 1, n),
g.set(x, f),
g.set(x + 1, f),
x += 2
}
if (this.useNativeLine)
g.set(x, f),
m.set(x, n),
x++;
else if (b > 0) {
var A = 3 * this._faceOffset;
(y = this.indices)[A] = x - 4,
y[A + 1] = x - 3,
y[A + 2] = x - 2,
y[A + 3] = x - 3,
y[A + 4] = x - 1,
y[A + 5] = x - 2,
this._faceOffset += 2
}
}
this._vertexOffset = x
}
}
}
}(),
setItemColor: function (e, t) {
for (var r = this._itemVertexOffsets[e], i = e < this._itemVertexOffsets.length - 1 ? this._itemVertexOffsets[e + 1] : this._vertexOffset, n = r; n < i; n++)
this.attributes.color.set(n, t);
this.dirty("color")
}
});
i.util.defaults(Vd.prototype, Lo);
const Hd = Vd;
Ka.Shader.import("@export ecgl.forceAtlas2.updateNodeRepulsion\n\n#define NODE_COUNT 0\n\nuniform sampler2D positionTex;\n\nuniform vec2 textureSize;\nuniform float gravity;\nuniform float scaling;\nuniform vec2 gravityCenter;\n\nuniform bool strongGravityMode;\nuniform bool preventOverlap;\n\nvarying vec2 v_Texcoord;\n\nvoid main() {\n\n vec4 n0 = texture2D(positionTex, v_Texcoord);\n\n vec2 force = vec2(0.0);\n for (int i = 0; i < NODE_COUNT; i++) {\n vec2 uv = vec2(\n mod(float(i), textureSize.x) / (textureSize.x - 1.0),\n floor(float(i) / textureSize.x) / (textureSize.y - 1.0)\n );\n vec4 n1 = texture2D(positionTex, uv);\n\n vec2 dir = n0.xy - n1.xy;\n float d2 = dot(dir, dir);\n\n if (d2 > 0.0) {\n float factor = 0.0;\n if (preventOverlap) {\n float d = sqrt(d2);\n d = d - n0.w - n1.w;\n if (d > 0.0) {\n factor = scaling * n0.z * n1.z / (d * d);\n }\n else if (d < 0.0) {\n factor = scaling * 100.0 * n0.z * n1.z;\n }\n }\n else {\n factor = scaling * n0.z * n1.z / d2;\n }\n force += dir * factor;\n }\n }\n\n vec2 dir = gravityCenter - n0.xy;\n float d = 1.0;\n if (!strongGravityMode) {\n d = length(dir);\n }\n\n force += dir * n0.z * gravity / (d + 1.0);\n\n gl_FragColor = vec4(force, 0.0, 1.0);\n}\n@end\n\n@export ecgl.forceAtlas2.updateEdgeAttraction.vertex\n\nattribute vec2 node1;\nattribute vec2 node2;\nattribute float weight;\n\nuniform sampler2D positionTex;\nuniform float edgeWeightInfluence;\nuniform bool preventOverlap;\nuniform bool linLogMode;\n\nuniform vec2 windowSize: WINDOW_SIZE;\n\nvarying vec2 v_Force;\n\nvoid main() {\n\n vec4 n0 = texture2D(positionTex, node1);\n vec4 n1 = texture2D(positionTex, node2);\n\n vec2 dir = n1.xy - n0.xy;\n float d = length(dir);\n float w;\n if (edgeWeightInfluence == 0.0) {\n w = 1.0;\n }\n else if (edgeWeightInfluence == 1.0) {\n w = weight;\n }\n else {\n w = pow(weight, edgeWeightInfluence);\n }\n vec2 offset = vec2(1.0 / windowSize.x, 1.0 / windowSize.y);\n vec2 scale = vec2((windowSize.x - 1.0) / windowSize.x, (windowSize.y - 1.0) / windowSize.y);\n vec2 pos = node1 * scale * 2.0 - 1.0;\n gl_Position = vec4(pos + offset, 0.0, 1.0);\n gl_PointSize = 1.0;\n\n float factor;\n if (preventOverlap) {\n d = d - n1.w - n0.w;\n }\n if (d <= 0.0) {\n v_Force = vec2(0.0);\n return;\n }\n\n if (linLogMode) {\n factor = w * log(d) / d;\n }\n else {\n factor = w;\n }\n v_Force = dir * factor;\n}\n@end\n\n@export ecgl.forceAtlas2.updateEdgeAttraction.fragment\n\nvarying vec2 v_Force;\n\nvoid main() {\n gl_FragColor = vec4(v_Force, 0.0, 0.0);\n}\n@end\n\n@export ecgl.forceAtlas2.calcWeightedSum.vertex\n\nattribute vec2 node;\n\nvarying vec2 v_NodeUv;\n\nvoid main() {\n\n v_NodeUv = node;\n gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n gl_PointSize = 1.0;\n}\n@end\n\n@export ecgl.forceAtlas2.calcWeightedSum.fragment\n\nvarying vec2 v_NodeUv;\n\nuniform sampler2D positionTex;\nuniform sampler2D forceTex;\nuniform sampler2D forcePrevTex;\n\nvoid main() {\n vec2 force = texture2D(forceTex, v_NodeUv).rg;\n vec2 forcePrev = texture2D(forcePrevTex, v_NodeUv).rg;\n\n float mass = texture2D(positionTex, v_NodeUv).z;\n float swing = length(force - forcePrev) * mass;\n float traction = length(force + forcePrev) * 0.5 * mass;\n\n gl_FragColor = vec4(swing, traction, 0.0, 0.0);\n}\n@end\n\n@export ecgl.forceAtlas2.calcGlobalSpeed\n\nuniform sampler2D globalSpeedPrevTex;\nuniform sampler2D weightedSumTex;\nuniform float jitterTolerence;\n\nvoid main() {\n vec2 weightedSum = texture2D(weightedSumTex, vec2(0.5)).xy;\n float prevGlobalSpeed = texture2D(globalSpeedPrevTex, vec2(0.5)).x;\n float globalSpeed = jitterTolerence * jitterTolerence\n * weightedSum.y / weightedSum.x;\n if (prevGlobalSpeed > 0.0) {\n globalSpeed = min(globalSpeed / prevGlobalSpeed, 1.5) * prevGlobalSpeed;\n }\n gl_FragColor = vec4(globalSpeed, 0.0, 0.0, 1.0);\n}\n@end\n\n@export ecgl.forceAtlas2.updatePosition\n\nuniform sampler2D forceTex;\nuniform sampler2D forcePrevTex;\nuniform sampler2D positionTex;\nuniform sampler2D globalSpeedTex;\n\nvarying vec2 v_Texcoord;\n\nvoid main() {\n vec2 force = texture2D(forceTex, v_Texcoord).xy;\n vec2 forcePrev = texture2D(forcePrevTex, v_Texcoord).xy;\n vec4 node = texture2D(positionTex, v_Texcoord);\n\n float globalSpeed = texture2D(globalSpeedTex, vec2(0.5)).r;\n float swing = length(force - forcePrev);\n float speed = 0.1 * globalSpeed / (0.1 + globalSpeed * sqrt(swing));\n\n float df = length(force);\n if (df > 0.0) {\n speed = min(df * speed, 10.0) / df;\n\n gl_FragColor = vec4(node.xy + speed * force, node.zw);\n }\n else {\n gl_FragColor = node;\n }\n}\n@end\n\n@export ecgl.forceAtlas2.edges.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec2 node;\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n\nuniform sampler2D positionTex;\n\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(\n texture2D(positionTex, node).xy, -10.0, 1.0\n );\n v_Color = a_Color;\n}\n@end\n\n@export ecgl.forceAtlas2.edges.fragment\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\nvarying vec4 v_Color;\nvoid main() {\n gl_FragColor = color * v_Color;\n}\n@end");
var Wd = {
repulsionByDegree: !0,
linLogMode: !1,
strongGravityMode: !1,
gravity: 1,
scaling: 1,
edgeWeightInfluence: 1,
jitterTolerence: .1,
preventOverlap: !1,
dissuadeHubs: !1,
gravityCenter: null
};
function jd(e) {
var t = {
type: Ka.Texture.FLOAT,
minFilter: Ka.Texture.NEAREST,
magFilter: Ka.Texture.NEAREST
};
this._positionSourceTex = new Ka.Texture2D(t),
this._positionSourceTex.flipY = !1,
this._positionTex = new Ka.Texture2D(t),
this._positionPrevTex = new Ka.Texture2D(t),
this._forceTex = new Ka.Texture2D(t),
this._forcePrevTex = new Ka.Texture2D(t),
this._weightedSumTex = new Ka.Texture2D(t),
this._weightedSumTex.width = this._weightedSumTex.height = 1,
this._globalSpeedTex = new Ka.Texture2D(t),
this._globalSpeedPrevTex = new Ka.Texture2D(t),
this._globalSpeedTex.width = this._globalSpeedTex.height = 1,
this._globalSpeedPrevTex.width = this._globalSpeedPrevTex.height = 1,
this._nodeRepulsionPass = new pn({
fragment: Ka.Shader.source("ecgl.forceAtlas2.updateNodeRepulsion")
}),
this._positionPass = new pn({
fragment: Ka.Shader.source("ecgl.forceAtlas2.updatePosition")
}),
this._globalSpeedPass = new pn({
fragment: Ka.Shader.source("ecgl.forceAtlas2.calcGlobalSpeed")
}),
this._copyPass = new pn({
fragment: Ka.Shader.source("clay.compositor.output")
});
var r = function (e) {
e.blendEquation(e.FUNC_ADD),
e.blendFunc(e.ONE, e.ONE)
};
this._edgeForceMesh = new Ka.Mesh({
geometry: new Ka.Geometry({
attributes: {
node1: new Ka.Geometry.Attribute("node1", "float", 2),
node2: new Ka.Geometry.Attribute("node2", "float", 2),
weight: new Ka.Geometry.Attribute("weight", "float", 1)
},
dynamic: !0,
mainAttribute: "node1"
}),
material: new Ka.Material({
transparent: !0,
shader: Ka.createShader("ecgl.forceAtlas2.updateEdgeAttraction"),
blend: r,
depthMask: !1,
depthText: !1
}),
mode: Ka.Mesh.POINTS
}),
this._weightedSumMesh = new Ka.Mesh({
geometry: new Ka.Geometry({
attributes: {
node: new Ka.Geometry.Attribute("node", "float", 2)
},
dynamic: !0,
mainAttribute: "node"
}),
material: new Ka.Material({
transparent: !0,
shader: Ka.createShader("ecgl.forceAtlas2.calcWeightedSum"),
blend: r,
depthMask: !1,
depthText: !1
}),
mode: Ka.Mesh.POINTS
}),
this._framebuffer = new zi({
depthBuffer: !1
}),
this._dummyCamera = new Ka.OrthographicCamera({
left: -1,
right: 1,
top: 1,
bottom: -1,
near: 0,
far: 100
}),
this._globalSpeed = 0
}
jd.prototype.updateOption = function (e) {
for (var t in Wd)
this[t] = Wd[t];
var r = this._nodes.length;
if (this.jitterTolerence = r > 5e4 ? 10 : r > 5e3 ? 1 : .1,
this.scaling = r > 100 ? 2 : 10,
e)
for (var t in Wd)
null != e[t] && (this[t] = e[t]);
if (this.repulsionByDegree)
for (var i = this._positionSourceTex.pixels, n = 0; n < this._nodes.length; n++)
i[4 * n + 2] = (this._nodes[n].degree || 0) + 1
}
,
jd.prototype._updateGravityCenter = function (e) {
var t = this._nodes
, r = this._edges;
if (this.gravityCenter)
this._gravityCenter = this.gravityCenter;
else {
for (var i = [1 / 0, 1 / 0], n = [-1 / 0, -1 / 0], a = 0; a < t.length; a++)
i[0] = Math.min(t[a].x, i[0]),
i[1] = Math.min(t[a].y, i[1]),
n[0] = Math.max(t[a].x, n[0]),
n[1] = Math.max(t[a].y, n[1]);
this._gravityCenter = [.5 * (i[0] + n[0]), .5 * (i[1] + n[1])]
}
for (a = 0; a < r.length; a++) {
var o = r[a].node1
, s = r[a].node2;
t[o].degree = (t[o].degree || 0) + 1,
t[s].degree = (t[s].degree || 0) + 1
}
}
,
jd.prototype.initData = function (e, t) {
this._nodes = e,
this._edges = t,
this._updateGravityCenter();
var r = Math.ceil(Math.sqrt(e.length))
, i = r
, n = new Float32Array(r * i * 4);
this._resize(r, i);
for (var a = 0, o = 0; o < e.length; o++) {
var s = e[o];
n[a++] = s.x || 0,
n[a++] = s.y || 0,
n[a++] = s.mass || 1,
n[a++] = s.size || 1
}
this._positionSourceTex.pixels = n;
var l = this._edgeForceMesh.geometry
, h = t.length;
l.attributes.node1.init(2 * h),
l.attributes.node2.init(2 * h),
l.attributes.weight.init(2 * h);
var u = [];
for (o = 0; o < t.length; o++) {
var c = l.attributes
, d = t[o].weight;
null == d && (d = 1),
c.node1.set(o, this.getNodeUV(t[o].node1, u)),
c.node2.set(o, this.getNodeUV(t[o].node2, u)),
c.weight.set(o, d),
c.node1.set(o + h, this.getNodeUV(t[o].node2, u)),
c.node2.set(o + h, this.getNodeUV(t[o].node1, u)),
c.weight.set(o + h, d)
}
var f = this._weightedSumMesh.geometry;
for (f.attributes.node.init(e.length),
o = 0; o < e.length; o++)
f.attributes.node.set(o, this.getNodeUV(o, u));
l.dirty(),
f.dirty(),
this._nodeRepulsionPass.material.define("fragment", "NODE_COUNT", e.length),
this._nodeRepulsionPass.material.setUniform("textureSize", [r, i]),
this._inited = !1,
this._frame = 0
}
,
jd.prototype.getNodes = function () {
return this._nodes
}
,
jd.prototype.getEdges = function () {
return this._edges
}
,
jd.prototype.step = function (e) {
this._inited || (this._initFromSource(e),
this._inited = !0),
this._frame++,
this._framebuffer.attach(this._forceTex),
this._framebuffer.bind(e);
var t = this._nodeRepulsionPass;
t.setUniform("strongGravityMode", this.strongGravityMode),
t.setUniform("gravity", this.gravity),
t.setUniform("gravityCenter", this._gravityCenter),
t.setUniform("scaling", this.scaling),
t.setUniform("preventOverlap", this.preventOverlap),
t.setUniform("positionTex", this._positionPrevTex),
t.render(e);
var r = this._edgeForceMesh;
r.material.set("linLogMode", this.linLogMode),
r.material.set("edgeWeightInfluence", this.edgeWeightInfluence),
r.material.set("preventOverlap", this.preventOverlap),
r.material.set("positionTex", this._positionPrevTex),
e.gl.enable(e.gl.BLEND),
e.renderPass([r], this._dummyCamera),
this._framebuffer.attach(this._weightedSumTex),
e.gl.clearColor(0, 0, 0, 0),
e.gl.clear(e.gl.COLOR_BUFFER_BIT),
e.gl.enable(e.gl.BLEND);
var i = this._weightedSumMesh;
i.material.set("positionTex", this._positionPrevTex),
i.material.set("forceTex", this._forceTex),
i.material.set("forcePrevTex", this._forcePrevTex),
e.renderPass([i], this._dummyCamera),
this._framebuffer.attach(this._globalSpeedTex);
var n = this._globalSpeedPass;
n.setUniform("globalSpeedPrevTex", this._globalSpeedPrevTex),
n.setUniform("weightedSumTex", this._weightedSumTex),
n.setUniform("jitterTolerence", this.jitterTolerence),
e.gl.disable(e.gl.BLEND),
n.render(e);
var a = this._positionPass;
this._framebuffer.attach(this._positionTex),
a.setUniform("globalSpeedTex", this._globalSpeedTex),
a.setUniform("positionTex", this._positionPrevTex),
a.setUniform("forceTex", this._forceTex),
a.setUniform("forcePrevTex", this._forcePrevTex),
a.render(e),
this._framebuffer.unbind(e),
this._swapTexture()
}
,
jd.prototype.update = function (e, t, r) {
null == t && (t = 1),
t = Math.max(t, 1);
for (var i = 0; i < t; i++)
this.step(e);
r && r()
}
,
jd.prototype.getNodePositionTexture = function () {
return this._inited ? this._positionPrevTex : this._positionSourceTex
}
,
jd.prototype.getNodeUV = function (e, t) {
t = t || [];
var r = this._positionTex.width
, i = this._positionTex.height;
return t[0] = e % r / (r - 1),
t[1] = Math.floor(e / r) / (i - 1) || 0,
t
}
,
jd.prototype.getNodePosition = function (e, t) {
var r = this._positionArr
, i = this._positionTex.width
, n = this._positionTex.height
, a = i * n;
r && r.length === 4 * a || (r = this._positionArr = new Float32Array(4 * a)),
this._framebuffer.bind(e),
this._framebuffer.attach(this._positionPrevTex),
e.gl.readPixels(0, 0, i, n, e.gl.RGBA, e.gl.FLOAT, r),
this._framebuffer.unbind(e),
t || (t = new Float32Array(2 * this._nodes.length));
for (var o = 0; o < this._nodes.length; o++)
t[2 * o] = r[4 * o],
t[2 * o + 1] = r[4 * o + 1];
return t
}
,
jd.prototype.getTextureData = function (e, t) {
var r = this["_" + t + "Tex"]
, i = r.width
, n = r.height;
this._framebuffer.bind(e),
this._framebuffer.attach(r);
var a = new Float32Array(i * n * 4);
return e.gl.readPixels(0, 0, i, n, e.gl.RGBA, e.gl.FLOAT, a),
this._framebuffer.unbind(e),
a
}
,
jd.prototype.getTextureSize = function () {
return {
width: this._positionTex.width,
height: this._positionTex.height
}
}
,
jd.prototype.isFinished = function (e) {
return this._frame > e
}
,
jd.prototype._swapTexture = function () {
var e = this._positionPrevTex;
this._positionPrevTex = this._positionTex,
this._positionTex = e,
e = this._forcePrevTex,
this._forcePrevTex = this._forceTex,
this._forceTex = e,
e = this._globalSpeedPrevTex,
this._globalSpeedPrevTex = this._globalSpeedTex,
this._globalSpeedTex = e
}
,
jd.prototype._initFromSource = function (e) {
this._framebuffer.attach(this._positionPrevTex),
this._framebuffer.bind(e),
this._copyPass.setUniform("texture", this._positionSourceTex),
this._copyPass.render(e),
e.gl.clearColor(0, 0, 0, 0),
this._framebuffer.attach(this._forcePrevTex),
e.gl.clear(e.gl.COLOR_BUFFER_BIT),
this._framebuffer.attach(this._globalSpeedPrevTex),
e.gl.clear(e.gl.COLOR_BUFFER_BIT),
this._framebuffer.unbind(e)
}
,
jd.prototype._resize = function (e, t) {
["_positionSourceTex", "_positionTex", "_positionPrevTex", "_forceTex", "_forcePrevTex"].forEach((function (r) {
this[r].width = e,
this[r].height = t,
this[r].dirty()
}
), this)
}
,
jd.prototype.dispose = function (e) {
this._framebuffer.dispose(e),
this._copyPass.dispose(e),
this._nodeRepulsionPass.dispose(e),
this._positionPass.dispose(e),
this._globalSpeedPass.dispose(e),
this._edgeForceMesh.geometry.dispose(e),
this._weightedSumMesh.geometry.dispose(e),
this._positionSourceTex.dispose(e),
this._positionTex.dispose(e),
this._positionPrevTex.dispose(e),
this._forceTex.dispose(e),
this._forcePrevTex.dispose(e),
this._weightedSumTex.dispose(e),
this._globalSpeedTex.dispose(e),
this._globalSpeedPrevTex.dispose(e)
}
;
const Xd = jd;
var qd = function () {
var e = function () {
return new Float32Array(2)
}
, t = function (e, t) {
var r = t[0] - e[0]
, i = t[1] - e[1];
return Math.sqrt(r * r + i * i)
}
, r = function (e) {
var t = e[0]
, r = e[1];
return Math.sqrt(t * t + r * r)
}
, i = function (e, t, r, i) {
return e[0] = t[0] + r[0] * i,
e[1] = t[1] + r[1] * i,
e
}
, n = function (e, t, r) {
return e[0] = t[0] + r[0],
e[1] = t[1] + r[1],
e
}
, a = function (e, t, r) {
return e[0] = t[0] - r[0],
e[1] = t[1] - r[1],
e
}
, o = function (e, t, r) {
return e[0] = t,
e[1] = r,
e
};
function s() {
this.subRegions = [],
this.nSubRegions = 0,
this.node = null,
this.mass = 0,
this.centerOfMass = null,
this.bbox = new Float32Array(4),
this.size = 0
}
var l = s.prototype;
function h() {
this.position = new Float32Array(2),
this.force = e(),
this.forcePrev = e(),
this.mass = 1,
this.inDegree = 0,
this.outDegree = 0
}
function u(e, t) {
this.source = e,
this.target = t,
this.weight = 1
}
function c() {
this.autoSettings = !0,
this.barnesHutOptimize = !0,
this.barnesHutTheta = 1.5,
this.repulsionByDegree = !0,
this.linLogMode = !1,
this.strongGravityMode = !1,
this.gravity = 1,
this.scaling = 1,
this.edgeWeightInfluence = 1,
this.jitterTolerence = .1,
this.preventOverlap = !1,
this.dissuadeHubs = !1,
this.rootRegion = new s,
this.rootRegion.centerOfMass = e(),
this.nodes = [],
this.edges = [],
this.bbox = new Float32Array(4),
this.gravityCenter = null,
this._massArr = null,
this._swingingArr = null,
this._sizeArr = null,
this._globalSpeed = 0
}
l.beforeUpdate = function () {
for (var e = 0; e < this.nSubRegions; e++)
this.subRegions[e].beforeUpdate();
this.mass = 0,
this.centerOfMass && (this.centerOfMass[0] = 0,
this.centerOfMass[1] = 0),
this.nSubRegions = 0,
this.node = null
}
,
l.afterUpdate = function () {
this.subRegions.length = this.nSubRegions;
for (var e = 0; e < this.nSubRegions; e++)
this.subRegions[e].afterUpdate()
}
,
l.addNode = function (e) {
if (0 === this.nSubRegions) {
if (null == this.node)
return void (this.node = e);
this._addNodeToSubRegion(this.node),
this.node = null
}
this._addNodeToSubRegion(e),
this._updateCenterOfMass(e)
}
,
l.findSubRegion = function (e, t) {
for (var r = 0; r < this.nSubRegions; r++) {
var i = this.subRegions[r];
if (i.contain(e, t))
return i
}
}
,
l.contain = function (e, t) {
return this.bbox[0] <= e && this.bbox[2] >= e && this.bbox[1] <= t && this.bbox[3] >= t
}
,
l.setBBox = function (e, t, r, i) {
this.bbox[0] = e,
this.bbox[1] = t,
this.bbox[2] = r,
this.bbox[3] = i,
this.size = (r - e + i - t) / 2
}
,
l._newSubRegion = function () {
var e = this.subRegions[this.nSubRegions];
return e || (e = new s,
this.subRegions[this.nSubRegions] = e),
this.nSubRegions++,
e
}
,
l._addNodeToSubRegion = function (e) {
var t = this.findSubRegion(e.position[0], e.position[1])
, r = this.bbox;
if (!t) {
var i = (r[0] + r[2]) / 2
, n = (r[1] + r[3]) / 2
, a = (r[2] - r[0]) / 2
, o = (r[3] - r[1]) / 2
, s = e.position[0] >= i ? 1 : 0
, l = e.position[1] >= n ? 1 : 0;
(t = this._newSubRegion()).setBBox(s * a + r[0], l * o + r[1], (s + 1) * a + r[0], (l + 1) * o + r[1])
}
t.addNode(e)
}
,
l._updateCenterOfMass = function (e) {
null == this.centerOfMass && (this.centerOfMass = new Float32Array(2));
var t = this.centerOfMass[0] * this.mass
, r = this.centerOfMass[1] * this.mass;
t += e.position[0] * e.mass,
r += e.position[1] * e.mass,
this.mass += e.mass,
this.centerOfMass[0] = t / this.mass,
this.centerOfMass[1] = r / this.mass
}
;
var d = c.prototype;
d.initNodes = function (e, t, r) {
var i = t.length;
this.nodes.length = 0;
for (var n = void 0 !== r, a = 0; a < i; a++) {
var o = new h;
o.position[0] = e[2 * a],
o.position[1] = e[2 * a + 1],
o.mass = t[a],
n && (o.size = r[a]),
this.nodes.push(o)
}
this._massArr = t,
this._swingingArr = new Float32Array(i),
n && (this._sizeArr = r)
}
,
d.initEdges = function (e, t) {
var r = e.length / 2;
this.edges.length = 0;
for (var i = 0; i < r; i++) {
var n = e[2 * i]
, a = e[2 * i + 1]
, o = this.nodes[n]
, s = this.nodes[a];
if (!o || !s)
return void console.error("Node not exists, try initNodes before initEdges");
o.outDegree++,
s.inDegree++;
var l = new u(o, s);
t && (l.weight = t[i]),
this.edges.push(l)
}
}
,
d.updateSettings = function () {
if (this.repulsionByDegree)
for (var e = 0; e < this.nodes.length; e++)
(t = this.nodes[e]).mass = t.inDegree + t.outDegree + 1;
else
for (e = 0; e < this.nodes.length; e++) {
var t;
(t = this.nodes[e]).mass = this._massArr[e]
}
}
,
d.update = function () {
var a, s, l = this.nodes.length;
if (this.updateSettings(),
this.updateBBox(),
this.barnesHutOptimize) {
this.rootRegion.setBBox(this.bbox[0], this.bbox[1], this.bbox[2], this.bbox[3]),
this.rootRegion.beforeUpdate();
for (var h = 0; h < l; h++)
this.rootRegion.addNode(this.nodes[h]);
this.rootRegion.afterUpdate()
}
for (h = 0; h < l; h++) {
var u = this.nodes[h];
a = u.forcePrev,
s = u.force,
a[0] = s[0],
a[1] = s[1],
o(u.force, 0, 0)
}
for (h = 0; h < l; h++) {
var c = this.nodes[h];
if (this.barnesHutOptimize)
this.applyRegionToNodeRepulsion(this.rootRegion, c);
else
for (var d = h + 1; d < l; d++) {
var f = this.nodes[d];
this.applyNodeToNodeRepulsion(c, f, !1)
}
this.gravity > 0 && (this.strongGravityMode ? this.applyNodeStrongGravity(c) : this.applyNodeGravity(c))
}
for (h = 0; h < this.edges.length; h++)
this.applyEdgeAttraction(this.edges[h]);
var p = 0
, m = 0
, g = e();
for (h = 0; h < l; h++)
u = this.nodes[h],
p += (v = t(u.force, u.forcePrev)) * u.mass,
n(g, u.force, u.forcePrev),
m += .5 * r(g) * u.mass,
this._swingingArr[h] = v;
var _ = this.jitterTolerence * this.jitterTolerence * m / p;
for (this._globalSpeed > 0 && (_ = Math.min(_ / this._globalSpeed, 1.5) * this._globalSpeed),
this._globalSpeed = _,
h = 0; h < l; h++) {
u = this.nodes[h];
var v = this._swingingArr[h]
, y = .1 * _ / (1 + _ * Math.sqrt(v))
, x = r(u.force);
x > 0 && (y = Math.min(x * y, 10) / x,
i(u.position, u.position, u.force, y))
}
}
,
d.applyRegionToNodeRepulsion = function () {
var t = e();
return function (e, r) {
if (e.node)
this.applyNodeToNodeRepulsion(e.node, r, !0);
else {
a(t, r.position, e.centerOfMass);
var n = t[0] * t[0] + t[1] * t[1];
if (n > this.barnesHutTheta * e.size * e.size) {
var o = this.scaling * r.mass * e.mass / n;
i(r.force, r.force, t, o)
} else
for (var s = 0; s < e.nSubRegions; s++)
this.applyRegionToNodeRepulsion(e.subRegions[s], r)
}
}
}(),
d.applyNodeToNodeRepulsion = function () {
var t = e();
return function (e, r, n) {
if (e != r) {
a(t, e.position, r.position);
var o = t[0] * t[0] + t[1] * t[1];
if (0 !== o) {
var s;
if (this.preventOverlap) {
var l = Math.sqrt(o);
if ((l = l - e.size - r.size) > 0)
s = this.scaling * e.mass * r.mass / (l * l);
else {
if (!(l < 0))
return;
s = 100 * this.scaling * e.mass * r.mass
}
} else
s = this.scaling * e.mass * r.mass / o;
i(e.force, e.force, t, s),
i(r.force, r.force, t, -s)
}
}
}
}(),
d.applyEdgeAttraction = function () {
var t = e();
return function (e) {
var n = e.source
, o = e.target;
a(t, n.position, o.position);
var s, l, h = r(t);
s = 0 === this.edgeWeightInfluence ? 1 : 1 === this.edgeWeightInfluence ? e.weight : Math.pow(e.weight, this.edgeWeightInfluence),
this.preventOverlap && (h = h - n.size - o.size) <= 0 || (l = this.linLogMode ? -s * Math.log(h + 1) / (h + 1) : -s,
i(n.force, n.force, t, l),
i(o.force, o.force, t, -l))
}
}(),
d.applyNodeGravity = function () {
var t = e();
return function (e) {
a(t, this.gravityCenter, e.position);
var n = r(t);
i(e.force, e.force, t, this.gravity * e.mass / (n + 1))
}
}(),
d.applyNodeStrongGravity = function () {
var t = e();
return function (e) {
a(t, this.gravityCenter, e.position),
i(e.force, e.force, t, this.gravity * e.mass)
}
}(),
d.updateBBox = function () {
for (var e = 1 / 0, t = 1 / 0, r = -1 / 0, i = -1 / 0, n = 0; n < this.nodes.length; n++) {
var a = this.nodes[n].position;
e = Math.min(e, a[0]),
t = Math.min(t, a[1]),
r = Math.max(r, a[0]),
i = Math.max(i, a[1])
}
this.bbox[0] = e,
this.bbox[1] = t,
this.bbox[2] = r,
this.bbox[3] = i
}
,
d.getGlobalSpeed = function () {
return this._globalSpeed
}
;
var f = null;
self.onmessage = function (e) {
switch (e.data.cmd) {
case "init":
(f = new c).initNodes(e.data.nodesPosition, e.data.nodesMass, e.data.nodesSize),
f.initEdges(e.data.edges, e.data.edgesWeight);
break;
case "updateConfig":
if (f)
for (var t in e.data.config)
f[t] = e.data.config[t];
break;
case "update":
var r = e.data.steps;
if (f) {
for (var i = 0; i < r; i++)
f.update();
var n = f.nodes.length
, a = new Float32Array(2 * n);
for (i = 0; i < n; i++) {
var o = f.nodes[i];
a[2 * i] = o.position[0],
a[2 * i + 1] = o.position[1]
}
self.postMessage({
buffer: a.buffer,
globalSpeed: f.getGlobalSpeed()
}, [a.buffer])
} else {
var s = new Float32Array;
self.postMessage({
buffer: s.buffer,
globalSpeed: f.getGlobalSpeed()
}, [s.buffer])
}
}
}
}
.toString();
qd = qd.slice(qd.indexOf("{") + 1, qd.lastIndexOf("}"));
var Zd = {
barnesHutOptimize: !0,
barnesHutTheta: 1.5,
repulsionByDegree: !0,
linLogMode: !1,
strongGravityMode: !1,
gravity: 1,
scaling: 1,
edgeWeightInfluence: 1,
jitterTolerence: .1,
preventOverlap: !1,
dissuadeHubs: !1,
gravityCenter: null
}
, Yd = function (e) {
for (var t in Zd)
this[t] = Zd[t];
if (e)
for (var t in e)
this[t] = e[t];
this._nodes = [],
this._edges = [],
this._disposed = !1,
this._positionTex = new Dr({
type: wr.FLOAT,
flipY: !1,
minFilter: wr.NEAREST,
magFilter: wr.NEAREST
})
};
Yd.prototype.initData = function (e, t) {
var r = new Blob([qd])
, i = window.URL.createObjectURL(r);
this._worker = new Worker(i),
this._worker.onmessage = this._$onupdate.bind(this),
this._nodes = e,
this._edges = t,
this._frame = 0;
for (var n = e.length, a = t.length, o = new Float32Array(2 * n), s = new Float32Array(n), l = new Float32Array(n), h = new Float32Array(2 * a), u = new Float32Array(a), c = 0; c < e.length; c++) {
var d = e[c];
o[2 * c] = d.x,
o[2 * c + 1] = d.y,
s[c] = null == d.mass ? 1 : d.mass,
l[c] = null == d.size ? 1 : d.size
}
for (c = 0; c < t.length; c++) {
var f = t[c]
, p = f.node1
, m = f.node2;
h[2 * c] = p,
h[2 * c + 1] = m,
u[c] = null == f.weight ? 1 : f.weight
}
var g = Math.ceil(Math.sqrt(e.length))
, _ = g
, v = new Float32Array(g * _ * 4)
, y = this._positionTex;
y.width = g,
y.height = _,
y.pixels = v,
this._worker.postMessage({
cmd: "init",
nodesPosition: o,
nodesMass: s,
nodesSize: l,
edges: h,
edgesWeight: u
}),
this._globalSpeed = 1 / 0
}
,
Yd.prototype.updateOption = function (e) {
var t = {};
for (var r in Zd)
t[r] = Zd[r];
var i = this._nodes
, n = this._edges
, a = i.length;
if (t.jitterTolerence = a > 5e4 ? 10 : a > 5e3 ? 1 : .1,
t.scaling = a > 100 ? 2 : 10,
t.barnesHutOptimize = a > 1e3,
e)
for (var r in Zd)
null != e[r] && (t[r] = e[r]);
if (!t.gravityCenter) {
for (var o = [1 / 0, 1 / 0], s = [-1 / 0, -1 / 0], l = 0; l < i.length; l++)
o[0] = Math.min(i[l].x, o[0]),
o[1] = Math.min(i[l].y, o[1]),
s[0] = Math.max(i[l].x, s[0]),
s[1] = Math.max(i[l].y, s[1]);
t.gravityCenter = [.5 * (o[0] + s[0]), .5 * (o[1] + s[1])]
}
for (l = 0; l < n.length; l++) {
var h = n[l].node1
, u = n[l].node2;
i[h].degree = (i[h].degree || 0) + 1,
i[u].degree = (i[u].degree || 0) + 1
}
this._worker && this._worker.postMessage({
cmd: "updateConfig",
config: t
})
}
,
Yd.prototype.update = function (e, t, r) {
null == t && (t = 1),
t = Math.max(t, 1),
this._frame += t,
this._onupdate = r,
this._worker && this._worker.postMessage({
cmd: "update",
steps: Math.round(t)
})
}
,
Yd.prototype._$onupdate = function (e) {
if (!this._disposed) {
var t = new Float32Array(e.data.buffer);
this._globalSpeed = e.data.globalSpeed,
this._positionArr = t,
this._updateTexture(t),
this._onupdate && this._onupdate()
}
}
,
Yd.prototype.getNodePositionTexture = function () {
return this._positionTex
}
,
Yd.prototype.getNodeUV = function (e, t) {
t = t || [];
var r = this._positionTex.width
, i = this._positionTex.height;
return t[0] = e % r / (r - 1),
t[1] = Math.floor(e / r) / (i - 1),
t
}
,
Yd.prototype.getNodes = function () {
return this._nodes
}
,
Yd.prototype.getEdges = function () {
return this._edges
}
,
Yd.prototype.isFinished = function (e) {
return this._frame > e
}
,
Yd.prototype.getNodePosition = function (e, t) {
if (t || (t = new Float32Array(2 * this._nodes.length)),
this._positionArr)
for (var r = 0; r < this._positionArr.length; r++)
t[r] = this._positionArr[r];
return t
}
,
Yd.prototype._updateTexture = function (e) {
for (var t = this._positionTex.pixels, r = 0, i = 0; i < e.length;)
t[r++] = e[i++],
t[r++] = e[i++],
t[r++] = 1,
t[r++] = 1;
this._positionTex.dirty()
}
,
Yd.prototype.dispose = function (e) {
this._disposed = !0,
this._worker = null
}
;
const Kd = Yd
, Qd = m.extend((function () {
return {
zr: null,
viewGL: null,
minZoom: .2,
maxZoom: 5,
_needsUpdate: !1,
_dx: 0,
_dy: 0,
_zoom: 1
}
}
), (function () {
this._mouseDownHandler = this._mouseDownHandler.bind(this),
this._mouseWheelHandler = this._mouseWheelHandler.bind(this),
this._mouseMoveHandler = this._mouseMoveHandler.bind(this),
this._mouseUpHandler = this._mouseUpHandler.bind(this),
this._update = this._update.bind(this)
}
), {
init: function () {
var e = this.zr;
e.on("mousedown", this._mouseDownHandler),
e.on("mousewheel", this._mouseWheelHandler),
e.on("globalout", this._mouseUpHandler),
e.animation.on("frame", this._update)
},
setTarget: function (e) {
this._target = e
},
setZoom: function (e) {
this._zoom = Math.max(Math.min(e, this.maxZoom), this.minZoom),
this._needsUpdate = !0
},
setOffset: function (e) {
this._dx = e[0],
this._dy = e[1],
this._needsUpdate = !0
},
getZoom: function () {
return this._zoom
},
getOffset: function () {
return [this._dx, this._dy]
},
_update: function () {
if (this._target && this._needsUpdate) {
var e = this._target
, t = this._zoom;
e.position.x = this._dx,
e.position.y = this._dy,
e.scale.set(t, t, t),
this.zr.refresh(),
this._needsUpdate = !1,
this.trigger("update")
}
},
_mouseDownHandler: function (e) {
if (!e.target) {
var t = e.offsetX
, r = e.offsetY;
if (!this.viewGL || this.viewGL.containPoint(t, r)) {
this.zr.on("mousemove", this._mouseMoveHandler),
this.zr.on("mouseup", this._mouseUpHandler);
var i = this._convertPos(t, r);
this._x = i.x,
this._y = i.y
}
}
},
_convertPos: function (e, t) {
var r = this.viewGL.camera
, i = this.viewGL.viewport;
return {
x: (e - i.x) / i.width * (r.right - r.left) + r.left,
y: (t - i.y) / i.height * (r.bottom - r.top) + r.top
}
},
_mouseMoveHandler: function (e) {
var t = this._convertPos(e.offsetX, e.offsetY);
this._dx += t.x - this._x,
this._dy += t.y - this._y,
this._x = t.x,
this._y = t.y,
this._needsUpdate = !0
},
_mouseUpHandler: function (e) {
this.zr.off("mousemove", this._mouseMoveHandler),
this.zr.off("mouseup", this._mouseUpHandler)
},
_mouseWheelHandler: function (e) {
var t = (e = e.event).wheelDelta || -e.detail;
if (0 !== t) {
var r = e.offsetX
, i = e.offsetY;
if (!this.viewGL || this.viewGL.containPoint(r, i)) {
var n = t > 0 ? 1.1 : .9
, a = Math.max(Math.min(this._zoom * n, this.maxZoom), this.minZoom);
n = a / this._zoom;
var o = this._convertPos(r, i)
, s = (o.x - this._dx) * (n - 1)
, l = (o.y - this._dy) * (n - 1);
this._dx -= s,
this._dy -= l,
this._zoom = a,
this._needsUpdate = !0
}
}
},
dispose: function () {
var e = this.zr;
e.off("mousedown", this._mouseDownHandler),
e.off("mousemove", this._mouseMoveHandler),
e.off("mouseup", this._mouseUpHandler),
e.off("mousewheel", this._mouseWheelHandler),
e.off("globalout", this._mouseUpHandler),
e.animation.off("frame", this._update)
}
});
var Jd = Po.vec2;
Ka.Shader.import("@export ecgl.lines2D.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec2 position: POSITION;\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n\n#ifdef POSITIONTEXTURE_ENABLED\nuniform sampler2D positionTexture;\n#endif\n\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, -10.0, 1.0);\n\n v_Color = a_Color;\n}\n\n@end\n\n@export ecgl.lines2D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\n\nvoid main()\n{\n gl_FragColor = color * v_Color;\n}\n@end\n\n\n@export ecgl.meshLines2D.vertex\n\nattribute vec2 position: POSITION;\nattribute vec2 normal;\nattribute float offset;\nattribute vec4 a_Color : COLOR;\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\n\nvarying vec4 v_Color;\nvarying float v_Miter;\n\nvoid main()\n{\n vec4 p2 = worldViewProjection * vec4(position + normal, -10.0, 1.0);\n gl_Position = worldViewProjection * vec4(position, -10.0, 1.0);\n\n p2.xy /= p2.w;\n gl_Position.xy /= gl_Position.w;\n\n vec2 N = normalize(p2.xy - gl_Position.xy);\n gl_Position.xy += N * offset / viewport.zw * 2.0;\n\n gl_Position.xy *= gl_Position.w;\n\n v_Color = a_Color;\n}\n@end\n\n\n@export ecgl.meshLines2D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\nvarying float v_Miter;\n\nvoid main()\n{\n gl_FragColor = color * v_Color;\n}\n\n@end");
var $d = 1;
const ef = i.ChartView.extend({
type: "graphGL",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this.viewGL = new Il("orthographic"),
this.viewGL.camera.left = this.viewGL.camera.right = 0,
this.viewGL.add(this.groupGL),
this._pointsBuilder = new Fc(!0, t),
this._forceEdgesMesh = new Ka.Mesh({
material: new Ka.Material({
shader: Ka.createShader("ecgl.forceAtlas2.edges"),
transparent: !0,
depthMask: !1,
depthTest: !1
}),
$ignorePicking: !0,
geometry: new Ka.Geometry({
attributes: {
node: new Ka.Geometry.Attribute("node", "float", 2),
color: new Ka.Geometry.Attribute("color", "float", 4, "COLOR")
},
dynamic: !0,
mainAttribute: "node"
}),
renderOrder: -1,
mode: Ka.Mesh.LINES
}),
this._edgesMesh = new Ka.Mesh({
material: new Ka.Material({
shader: Ka.createShader("ecgl.meshLines2D"),
transparent: !0,
depthMask: !1,
depthTest: !1
}),
$ignorePicking: !0,
geometry: new Hd({
useNativeLine: !1,
dynamic: !0
}),
renderOrder: -1,
culling: !1
}),
this._layoutId = 0,
this._control = new Qd({
zr: t.getZr(),
viewGL: this.viewGL
}),
this._control.setTarget(this.groupGL),
this._control.init(),
this._clickHandler = this._clickHandler.bind(this)
},
render: function (e, t, r) {
this.groupGL.add(this._pointsBuilder.rootNode),
this._model = e,
this._api = r,
this._initLayout(e, t, r),
this._pointsBuilder.update(e, t, r),
this._forceLayoutInstance instanceof Xd || this.groupGL.remove(this._forceEdgesMesh),
this._updateCamera(e, r),
this._control.off("update"),
this._control.on("update", (function () {
r.dispatchAction({
type: "graphGLRoam",
seriesId: e.id,
zoom: this._control.getZoom(),
offset: this._control.getOffset()
}),
this._pointsBuilder.updateView(this.viewGL.camera)
}
), this),
this._control.setZoom(Mn(e.get("zoom"), 1)),
this._control.setOffset(e.get("offset") || [0, 0]);
var i = this._pointsBuilder.getPointsMesh();
if (i.off("mousemove", this._mousemoveHandler),
i.off("mouseout", this._mouseOutHandler, this),
r.getZr().off("click", this._clickHandler),
this._pointsBuilder.highlightOnMouseover = !0,
e.get("focusNodeAdjacency")) {
var n = e.get("focusNodeAdjacencyOn");
"click" === n ? r.getZr().on("click", this._clickHandler) : "mouseover" === n && (i.on("mousemove", this._mousemoveHandler, this),
i.on("mouseout", this._mouseOutHandler, this),
this._pointsBuilder.highlightOnMouseover = !1)
}
this._lastMouseOverDataIndex = -1
},
_clickHandler: function (e) {
if (!this._layouting) {
var t = this._pointsBuilder.getPointsMesh().dataIndex;
t >= 0 ? this._api.dispatchAction({
type: "graphGLFocusNodeAdjacency",
seriesId: this._model.id,
dataIndex: t
}) : this._api.dispatchAction({
type: "graphGLUnfocusNodeAdjacency",
seriesId: this._model.id
})
}
},
_mousemoveHandler: function (e) {
if (!this._layouting) {
var t = this._pointsBuilder.getPointsMesh().dataIndex;
t >= 0 ? t !== this._lastMouseOverDataIndex && this._api.dispatchAction({
type: "graphGLFocusNodeAdjacency",
seriesId: this._model.id,
dataIndex: t
}) : this._mouseOutHandler(e),
this._lastMouseOverDataIndex = t
}
},
_mouseOutHandler: function (e) {
this._layouting || (this._api.dispatchAction({
type: "graphGLUnfocusNodeAdjacency",
seriesId: this._model.id
}),
this._lastMouseOverDataIndex = -1)
},
_updateForceEdgesGeometry: function (e, t) {
var r = this._forceEdgesMesh.geometry
, i = t.getEdgeData()
, n = 0
, a = this._forceLayoutInstance
, o = 2 * i.count();
r.attributes.node.init(o),
r.attributes.color.init(o),
i.each((function (t) {
var o = e[t];
r.attributes.node.set(n, a.getNodeUV(o.node1)),
r.attributes.node.set(n + 1, a.getNodeUV(o.node2));
var s = Ih(i, o.dataIndex)
, l = Ka.parseColor(s);
l[3] *= Mn(Rh(i, o.dataIndex), 1),
r.attributes.color.set(n, l),
r.attributes.color.set(n + 1, l),
n += 2
}
)),
r.dirty()
},
_updateMeshLinesGeometry: function () {
var e = this._model.getEdgeData()
, t = this._edgesMesh.geometry
, r = (e = this._model.getEdgeData(),
this._model.getData().getLayout("points"));
t.resetOffset(),
t.setVertexCount(e.count() * t.getLineVertexCount()),
t.setTriangleCount(e.count() * t.getLineTriangleCount());
var i = []
, n = []
, a = ["lineStyle", "width"];
this._originalEdgeColors = new Float32Array(4 * e.count()),
this._edgeIndicesMap = new Float32Array(e.count()),
e.each((function (o) {
var s = e.graph.getEdgeByIndex(o)
, l = 2 * s.node1.dataIndex
, h = 2 * s.node2.dataIndex;
i[0] = r[l],
i[1] = r[l + 1],
n[0] = r[h],
n[1] = r[h + 1];
var u = Ih(e, s.dataIndex)
, c = Ka.parseColor(u);
c[3] *= Mn(Rh(e, s.dataIndex), 1);
var d = e.getItemModel(s.dataIndex)
, f = Mn(d.get(a), 1) * this._api.getDevicePixelRatio();
t.addLine(i, n, c, f);
for (var p = 0; p < 4; p++)
this._originalEdgeColors[4 * s.dataIndex + p] = c[p];
this._edgeIndicesMap[s.dataIndex] = o
}
), this),
t.dirty()
},
_updateForceNodesGeometry: function (e) {
for (var t = this._pointsBuilder.getPointsMesh(), r = [], i = 0; i < e.count(); i++)
this._forceLayoutInstance.getNodeUV(i, r),
t.geometry.attributes.position.set(i, r);
t.geometry.dirty("position")
},
_initLayout: function (e, t, r) {
var n = e.get("layout")
, a = e.getGraph()
, o = Ss(e.getBoxLayoutParams(), {
width: r.getWidth(),
height: r.getHeight()
});
"force" === n && (n = "forceAtlas2"),
this.stopLayout(e, t, r, {
beforeLayout: !0
});
var s = e.getData()
, l = e.getData();
if ("forceAtlas2" === n) {
var h = e.getModel("forceAtlas2")
, u = this._forceLayoutInstance
, c = []
, d = []
, f = s.getDataExtent("value")
, p = l.getDataExtent("value")
, m = Mn(h.get("edgeWeight"), 1)
, g = Mn(h.get("nodeWeight"), 1);
"number" == typeof m && (m = [m, m]),
"number" == typeof g && (g = [g, g]);
var _ = 0
, v = {}
, y = new Float32Array(2 * s.count());
if (a.eachNode((function (e) {
var t, r, n = e.dataIndex, a = s.get("value", n);
if (s.hasItemOption) {
var l = s.getItemModel(n);
t = l.get("x"),
r = l.get("y")
}
null == t && (t = o.x + Math.random() * o.width,
r = o.y + Math.random() * o.height),
y[2 * _] = t,
y[2 * _ + 1] = r,
v[e.id] = _++;
var h = i.number.linearMap(a, f, g);
isNaN(h) && (h = isNaN(g[0]) ? 1 : g[0]),
c.push({
x: t,
y: r,
mass: h,
size: s.getItemVisual(n, "symbolSize")
})
}
)),
s.setLayout("points", y),
a.eachEdge((function (e) {
var t = e.dataIndex
, r = s.get("value", t)
, n = i.number.linearMap(r, p, m);
isNaN(n) && (n = isNaN(m[0]) ? 1 : m[0]),
d.push({
node1: v[e.node1.id],
node2: v[e.node2.id],
weight: n,
dataIndex: t
})
}
)),
!u) {
var x = h.get("GPU");
this._forceLayoutInstance && ((!x || this._forceLayoutInstance instanceof Xd) && (x || this._forceLayoutInstance instanceof Kd) || (this._forceLayoutInstanceToDispose = this._forceLayoutInstance)),
u = this._forceLayoutInstance = x ? new Xd : new Kd
}
u.initData(c, d),
u.updateOption(h.option),
this._updateForceEdgesGeometry(u.getEdges(), e),
this._updatePositionTexture(),
r.dispatchAction({
type: "graphGLStartLayout",
from: this.uid
})
} else
y = new Float32Array(2 * s.count()),
_ = 0,
a.eachNode((function (e) {
var t, r, i = e.dataIndex;
if (s.hasItemOption) {
var n = s.getItemModel(i);
t = n.get("x"),
r = n.get("y")
}
y[_++] = t,
y[_++] = r
}
)),
s.setLayout("points", y),
this._updateAfterLayout(e, t, r)
},
_updatePositionTexture: function () {
var e = this._forceLayoutInstance.getNodePositionTexture();
this._pointsBuilder.setPositionTexture(e),
this._forceEdgesMesh.material.set("positionTex", e)
},
startLayout: function (e, t, r, i) {
if (!i || null == i.from || i.from === this.uid) {
var n = this.viewGL
, a = (r = this._api,
this._forceLayoutInstance)
, o = this._model.getData()
, s = this._model.getModel("forceAtlas2");
if (a && (this.groupGL.remove(this._edgesMesh),
this.groupGL.add(this._forceEdgesMesh),
this._forceLayoutInstance)) {
this._updateForceNodesGeometry(e.getData()),
this._pointsBuilder.hideLabels();
var l = this
, h = this._layoutId = $d++
, u = s.getShallow("maxSteps")
, c = s.getShallow("steps")
, d = 0
, f = Math.max(2 * c, 20)
, p = function (t) {
if (t === l._layoutId)
return a.isFinished(u) ? (r.dispatchAction({
type: "graphGLStopLayout",
from: l.uid
}),
void r.dispatchAction({
type: "graphGLFinishLayout",
points: o.getLayout("points"),
from: l.uid
})) : void a.update(n.layer.renderer, c, (function () {
l._updatePositionTexture(),
(d += c) >= f && (l._syncNodePosition(e),
d = 0),
r.getZr().refresh(),
Qa((function () {
p(t)
}
))
}
))
};
Qa((function () {
l._forceLayoutInstanceToDispose && (l._forceLayoutInstanceToDispose.dispose(n.layer.renderer),
l._forceLayoutInstanceToDispose = null),
p(h)
}
)),
this._layouting = !0
}
}
},
stopLayout: function (e, t, r, i) {
i && null != i.from && i.from !== this.uid || (this._layoutId = 0,
this.groupGL.remove(this._forceEdgesMesh),
this.groupGL.add(this._edgesMesh),
this._forceLayoutInstance && this.viewGL.layer && (i && i.beforeLayout || (this._syncNodePosition(e),
this._updateAfterLayout(e, t, r)),
this._api.getZr().refresh(),
this._layouting = !1))
},
_syncNodePosition: function (e) {
var t = this._forceLayoutInstance.getNodePosition(this.viewGL.layer.renderer);
e.getData().setLayout("points", t),
e.setNodePosition(t)
},
_updateAfterLayout: function (e, t, r) {
this._updateMeshLinesGeometry(),
this._pointsBuilder.removePositionTexture(),
this._pointsBuilder.updateLayout(e, t, r),
this._pointsBuilder.updateView(this.viewGL.camera),
this._pointsBuilder.updateLabels(),
this._pointsBuilder.showLabels()
},
focusNodeAdjacency: function (e, t, r, i) {
var n = this._model.getData();
this._downplayAll();
var a = i.dataIndex
, o = n.graph
, s = []
, l = o.getNodeByIndex(a);
s.push(l),
l.edges.forEach((function (e) {
e.dataIndex < 0 || (e.node1 !== l && s.push(e.node1),
e.node2 !== l && s.push(e.node2))
}
), this),
this._pointsBuilder.fadeOutAll(.05),
this._fadeOutEdgesAll(.05),
s.forEach((function (e) {
this._pointsBuilder.highlight(n, e.dataIndex)
}
), this),
this._pointsBuilder.updateLabels(s.map((function (e) {
return e.dataIndex
}
)));
var h = [];
l.edges.forEach((function (e) {
e.dataIndex >= 0 && (this._highlightEdge(e.dataIndex),
h.push(e))
}
), this),
this._focusNodes = s,
this._focusEdges = h
},
unfocusNodeAdjacency: function (e, t, r, i) {
this._downplayAll(),
this._pointsBuilder.fadeInAll(),
this._fadeInEdgesAll(),
this._pointsBuilder.updateLabels()
},
_highlightEdge: function (e) {
var t = this._model.getEdgeData().getItemModel(e)
, r = Ka.parseColor(t.get("emphasis.lineStyle.color") || t.get("lineStyle.color"))
, i = Mn(t.get("emphasis.lineStyle.opacity"), t.get("lineStyle.opacity"), 1);
r[3] *= i,
this._edgesMesh.geometry.setItemColor(this._edgeIndicesMap[e], r)
},
_downplayAll: function () {
this._focusNodes && this._focusNodes.forEach((function (e) {
this._pointsBuilder.downplay(this._model.getData(), e.dataIndex)
}
), this),
this._focusEdges && this._focusEdges.forEach((function (e) {
this._downplayEdge(e.dataIndex)
}
), this)
},
_downplayEdge: function (e) {
var t = this._getColor(e, []);
this._edgesMesh.geometry.setItemColor(this._edgeIndicesMap[e], t)
},
_setEdgeFade: (tf = [],
function (e, t) {
this._getColor(e, tf),
tf[3] *= t,
this._edgesMesh.geometry.setItemColor(this._edgeIndicesMap[e], tf)
}
),
_getColor: function (e, t) {
for (var r = 0; r < 4; r++)
t[r] = this._originalEdgeColors[4 * e + r];
return t
},
_fadeOutEdgesAll: function (e) {
this._model.getData().graph.eachEdge((function (t) {
this._setEdgeFade(t.dataIndex, e)
}
), this)
},
_fadeInEdgesAll: function () {
this._fadeOutEdgesAll(1)
},
_updateCamera: function (e, t) {
this.viewGL.setViewport(0, 0, t.getWidth(), t.getHeight(), t.getDevicePixelRatio());
for (var r = this.viewGL.camera, i = e.getData().getLayout("points"), n = Jd.create(1 / 0, 1 / 0), a = Jd.create(-1 / 0, -1 / 0), o = [], s = 0; s < i.length;)
o[0] = i[s++],
o[1] = i[s++],
Jd.min(n, n, o),
Jd.max(a, a, o);
var l = (a[1] + n[1]) / 2
, h = (a[0] + n[0]) / 2;
if (!(h > r.left && h < r.right && l < r.bottom && l > r.top)) {
var u = Math.max(a[0] - n[0], 10)
, c = u / t.getWidth() * t.getHeight();
u *= 1.4,
c *= 1.4,
n[0] -= .2 * u,
r.left = n[0],
r.top = l - c / 2,
r.bottom = l + c / 2,
r.right = u + n[0],
r.near = 0,
r.far = 100
}
},
dispose: function () {
var e = this.viewGL.layer.renderer;
this._forceLayoutInstance && this._forceLayoutInstance.dispose(e),
this.groupGL.removeAll(),
this._layoutId = -1,
this._pointsBuilder.dispose()
},
remove: function () {
this.groupGL.removeAll(),
this._control.dispose()
}
});
var tf;
function rf(e) {
return e instanceof Array || (e = [e, e]),
e
}
(0,
i.use)((function (e) {
function t() { }
e.registerChartView(ef),
e.registerSeriesModel(Gd),
e.registerVisual((function (e) {
const t = {};
e.eachSeriesByType("graphGL", (function (e) {
var r = e.getCategoriesData()
, n = e.getData()
, a = {};
r.each((function (i) {
var n = r.getName(i);
a["ec-" + n] = i;
var o = r.getItemModel(i)
, s = o.getModel("itemStyle").getItemStyle();
s.fill || (s.fill = e.getColorFromPalette(n, t)),
r.setItemVisual(i, "style", s);
var l = ["symbol", "symbolSize", "symbolKeepAspect"];
for (let e = 0; e < l.length; e++) {
var h = o.getShallow(l[e], !0);
null != h && r.setItemVisual(i, l[e], h)
}
}
)),
r.count() && n.each((function (e) {
let t = n.getItemModel(e).getShallow("category");
if (null != t) {
"string" == typeof t && (t = a["ec-" + t]);
var o = r.getItemVisual(t, "style")
, s = n.ensureUniqueItemVisual(e, "style");
i.util.extend(s, o);
var l = ["symbol", "symbolSize", "symbolKeepAspect"];
for (let i = 0; i < l.length; i++)
n.setItemVisual(e, l[i], r.getItemVisual(t, l[i]))
}
}
))
}
))
}
)),
e.registerVisual((function (e) {
e.eachSeriesByType("graphGL", (function (e) {
var t = e.getGraph()
, r = e.getEdgeData()
, n = rf(e.get("edgeSymbol"))
, a = rf(e.get("edgeSymbolSize"));
r.setVisual("drawType", "stroke"),
r.setVisual("fromSymbol", n && n[0]),
r.setVisual("toSymbol", n && n[1]),
r.setVisual("fromSymbolSize", a && a[0]),
r.setVisual("toSymbolSize", a && a[1]),
r.setVisual("style", e.getModel("lineStyle").getLineStyle()),
r.each((function (e) {
var n = r.getItemModel(e)
, a = t.getEdgeByIndex(e)
, o = rf(n.getShallow("symbol", !0))
, s = rf(n.getShallow("symbolSize", !0))
, l = n.getModel("lineStyle").getLineStyle()
, h = r.ensureUniqueItemVisual(e, "style");
switch (i.util.extend(h, l),
h.stroke) {
case "source":
var u = a.node1.getVisual("style");
h.stroke = u && u.fill;
break;
case "target":
u = a.node2.getVisual("style"),
h.stroke = u && u.fill
}
o[0] && a.setVisual("fromSymbol", o[0]),
o[1] && a.setVisual("toSymbol", o[1]),
s[0] && a.setVisual("fromSymbolSize", s[0]),
s[1] && a.setVisual("toSymbolSize", s[1])
}
))
}
))
}
)),
e.registerAction({
type: "graphGLRoam",
event: "graphglroam",
update: "series.graphGL:roam"
}, (function (e, t) {
t.eachComponent({
mainType: "series",
query: e
}, (function (t) {
t.setView(e)
}
))
}
)),
e.registerAction({
type: "graphGLStartLayout",
event: "graphgllayoutstarted",
update: "series.graphGL:startLayout"
}, t),
e.registerAction({
type: "graphGLStopLayout",
event: "graphgllayoutstopped",
update: "series.graphGL:stopLayout"
}, t),
e.registerAction({
type: "graphGLFocusNodeAdjacency",
event: "graphGLFocusNodeAdjacency",
update: "series.graphGL:focusNodeAdjacency"
}, t),
e.registerAction({
type: "graphGLUnfocusNodeAdjacency",
event: "graphGLUnfocusNodeAdjacency",
update: "series.graphGL:unfocusNodeAdjacency"
}, t)
}
));
const nf = i.SeriesModel.extend({
type: "series.flowGL",
dependencies: ["geo", "grid", "bmap"],
visualStyleAccessPath: "itemStyle",
getInitialData: function (e, t) {
var r = this.get("coordinateSystem")
, n = "geo" === r ? ["lng", "lat"] : i.getCoordinateSystemDimensions(r) || ["x", "y"];
n.push("vx", "vy");
var a = i.helper.createDimensions(this.getSource(), {
coordDimensions: n,
encodeDefine: this.get("encode"),
dimensionsDefine: this.get("dimensions")
})
, o = new i.List(a, this);
return o.initData(this.getSource()),
o
},
defaultOption: {
coordinateSystem: "cartesian2d",
zlevel: 10,
supersampling: 1,
particleType: "point",
particleDensity: 128,
particleSize: 1,
particleSpeed: 1,
particleTrail: 2,
colorTexture: null,
gridWidth: "auto",
gridHeight: "auto",
itemStyle: {
color: "#fff",
opacity: .8
}
}
})
, af = Vr.extend((function () {
return {
dynamic: !0,
attributes: {
position: new Vr.Attribute("position", "float", 3, "POSITION")
}
}
}
), {
resetOffset: function () {
this._vertexOffset = 0,
this._faceOffset = 0
},
setLineCount: function (e) {
var t = this.attributes
, r = 4 * e
, i = 2 * e;
this.vertexCount !== r && t.position.init(r),
this.triangleCount !== i && (this.indices = 0 === i ? null : this.vertexCount > 65535 ? new Uint32Array(3 * i) : new Uint16Array(3 * i))
},
addLine: function (e) {
var t = this._vertexOffset;
this.attributes.position.set(t, [e[0], e[1], 1]),
this.attributes.position.set(t + 1, [e[0], e[1], -1]),
this.attributes.position.set(t + 2, [e[0], e[1], 2]),
this.attributes.position.set(t + 3, [e[0], e[1], -2]),
this.setTriangleIndices(this._faceOffset++, [t, t + 1, t + 2]),
this.setTriangleIndices(this._faceOffset++, [t + 1, t + 2, t + 3]),
this._vertexOffset += 4
}
});
Xe.import("@export ecgl.vfParticle.particle.fragment\n\nuniform sampler2D particleTexture;\nuniform sampler2D spawnTexture;\nuniform sampler2D velocityTexture;\n\nuniform float deltaTime;\nuniform float elapsedTime;\n\nuniform float speedScaling : 1.0;\n\nuniform vec2 textureSize;\nuniform vec4 region : [0, 0, 1, 1];\nuniform float firstFrameTime;\n\nvarying vec2 v_Texcoord;\n\n\nvoid main()\n{\n vec4 p = texture2D(particleTexture, v_Texcoord);\n bool spawn = false;\n if (p.w <= 0.0) {\n p = texture2D(spawnTexture, fract(v_Texcoord + elapsedTime / 10.0));\n p.w -= firstFrameTime;\n spawn = true;\n }\n vec2 v = texture2D(velocityTexture, fract(p.xy * region.zw + region.xy)).xy;\n v = (v - 0.5) * 2.0;\n p.z = length(v);\n p.xy += v * deltaTime / 10.0 * speedScaling;\n p.w -= deltaTime;\n\n if (spawn || p.xy != fract(p.xy)) {\n p.z = 0.0;\n }\n p.xy = fract(p.xy);\n\n gl_FragColor = p;\n}\n@end\n\n@export ecgl.vfParticle.renderPoints.vertex\n\n#define PI 3.1415926\n\nattribute vec2 texcoord : TEXCOORD_0;\n\nuniform sampler2D particleTexture;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nuniform float size : 1.0;\n\nvarying float v_Mag;\nvarying vec2 v_Uv;\n\nvoid main()\n{\n vec4 p = texture2D(particleTexture, texcoord);\n\n if (p.w > 0.0 && p.z > 1e-5) {\n gl_Position = worldViewProjection * vec4(p.xy * 2.0 - 1.0, 0.0, 1.0);\n }\n else {\n gl_Position = vec4(100000.0, 100000.0, 100000.0, 1.0);\n }\n\n v_Mag = p.z;\n v_Uv = p.xy;\n\n gl_PointSize = size;\n}\n\n@end\n\n@export ecgl.vfParticle.renderPoints.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\nuniform sampler2D gradientTexture;\nuniform sampler2D colorTexture;\nuniform sampler2D spriteTexture;\n\nvarying float v_Mag;\nvarying vec2 v_Uv;\n\nvoid main()\n{\n gl_FragColor = color;\n#ifdef SPRITETEXTURE_ENABLED\n gl_FragColor *= texture2D(spriteTexture, gl_PointCoord);\n if (color.a == 0.0) {\n discard;\n }\n#endif\n#ifdef GRADIENTTEXTURE_ENABLED\n gl_FragColor *= texture2D(gradientTexture, vec2(v_Mag, 0.5));\n#endif\n#ifdef COLORTEXTURE_ENABLED\n gl_FragColor *= texture2D(colorTexture, v_Uv);\n#endif\n}\n\n@end\n\n@export ecgl.vfParticle.renderLines.vertex\n\n#define PI 3.1415926\n\nattribute vec3 position : POSITION;\n\nuniform sampler2D particleTexture;\nuniform sampler2D prevParticleTexture;\n\nuniform float size : 1.0;\nuniform vec4 vp: VIEWPORT;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nvarying float v_Mag;\nvarying vec2 v_Uv;\n\n@import clay.util.rand\n\nvoid main()\n{\n vec4 p = texture2D(particleTexture, position.xy);\n vec4 p2 = texture2D(prevParticleTexture, position.xy);\n\n p.xy = p.xy * 2.0 - 1.0;\n p2.xy = p2.xy * 2.0 - 1.0;\n\n if (p.w > 0.0 && p.z > 1e-5) {\n vec2 dir = normalize(p.xy - p2.xy);\n vec2 norm = vec2(dir.y / vp.z, -dir.x / vp.w) * sign(position.z) * size;\n if (abs(position.z) == 2.0) {\n gl_Position = vec4(p.xy + norm, 0.0, 1.0);\n v_Uv = p.xy;\n v_Mag = p.z;\n }\n else {\n gl_Position = vec4(p2.xy + norm, 0.0, 1.0);\n v_Mag = p2.z;\n v_Uv = p2.xy;\n }\n gl_Position = worldViewProjection * gl_Position;\n }\n else {\n gl_Position = vec4(100000.0, 100000.0, 100000.0, 1.0);\n }\n}\n\n@end\n\n@export ecgl.vfParticle.renderLines.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\nuniform sampler2D gradientTexture;\nuniform sampler2D colorTexture;\n\nvarying float v_Mag;\nvarying vec2 v_Uv;\n\nvoid main()\n{\n gl_FragColor = color;\n #ifdef GRADIENTTEXTURE_ENABLED\n gl_FragColor *= texture2D(gradientTexture, vec2(v_Mag, 0.5));\n#endif\n#ifdef COLORTEXTURE_ENABLED\n gl_FragColor *= texture2D(colorTexture, v_Uv);\n#endif\n}\n\n@end\n");
var of = function () {
this.motionBlurFactor = .99,
this.vectorFieldTexture = new Dr({
type: wr.FLOAT,
flipY: !1
}),
this.particleLife = [5, 20],
this._particleType = "point",
this._particleSize = 1,
this.particleColor = [1, 1, 1, 1],
this.particleSpeedScaling = 1,
this._thisFrameTexture = null,
this._particlePass = null,
this._spawnTexture = null,
this._particleTexture0 = null,
this._particleTexture1 = null,
this._particlePointsMesh = null,
this._surfaceFrameBuffer = null,
this._elapsedTime = 0,
this._scene = null,
this._camera = null,
this._lastFrameTexture = null,
this._supersampling = 1,
this._downsampleTextures = [],
this._width = 512,
this._height = 512,
this.init()
};
of.prototype = {
constructor: of,
init: function () {
var e = {
type: wr.FLOAT,
minFilter: wr.NEAREST,
magFilter: wr.NEAREST,
useMipmap: !1
};
this._spawnTexture = new Dr(e),
this._particleTexture0 = new Dr(e),
this._particleTexture1 = new Dr(e),
this._frameBuffer = new zi({
depthBuffer: !1
}),
this._particlePass = new pn({
fragment: Xe.source("ecgl.vfParticle.particle.fragment")
}),
this._particlePass.setUniform("velocityTexture", this.vectorFieldTexture),
this._particlePass.setUniform("spawnTexture", this._spawnTexture),
this._downsamplePass = new pn({
fragment: Xe.source("clay.compositor.downsample")
});
var t = new Sr({
renderOrder: 10,
material: new le({
shader: new Xe(Xe.source("ecgl.vfParticle.renderPoints.vertex"), Xe.source("ecgl.vfParticle.renderPoints.fragment"))
}),
mode: Sr.POINTS,
geometry: new Vr({
dynamic: !0,
mainAttribute: "texcoord0"
})
})
, r = new Sr({
renderOrder: 10,
material: new le({
shader: new Xe(Xe.source("ecgl.vfParticle.renderLines.vertex"), Xe.source("ecgl.vfParticle.renderLines.fragment"))
}),
geometry: new af,
culling: !1
})
, i = new Sr({
material: new le({
shader: new Xe(Xe.source("ecgl.color.vertex"), Xe.source("ecgl.color.fragment"))
}),
geometry: new ki
});
i.material.enableTexture("diffuseMap"),
this._particlePointsMesh = t,
this._particleLinesMesh = r,
this._lastFrameFullQuadMesh = i,
this._camera = new un,
this._thisFrameTexture = new Dr,
this._lastFrameTexture = new Dr
},
setParticleDensity: function (e, t) {
for (var r = new Float32Array(e * t * 4), i = 0, n = this.particleLife, a = 0; a < e; a++)
for (var o = 0; o < t; o++,
i++) {
r[4 * i] = Math.random(),
r[4 * i + 1] = Math.random(),
r[4 * i + 2] = Math.random();
var s = (n[1] - n[0]) * Math.random() + n[0];
r[4 * i + 3] = s
}
"line" === this._particleType ? this._setLineGeometry(e, t) : this._setPointsGeometry(e, t),
this._spawnTexture.width = e,
this._spawnTexture.height = t,
this._spawnTexture.pixels = r,
this._particleTexture0.width = this._particleTexture1.width = e,
this._particleTexture0.height = this._particleTexture1.height = t,
this._particlePass.setUniform("textureSize", [e, t])
},
_setPointsGeometry: function (e, t) {
var r = e * t
, i = this._particlePointsMesh.geometry
, n = i.attributes;
n.texcoord0.init(r);
for (var a = 0, o = 0; o < e; o++)
for (var s = 0; s < t; s++,
a++)
n.texcoord0.value[2 * a] = o / e,
n.texcoord0.value[2 * a + 1] = s / t;
i.dirty()
},
_setLineGeometry: function (e, t) {
var r = e * t
, i = this._getParticleMesh().geometry;
i.setLineCount(r),
i.resetOffset();
for (var n = 0; n < e; n++)
for (var a = 0; a < t; a++)
i.addLine([n / e, a / t]);
i.dirty()
},
_getParticleMesh: function () {
return "line" === this._particleType ? this._particleLinesMesh : this._particlePointsMesh
},
update: function (e, t, r, i) {
var n = this._getParticleMesh()
, a = this._frameBuffer
, o = this._particlePass;
i && this._updateDownsampleTextures(e, t),
n.material.set("size", this._particleSize * this._supersampling),
n.material.set("color", this.particleColor),
o.setUniform("speedScaling", this.particleSpeedScaling),
a.attach(this._particleTexture1),
o.setUniform("firstFrameTime", i ? (this.particleLife[1] + this.particleLife[0]) / 2 : 0),
o.setUniform("particleTexture", this._particleTexture0),
o.setUniform("deltaTime", r),
o.setUniform("elapsedTime", this._elapsedTime),
o.render(e, a),
n.material.set("particleTexture", this._particleTexture1),
n.material.set("prevParticleTexture", this._particleTexture0),
a.attach(this._thisFrameTexture),
a.bind(e),
e.gl.clear(e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT);
var s = this._lastFrameFullQuadMesh;
s.material.set("diffuseMap", this._lastFrameTexture),
s.material.set("color", [1, 1, 1, this.motionBlurFactor]),
this._camera.update(!0),
e.renderPass([s, n], this._camera),
a.unbind(e),
this._downsample(e),
this._swapTexture(),
this._elapsedTime += r
},
_downsample: function (e) {
var t = this._downsampleTextures;
if (0 !== t.length)
for (var r = 0, i = this._thisFrameTexture, n = t[r]; n;)
this._frameBuffer.attach(n),
this._downsamplePass.setUniform("texture", i),
this._downsamplePass.setUniform("textureSize", [i.width, i.height]),
this._downsamplePass.render(e, this._frameBuffer),
i = n,
n = t[++r]
},
getSurfaceTexture: function () {
var e = this._downsampleTextures;
return e.length > 0 ? e[e.length - 1] : this._lastFrameTexture
},
setRegion: function (e) {
this._particlePass.setUniform("region", e)
},
resize: function (e, t) {
this._lastFrameTexture.width = e * this._supersampling,
this._lastFrameTexture.height = t * this._supersampling,
this._thisFrameTexture.width = e * this._supersampling,
this._thisFrameTexture.height = t * this._supersampling,
this._width = e,
this._height = t
},
setParticleSize: function (e) {
var t = this._getParticleMesh();
if (e <= 2)
return t.material.disableTexture("spriteTexture"),
void (t.material.transparent = !1);
this._spriteTexture || (this._spriteTexture = new Dr),
this._spriteTexture.image && this._spriteTexture.image.width === e || (this._spriteTexture.image = function (e) {
var t = document.createElement("canvas");
t.width = t.height = e;
var r = t.getContext("2d");
return r.fillStyle = "#fff",
r.arc(e / 2, e / 2, e / 2, 0, 2 * Math.PI),
r.fill(),
t
}(e),
this._spriteTexture.dirty()),
t.material.transparent = !0,
t.material.enableTexture("spriteTexture"),
t.material.set("spriteTexture", this._spriteTexture),
this._particleSize = e
},
setGradientTexture: function (e) {
var t = this._getParticleMesh().material;
t[e ? "enableTexture" : "disableTexture"]("gradientTexture"),
t.setUniform("gradientTexture", e)
},
setColorTextureImage: function (e, t) {
this._getParticleMesh().material.setTextureImage("colorTexture", e, t, {
flipY: !0
})
},
setParticleType: function (e) {
this._particleType = e
},
clearFrame: function (e) {
var t = this._frameBuffer;
t.attach(this._lastFrameTexture),
t.bind(e),
e.gl.clear(e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT),
t.unbind(e)
},
setSupersampling: function (e) {
this._supersampling = e,
this.resize(this._width, this._height)
},
_updateDownsampleTextures: function (e, t) {
for (var r = this._downsampleTextures, i = Math.max(Math.floor(Math.log(this._supersampling / t.getDevicePixelRatio()) / Math.log(2)), 0), n = 2, a = this._width * this._supersampling, o = this._height * this._supersampling, s = 0; s < i; s++)
r[s] = r[s] || new Dr,
r[s].width = a / n,
r[s].height = o / n,
n *= 2;
for (; s < r.length; s++)
r[s].dispose(e);
r.length = i
},
_swapTexture: function () {
var e = this._particleTexture0;
this._particleTexture0 = this._particleTexture1,
this._particleTexture1 = e,
e = this._thisFrameTexture,
this._thisFrameTexture = this._lastFrameTexture,
this._lastFrameTexture = e
},
dispose: function (e) {
e.disposeFrameBuffer(this._frameBuffer),
e.disposeTexture(this.vectorFieldTexture),
e.disposeTexture(this._spawnTexture),
e.disposeTexture(this._particleTexture0),
e.disposeTexture(this._particleTexture1),
e.disposeTexture(this._thisFrameTexture),
e.disposeTexture(this._lastFrameTexture),
e.disposeGeometry(this._particleLinesMesh.geometry),
e.disposeGeometry(this._particlePointsMesh.geometry),
e.disposeGeometry(this._lastFrameFullQuadMesh.geometry),
this._spriteTexture && e.disposeTexture(this._spriteTexture),
this._particlePass.dispose(e),
this._downsamplePass.dispose(e),
this._downsampleTextures.forEach((function (t) {
t.dispose(e)
}
))
}
};
const sf = of
, lf = i.ChartView.extend({
type: "flowGL",
__ecgl__: !0,
init: function (e, t) {
this.viewGL = new Il("orthographic"),
this.groupGL = new Ka.Node,
this.viewGL.add(this.groupGL),
this._particleSurface = new sf;
var r = new Ka.Mesh({
geometry: new Ka.PlaneGeometry,
material: new Ka.Material({
shader: new Ka.Shader({
vertex: Ka.Shader.source("ecgl.color.vertex"),
fragment: Ka.Shader.source("ecgl.color.fragment")
}),
transparent: !0
})
});
r.material.enableTexture("diffuseMap"),
this.groupGL.add(r),
this._planeMesh = r
},
render: function (e, t, r) {
var i = this._particleSurface;
i.setParticleType(e.get("particleType")),
i.setSupersampling(e.get("supersampling")),
this._updateData(e, r),
this._updateCamera(r.getWidth(), r.getHeight(), r.getDevicePixelRatio());
var n = Mn(e.get("particleDensity"), 128);
i.setParticleDensity(n, n);
var a = this._planeMesh
, o = +new Date
, s = this
, l = !0;
a.__percent = 0,
a.stopAnimation(),
a.animate("", {
loop: !0
}).when(1e5, {
__percent: 1
}).during((function () {
var e = +new Date
, t = Math.min(e - o, 20);
o += t,
s._renderer && (i.update(s._renderer, r, t / 1e3, l),
a.material.set("diffuseMap", i.getSurfaceTexture())),
l = !1
}
)).start();
var h = e.getModel("itemStyle")
, u = Ka.parseColor(h.get("color"));
u[3] *= Mn(h.get("opacity"), 1),
a.material.set("color", u),
i.setColorTextureImage(e.get("colorTexture"), r),
i.setParticleSize(e.get("particleSize")),
i.particleSpeedScaling = e.get("particleSpeed"),
i.motionBlurFactor = 1 - Math.pow(.1, e.get("particleTrail"))
},
updateTransform: function (e, t, r) {
this._updateData(e, r)
},
afterRender: function (e, t, r, i) {
var n = i.renderer;
this._renderer = n
},
_updateData: function (e, t) {
var r = e.coordinateSystem
, i = r.dimensions.map((function (t) {
return e.coordDimToDataDim(t)[0]
}
))
, n = e.getData()
, a = n.getDataExtent(i[0])
, o = n.getDataExtent(i[1])
, s = e.get("gridWidth")
, l = e.get("gridHeight");
if (null == s || "auto" === s) {
var h = (a[1] - a[0]) / (o[1] - o[0]);
s = Math.round(Math.sqrt(h * n.count()))
}
null != l && "auto" !== l || (l = Math.ceil(n.count() / s));
var u = this._particleSurface.vectorFieldTexture
, c = u.pixels;
if (c && c.length === l * s * 4)
for (var d = 0; d < c.length; d++)
c[d] = 0;
else
c = u.pixels = new Float32Array(s * l * 4);
var f = 0
, p = 1 / 0
, m = new Float32Array(2 * n.count())
, g = 0
, _ = [[1 / 0, 1 / 0], [-1 / 0, -1 / 0]];
n.each([i[0], i[1], "vx", "vy"], (function (e, t, i, n) {
var a = r.dataToPoint([e, t]);
m[g++] = a[0],
m[g++] = a[1],
_[0][0] = Math.min(a[0], _[0][0]),
_[0][1] = Math.min(a[1], _[0][1]),
_[1][0] = Math.max(a[0], _[1][0]),
_[1][1] = Math.max(a[1], _[1][1]);
var o = Math.sqrt(i * i + n * n);
f = Math.max(f, o),
p = Math.min(p, o)
}
)),
n.each(["vx", "vy"], (function (e, t, r) {
var i = Math.round((m[2 * r] - _[0][0]) / (_[1][0] - _[0][0]) * (s - 1))
, n = 4 * ((l - 1 - Math.round((m[2 * r + 1] - _[0][1]) / (_[1][1] - _[0][1]) * (l - 1))) * s + i);
c[n] = e / f * .5 + .5,
c[n + 1] = t / f * .5 + .5,
c[n + 3] = 1
}
)),
u.width = s,
u.height = l,
"bmap" === e.get("coordinateSystem") && this._fillEmptyPixels(u),
u.dirty(),
this._updatePlanePosition(_[0], _[1], e, t),
this._updateGradientTexture(n.getVisual("visualMeta"), [p, f])
},
_fillEmptyPixels: function (e) {
var t = e.pixels
, r = e.width
, i = e.height;
function n(e, n, a) {
e = Math.max(Math.min(e, r - 1), 0);
var o = 4 * ((n = Math.max(Math.min(n, i - 1), 0)) * (r - 1) + e);
return 0 !== t[o + 3] && (a[0] = t[o],
a[1] = t[o + 1],
!0)
}
function a(e, t, r) {
r[0] = e[0] + t[0],
r[1] = e[1] + t[1]
}
for (var o = [], s = [], l = [], h = [], u = [], c = 0, d = 0; d < i; d++)
for (var f = 0; f < r; f++) {
var p = 4 * (d * (r - 1) + f);
0 === t[p + 3] && (c = o[0] = o[1] = 0,
n(f - 1, d, s) && (c++,
a(s, o, o)),
n(f + 1, d, l) && (c++,
a(l, o, o)),
n(f, d - 1, h) && (c++,
a(h, o, o)),
n(f, d + 1, u) && (c++,
a(u, o, o)),
o[0] /= c,
o[1] /= c,
t[p] = o[0],
t[p + 1] = o[1]),
t[p + 3] = 1
}
},
_updateGradientTexture: function (e, t) {
if (e && e.length) {
this._gradientTexture = this._gradientTexture || new Ka.Texture2D({
image: document.createElement("canvas")
});
var r = this._gradientTexture
, i = r.image;
i.width = 200,
i.height = 1;
var n = i.getContext("2d")
, a = n.createLinearGradient(0, .5, i.width, .5);
e[0].stops.forEach((function (e) {
var r;
t[1] === t[0] ? r = 0 : (r = e.value / t[1],
r = Math.min(Math.max(r, 0), 1)),
a.addColorStop(r, e.color)
}
)),
n.fillStyle = a,
n.fillRect(0, 0, i.width, i.height),
r.dirty(),
this._particleSurface.setGradientTexture(this._gradientTexture)
} else
this._particleSurface.setGradientTexture(null)
},
_updatePlanePosition: function (e, t, r, i) {
var n = this._limitInViewportAndFullFill(e, t, r, i);
e = n.leftTop,
t = n.rightBottom,
this._particleSurface.setRegion(n.region),
this._planeMesh.position.set((e[0] + t[0]) / 2, i.getHeight() - (e[1] + t[1]) / 2, 0);
var a = t[0] - e[0]
, o = t[1] - e[1];
this._planeMesh.scale.set(a / 2, o / 2, 1),
this._particleSurface.resize(Math.max(Math.min(a, 2048), 1), Math.max(Math.min(o, 2048), 1)),
this._renderer && this._particleSurface.clearFrame(this._renderer)
},
_limitInViewportAndFullFill: function (e, t, r, i) {
var n = [Math.max(e[0], 0), Math.max(e[1], 0)]
, a = [Math.min(t[0], i.getWidth()), Math.min(t[1], i.getHeight())];
if ("bmap" === r.get("coordinateSystem")) {
var o = r.getData().getDataExtent(r.coordDimToDataDim("lng")[0]);
Math.floor(o[1] - o[0]) >= 359 && (n[0] > 0 && (n[0] = 0),
a[0] < i.getWidth() && (a[0] = i.getWidth()))
}
var s = t[0] - e[0]
, l = t[1] - e[1]
, h = a[0] - n[0]
, u = a[1] - n[1];
return {
leftTop: n,
rightBottom: a,
region: [(n[0] - e[0]) / s, 1 - u / l - (n[1] - e[1]) / l, h / s, u / l]
}
},
_updateCamera: function (e, t, r) {
this.viewGL.setViewport(0, 0, e, t, r);
var i = this.viewGL.camera;
i.left = i.bottom = 0,
i.top = t,
i.right = e,
i.near = 0,
i.far = 100,
i.position.z = 10
},
remove: function () {
this._planeMesh.stopAnimation(),
this.groupGL.removeAll()
},
dispose: function () {
this._renderer && this._particleSurface.dispose(this._renderer),
this.groupGL.removeAll()
}
});
(0,
i.use)((function (e) {
e.registerChartView(lf),
e.registerSeriesModel(nf)
}
));
var hf = i.SeriesModel.extend({
type: "series.linesGL",
dependencies: ["grid", "geo"],
visualStyleAccessPath: "lineStyle",
visualDrawType: "stroke",
streamEnabled: !0,
init: function (e) {
var t = this._processFlatCoordsArray(e.data);
this._flatCoords = t.flatCoords,
this._flatCoordsOffset = t.flatCoordsOffset,
t.flatCoords && (e.data = new Float32Array(t.count)),
hf.superApply(this, "init", arguments)
},
mergeOption: function (e) {
var t = this._processFlatCoordsArray(e.data);
this._flatCoords = t.flatCoords,
this._flatCoordsOffset = t.flatCoordsOffset,
t.flatCoords && (e.data = new Float32Array(t.count)),
hf.superApply(this, "mergeOption", arguments)
},
appendData: function (e) {
var t = this._processFlatCoordsArray(e.data);
t.flatCoords && (this._flatCoords ? (this._flatCoords = Aa(this._flatCoords, t.flatCoords),
this._flatCoordsOffset = Aa(this._flatCoordsOffset, t.flatCoordsOffset)) : (this._flatCoords = t.flatCoords,
this._flatCoordsOffset = t.flatCoordsOffset),
e.data = new Float32Array(t.count)),
this.getRawData().appendData(e.data)
},
_getCoordsFromItemModel: function (e) {
var t = this.getData().getItemModel(e);
return t.option instanceof Array ? t.option : t.getShallow("coords")
},
getLineCoordsCount: function (e) {
return this._flatCoordsOffset ? this._flatCoordsOffset[2 * e + 1] : this._getCoordsFromItemModel(e).length
},
getLineCoords: function (e, t) {
if (this._flatCoordsOffset) {
for (var r = this._flatCoordsOffset[2 * e], i = this._flatCoordsOffset[2 * e + 1], n = 0; n < i; n++)
t[n] = t[n] || [],
t[n][0] = this._flatCoords[r + 2 * n],
t[n][1] = this._flatCoords[r + 2 * n + 1];
return i
}
var a = this._getCoordsFromItemModel(e);
for (n = 0; n < a.length; n++)
t[n] = t[n] || [],
t[n][0] = a[n][0],
t[n][1] = a[n][1];
return a.length
},
_processFlatCoordsArray: function (e) {
var t = 0;
if (this._flatCoords && (t = this._flatCoords.length),
"number" == typeof e[0]) {
for (var r = e.length, i = new Uint32Array(r), n = new Float64Array(r), a = 0, o = 0, s = 0, l = 0; l < r;) {
s++;
var h = e[l++];
i[o++] = a + t,
i[o++] = h;
for (var u = 0; u < h; u++) {
var c = e[l++]
, d = e[l++];
n[a++] = c,
n[a++] = d
}
}
return {
flatCoordsOffset: new Uint32Array(i.buffer, 0, o),
flatCoords: n,
count: s
}
}
return {
flatCoordsOffset: null,
flatCoords: null,
count: e.length
}
},
getInitialData: function (e, t) {
var r = new i.List(["value"], this);
return r.hasItemOption = !1,
r.initData(e.data, [], (function (e, t, i, n) {
if (e instanceof Array)
return NaN;
r.hasItemOption = !0;
var a = e.value;
return null != a ? a instanceof Array ? a[n] : a : void 0
}
)),
r
},
defaultOption: {
coordinateSystem: "geo",
zlevel: 10,
progressive: 1e4,
progressiveThreshold: 5e4,
blendMode: "source-over",
lineStyle: {
opacity: .8
},
postEffect: {
enable: !1,
colorCorrection: {
exposure: 0,
brightness: 0,
contrast: 1,
saturation: 1,
enable: !0
}
}
}
});
const uf = hf
, cf = i.ChartView.extend({
type: "linesGL",
__ecgl__: !0,
init: function (e, t) {
this.groupGL = new Ka.Node,
this.viewGL = new Il("orthographic"),
this.viewGL.add(this.groupGL),
this._glViewHelper = new wd(this.viewGL),
this._nativeLinesShader = Ka.createShader("ecgl.lines3D"),
this._meshLinesShader = Ka.createShader("ecgl.meshLines3D"),
this._linesMeshes = [],
this._currentStep = 0
},
render: function (e, t, r) {
this.groupGL.removeAll(),
this._glViewHelper.reset(e, r);
var i = this._linesMeshes[0];
i || (i = this._linesMeshes[0] = this._createLinesMesh(e)),
this._linesMeshes.length = 1,
this.groupGL.add(i),
this._updateLinesMesh(e, i, 0, e.getData().count()),
this.viewGL.setPostEffect(e.getModel("postEffect"), r)
},
incrementalPrepareRender: function (e, t, r) {
this.groupGL.removeAll(),
this._glViewHelper.reset(e, r),
this._currentStep = 0,
this.viewGL.setPostEffect(e.getModel("postEffect"), r)
},
incrementalRender: function (e, t, r, i) {
var n = this._linesMeshes[this._currentStep];
n || (n = this._createLinesMesh(t),
this._linesMeshes[this._currentStep] = n),
this._updateLinesMesh(t, n, e.start, e.end),
this.groupGL.add(n),
i.getZr().refresh(),
this._currentStep++
},
updateTransform: function (e, t, r) {
e.coordinateSystem.getRoamTransform && this._glViewHelper.updateTransform(e, r)
},
_createLinesMesh: function (e) {
return new Ka.Mesh({
$ignorePicking: !0,
material: new Ka.Material({
shader: Ka.createShader("ecgl.lines3D"),
transparent: !0,
depthMask: !1,
depthTest: !1
}),
geometry: new Hd({
segmentScale: 10,
useNativeLine: !0,
dynamic: !1
}),
mode: Ka.Mesh.LINES,
culling: !1
})
},
_updateLinesMesh: function (e, t, r, i) {
var n = e.getData();
t.material.blend = "lighter" === e.get("blendMode") ? Ka.additiveBlend : null;
var a = e.get("lineStyle.curveness") || 0
, o = e.get("polyline")
, s = t.geometry
, l = e.coordinateSystem
, h = Mn(e.get("lineStyle.width"), 1);
h > 1 ? (t.material.shader !== this._meshLinesShader && t.material.attachShader(this._meshLinesShader),
t.mode = Ka.Mesh.TRIANGLES) : (t.material.shader !== this._nativeLinesShader && t.material.attachShader(this._nativeLinesShader),
t.mode = Ka.Mesh.LINES),
r = r || 0,
i = i || n.count(),
s.resetOffset();
var u = 0
, c = 0
, d = []
, f = []
, p = []
, m = []
, g = []
, _ = .3
, v = .7;
function y() {
f[0] = d[0] * v + m[0] * _ - (d[1] - m[1]) * a,
f[1] = d[1] * v + m[1] * _ - (m[0] - d[0]) * a,
p[0] = d[0] * _ + m[0] * v - (d[1] - m[1]) * a,
p[1] = d[1] * _ + m[1] * v - (m[0] - d[0]) * a
}
if (o || 0 !== a)
for (var x = r; x < i; x++)
if (o) {
var b = e.getLineCoordsCount(x);
u += s.getPolylineVertexCount(b),
c += s.getPolylineTriangleCount(b)
} else
e.getLineCoords(x, g),
this._glViewHelper.dataToPoint(l, g[0], d),
this._glViewHelper.dataToPoint(l, g[1], m),
y(),
u += s.getCubicCurveVertexCount(d, f, p, m),
c += s.getCubicCurveTriangleCount(d, f, p, m);
else {
var w = i - r;
u += w * s.getLineVertexCount(),
c += w * s.getLineVertexCount()
}
s.setVertexCount(u),
s.setTriangleCount(c);
var T = r
, S = [];
for (x = r; x < i; x++) {
Ka.parseColor(Ih(n, T), S);
var M = Mn(Rh(n, T), 1);
S[3] *= M,
b = e.getLineCoords(x, g);
for (var A = 0; A < b; A++)
this._glViewHelper.dataToPoint(l, g[A], g[A]);
o ? s.addPolyline(g, S, h, 0, b) : 0 !== a ? (d = g[0],
m = g[1],
y(),
s.addCubicCurve(d, f, p, m, S, h)) : s.addPolyline(g, S, h, 0, 2),
T++
}
},
dispose: function () {
this.groupGL.removeAll()
},
remove: function () {
this.groupGL.removeAll()
}
});
(0,
i.use)((function (e) {
e.registerChartView(cf),
e.registerSeriesModel(uf)
}
))
}
,
83: t => {
t.exports = e
}
}
, r = {};
function i(e) {
if (r[e])
return r[e].exports;
var n = r[e] = {
exports: {}
};
return t[e](n, n.exports, i),
n.exports
}
return i.g = function () {
if ("object" == typeof globalThis)
return globalThis;
try {
return this || new Function("return this")()
} catch (e) {
if ("object" == typeof window)
return window
}
}(),
i.r = e => {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(e, "__esModule", {
value: !0
})
}
,
i(468)
}
)()
}
));