Skip to content

Instantly share code, notes, and snippets.

@mateitudor
Created March 13, 2023 09:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mateitudor/0ec7dae8ff6a4248d6fa0b9acb21e927 to your computer and use it in GitHub Desktop.
Save mateitudor/0ec7dae8ff6a4248d6fa0b9acb21e927 to your computer and use it in GitHub Desktop.
function t(t) {
return t && t.__esModule ? t.default : t;
}
/**
* @license
* Copyright 2010-2021 Three.js Authors
* SPDX-License-Identifier: MIT
*/ const e = "136",
n = 100,
i = 301,
r = 302,
s = 303,
a = 304,
o = 306,
l = 307,
h = 1e3,
c = 1001,
u = 1002,
d = 1003,
p = 1004,
m = 1005,
f = 1006,
g = 1008,
v = 1009,
x = 1012,
y = 1014,
_ = 1015,
b = 1016,
w = 1020,
M = 1022,
S = 1023,
E = 1026,
T = 1027,
A = 2300,
L = 2301,
C = 2302,
R = 2400,
P = 2401,
D = 2402,
I = 2500,
N = 3e3,
z = 3001,
O = 7680,
F = 35044,
B = 35048,
U = "300 es";
class H {
addEventListener(t, e) {
void 0 === this._listeners && (this._listeners = {});
const n = this._listeners;
void 0 === n[t] && (n[t] = []), -1 === n[t].indexOf(e) && n[t].push(e);
}
hasEventListener(t, e) {
if (void 0 === this._listeners) return !1;
const n = this._listeners;
return void 0 !== n[t] && -1 !== n[t].indexOf(e);
}
removeEventListener(t, e) {
if (void 0 === this._listeners) return;
const n = this._listeners[t];
if (void 0 !== n) {
const t = n.indexOf(e);
-1 !== t && n.splice(t, 1);
}
}
dispatchEvent(t) {
if (void 0 === this._listeners) return;
const e = this._listeners[t.type];
if (void 0 !== e) {
t.target = this;
const n = e.slice(0);
for (let e = 0, i = n.length; e < i; e++) n[e].call(this, t);
t.target = null;
}
}
}
const V = [];
for (let t = 0; t < 256; t++) V[t] = (t < 16 ? "0" : "") + t.toString(16);
const k = Math.PI / 180,
G = 180 / Math.PI;
function W() {
const t = (4294967295 * Math.random()) | 0,
e = (4294967295 * Math.random()) | 0,
n = (4294967295 * Math.random()) | 0,
i = (4294967295 * Math.random()) | 0;
return (V[255 & t] + V[(t >> 8) & 255] + V[(t >> 16) & 255] + V[(t >> 24) & 255] + "-" + V[255 & e] + V[(e >> 8) & 255] + "-" + V[((e >> 16) & 15) | 64] + V[(e >> 24) & 255] + "-" + V[(63 & n) | 128] + V[(n >> 8) & 255] + "-" + V[(n >> 16) & 255] + V[(n >> 24) & 255] + V[255 & i] + V[(i >> 8) & 255] + V[(i >> 16) & 255] + V[(i >> 24) & 255]).toUpperCase();
}
function j(t, e, n) {
return Math.max(e, Math.min(n, t));
}
function q(t, e) {
return ((t % e) + e) % e;
}
function X(t, e, n) {
return (1 - n) * t + n * e;
}
function Y(t) {
return 0 == (t & (t - 1)) && 0 !== t;
}
function J(t) {
return Math.pow(2, Math.floor(Math.log(t) / Math.LN2));
}
class $ {
constructor(t = 0, e = 0) {
(this.x = t), (this.y = e);
}
get width() {
return this.x;
}
set width(t) {
this.x = t;
}
get height() {
return this.y;
}
set height(t) {
this.y = t;
}
set(t, e) {
return (this.x = t), (this.y = e), this;
}
setScalar(t) {
return (this.x = t), (this.y = t), this;
}
setX(t) {
return (this.x = t), this;
}
setY(t) {
return (this.y = t), this;
}
setComponent(t, e) {
switch (t) {
case 0:
this.x = e;
break;
case 1:
this.y = e;
break;
default:
throw new Error("index is out of range: " + t);
}
return this;
}
getComponent(t) {
switch (t) {
case 0:
return this.x;
case 1:
return this.y;
default:
throw new Error("index is out of range: " + t);
}
}
clone() {
return new this.constructor(this.x, this.y);
}
copy(t) {
return (this.x = t.x), (this.y = t.y), this;
}
add(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), this);
}
addScalar(t) {
return (this.x += t), (this.y += t), this;
}
addVectors(t, e) {
return (this.x = t.x + e.x), (this.y = t.y + e.y), this;
}
addScaledVector(t, e) {
return (this.x += t.x * e), (this.y += t.y * e), this;
}
sub(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), this);
}
subScalar(t) {
return (this.x -= t), (this.y -= t), this;
}
subVectors(t, e) {
return (this.x = t.x - e.x), (this.y = t.y - e.y), this;
}
multiply(t) {
return (this.x *= t.x), (this.y *= t.y), this;
}
multiplyScalar(t) {
return (this.x *= t), (this.y *= t), this;
}
divide(t) {
return (this.x /= t.x), (this.y /= t.y), this;
}
divideScalar(t) {
return this.multiplyScalar(1 / t);
}
applyMatrix3(t) {
const e = this.x,
n = this.y,
i = t.elements;
return (this.x = i[0] * e + i[3] * n + i[6]), (this.y = i[1] * e + i[4] * n + i[7]), this;
}
min(t) {
return (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), this;
}
max(t) {
return (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), this;
}
clamp(t, e) {
return (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), this;
}
clampScalar(t, e) {
return (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), this;
}
clampLength(t, e) {
const n = this.length();
return this.divideScalar(n || 1).multiplyScalar(Math.max(t, Math.min(e, n)));
}
floor() {
return (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), this;
}
ceil() {
return (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), this;
}
round() {
return (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), this;
}
roundToZero() {
return (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), this;
}
negate() {
return (this.x = -this.x), (this.y = -this.y), this;
}
dot(t) {
return this.x * t.x + this.y * t.y;
}
cross(t) {
return this.x * t.y - this.y * t.x;
}
lengthSq() {
return this.x * this.x + this.y * this.y;
}
length() {
return Math.sqrt(this.x * this.x + this.y * this.y);
}
manhattanLength() {
return Math.abs(this.x) + Math.abs(this.y);
}
normalize() {
return this.divideScalar(this.length() || 1);
}
angle() {
return Math.atan2(-this.y, -this.x) + Math.PI;
}
distanceTo(t) {
return Math.sqrt(this.distanceToSquared(t));
}
distanceToSquared(t) {
const e = this.x - t.x,
n = this.y - t.y;
return e * e + n * n;
}
manhattanDistanceTo(t) {
return Math.abs(this.x - t.x) + Math.abs(this.y - t.y);
}
setLength(t) {
return this.normalize().multiplyScalar(t);
}
lerp(t, e) {
return (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), this;
}
lerpVectors(t, e, n) {
return (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), this;
}
equals(t) {
return t.x === this.x && t.y === this.y;
}
fromArray(t, e = 0) {
return (this.x = t[e]), (this.y = t[e + 1]), this;
}
toArray(t = [], e = 0) {
return (t[e] = this.x), (t[e + 1] = this.y), t;
}
fromBufferAttribute(t, e, n) {
return void 0 !== n && console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."), (this.x = t.getX(e)), (this.y = t.getY(e)), this;
}
rotateAround(t, e) {
const n = Math.cos(e),
i = Math.sin(e),
r = this.x - t.x,
s = this.y - t.y;
return (this.x = r * n - s * i + t.x), (this.y = r * i + s * n + t.y), this;
}
random() {
return (this.x = Math.random()), (this.y = Math.random()), this;
}
*[Symbol.iterator]() {
yield this.x, yield this.y;
}
}
$.prototype.isVector2 = !0;
class Z {
constructor() {
(this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1]), arguments.length > 0 && console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.");
}
set(t, e, n, i, r, s, a, o, l) {
const h = this.elements;
return (h[0] = t), (h[1] = i), (h[2] = a), (h[3] = e), (h[4] = r), (h[5] = o), (h[6] = n), (h[7] = s), (h[8] = l), this;
}
identity() {
return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1), this;
}
copy(t) {
const e = this.elements,
n = t.elements;
return (e[0] = n[0]), (e[1] = n[1]), (e[2] = n[2]), (e[3] = n[3]), (e[4] = n[4]), (e[5] = n[5]), (e[6] = n[6]), (e[7] = n[7]), (e[8] = n[8]), this;
}
extractBasis(t, e, n) {
return t.setFromMatrix3Column(this, 0), e.setFromMatrix3Column(this, 1), n.setFromMatrix3Column(this, 2), this;
}
setFromMatrix4(t) {
const e = t.elements;
return this.set(e[0], e[4], e[8], e[1], e[5], e[9], e[2], e[6], e[10]), this;
}
multiply(t) {
return this.multiplyMatrices(this, t);
}
premultiply(t) {
return this.multiplyMatrices(t, this);
}
multiplyMatrices(t, e) {
const n = t.elements,
i = e.elements,
r = this.elements,
s = n[0],
a = n[3],
o = n[6],
l = n[1],
h = n[4],
c = n[7],
u = n[2],
d = n[5],
p = n[8],
m = i[0],
f = i[3],
g = i[6],
v = i[1],
x = i[4],
y = i[7],
_ = i[2],
b = i[5],
w = i[8];
return (r[0] = s * m + a * v + o * _), (r[3] = s * f + a * x + o * b), (r[6] = s * g + a * y + o * w), (r[1] = l * m + h * v + c * _), (r[4] = l * f + h * x + c * b), (r[7] = l * g + h * y + c * w), (r[2] = u * m + d * v + p * _), (r[5] = u * f + d * x + p * b), (r[8] = u * g + d * y + p * w), this;
}
multiplyScalar(t) {
const e = this.elements;
return (e[0] *= t), (e[3] *= t), (e[6] *= t), (e[1] *= t), (e[4] *= t), (e[7] *= t), (e[2] *= t), (e[5] *= t), (e[8] *= t), this;
}
determinant() {
const t = this.elements,
e = t[0],
n = t[1],
i = t[2],
r = t[3],
s = t[4],
a = t[5],
o = t[6],
l = t[7],
h = t[8];
return e * s * h - e * a * l - n * r * h + n * a * o + i * r * l - i * s * o;
}
invert() {
const t = this.elements,
e = t[0],
n = t[1],
i = t[2],
r = t[3],
s = t[4],
a = t[5],
o = t[6],
l = t[7],
h = t[8],
c = h * s - a * l,
u = a * o - h * r,
d = l * r - s * o,
p = e * c + n * u + i * d;
if (0 === p) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);
const m = 1 / p;
return (t[0] = c * m), (t[1] = (i * l - h * n) * m), (t[2] = (a * n - i * s) * m), (t[3] = u * m), (t[4] = (h * e - i * o) * m), (t[5] = (i * r - a * e) * m), (t[6] = d * m), (t[7] = (n * o - l * e) * m), (t[8] = (s * e - n * r) * m), this;
}
transpose() {
let t;
const e = this.elements;
return (t = e[1]), (e[1] = e[3]), (e[3] = t), (t = e[2]), (e[2] = e[6]), (e[6] = t), (t = e[5]), (e[5] = e[7]), (e[7] = t), this;
}
getNormalMatrix(t) {
return this.setFromMatrix4(t).invert().transpose();
}
transposeIntoArray(t) {
const e = this.elements;
return (t[0] = e[0]), (t[1] = e[3]), (t[2] = e[6]), (t[3] = e[1]), (t[4] = e[4]), (t[5] = e[7]), (t[6] = e[2]), (t[7] = e[5]), (t[8] = e[8]), this;
}
setUvTransform(t, e, n, i, r, s, a) {
const o = Math.cos(r),
l = Math.sin(r);
return this.set(n * o, n * l, -n * (o * s + l * a) + s + t, -i * l, i * o, -i * (-l * s + o * a) + a + e, 0, 0, 1), this;
}
scale(t, e) {
const n = this.elements;
return (n[0] *= t), (n[3] *= t), (n[6] *= t), (n[1] *= e), (n[4] *= e), (n[7] *= e), this;
}
rotate(t) {
const e = Math.cos(t),
n = Math.sin(t),
i = this.elements,
r = i[0],
s = i[3],
a = i[6],
o = i[1],
l = i[4],
h = i[7];
return (i[0] = e * r + n * o), (i[3] = e * s + n * l), (i[6] = e * a + n * h), (i[1] = -n * r + e * o), (i[4] = -n * s + e * l), (i[7] = -n * a + e * h), this;
}
translate(t, e) {
const n = this.elements;
return (n[0] += t * n[2]), (n[3] += t * n[5]), (n[6] += t * n[8]), (n[1] += e * n[2]), (n[4] += e * n[5]), (n[7] += e * n[8]), this;
}
equals(t) {
const e = this.elements,
n = t.elements;
for (let t = 0; t < 9; t++) if (e[t] !== n[t]) return !1;
return !0;
}
fromArray(t, e = 0) {
for (let n = 0; n < 9; n++) this.elements[n] = t[n + e];
return this;
}
toArray(t = [], e = 0) {
const n = this.elements;
return (t[e] = n[0]), (t[e + 1] = n[1]), (t[e + 2] = n[2]), (t[e + 3] = n[3]), (t[e + 4] = n[4]), (t[e + 5] = n[5]), (t[e + 6] = n[6]), (t[e + 7] = n[7]), (t[e + 8] = n[8]), t;
}
clone() {
return new this.constructor().fromArray(this.elements);
}
}
function Q(t) {
if (0 === t.length) return -1 / 0;
let e = t[0];
for (let n = 1, i = t.length; n < i; ++n) t[n] > e && (e = t[n]);
return e;
}
Z.prototype.isMatrix3 = !0;
Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array;
function K(t) {
return document.createElementNS("http://www.w3.org/1999/xhtml", t);
}
let tt;
class et {
static getDataURL(t) {
if (/^data:/i.test(t.src)) return t.src;
if ("undefined" == typeof HTMLCanvasElement) return t.src;
let e;
if (t instanceof HTMLCanvasElement) e = t;
else {
void 0 === tt && (tt = K("canvas")), (tt.width = t.width), (tt.height = t.height);
const n = tt.getContext("2d");
t instanceof ImageData ? n.putImageData(t, 0, 0) : n.drawImage(t, 0, 0, t.width, t.height), (e = tt);
}
return e.width > 2048 || e.height > 2048 ? (console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons", t), e.toDataURL("image/jpeg", 0.6)) : e.toDataURL("image/png");
}
}
let nt = 0;
class it extends H {
constructor(t = it.DEFAULT_IMAGE, e = it.DEFAULT_MAPPING, n = 1001, i = 1001, r = 1006, s = 1008, a = 1023, o = 1009, l = 1, h = 3e3) {
super(), Object.defineProperty(this, "id", { value: nt++ }), (this.uuid = W()), (this.name = ""), (this.image = t), (this.mipmaps = []), (this.mapping = e), (this.wrapS = n), (this.wrapT = i), (this.magFilter = r), (this.minFilter = s), (this.anisotropy = l), (this.format = a), (this.internalFormat = null), (this.type = o), (this.offset = new $(0, 0)), (this.repeat = new $(1, 1)), (this.center = new $(0, 0)), (this.rotation = 0), (this.matrixAutoUpdate = !0), (this.matrix = new Z()), (this.generateMipmaps = !0), (this.premultiplyAlpha = !1), (this.flipY = !0), (this.unpackAlignment = 4), (this.encoding = h), (this.userData = {}), (this.version = 0), (this.onUpdate = null), (this.isRenderTargetTexture = !1);
}
updateMatrix() {
this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y);
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return (this.name = t.name), (this.image = t.image), (this.mipmaps = t.mipmaps.slice(0)), (this.mapping = t.mapping), (this.wrapS = t.wrapS), (this.wrapT = t.wrapT), (this.magFilter = t.magFilter), (this.minFilter = t.minFilter), (this.anisotropy = t.anisotropy), (this.format = t.format), (this.internalFormat = t.internalFormat), (this.type = t.type), this.offset.copy(t.offset), this.repeat.copy(t.repeat), this.center.copy(t.center), (this.rotation = t.rotation), (this.matrixAutoUpdate = t.matrixAutoUpdate), this.matrix.copy(t.matrix), (this.generateMipmaps = t.generateMipmaps), (this.premultiplyAlpha = t.premultiplyAlpha), (this.flipY = t.flipY), (this.unpackAlignment = t.unpackAlignment), (this.encoding = t.encoding), (this.userData = JSON.parse(JSON.stringify(t.userData))), this;
}
toJSON(t) {
const e = void 0 === t || "string" == typeof t;
if (!e && void 0 !== t.textures[this.uuid]) return t.textures[this.uuid];
const n = { metadata: { version: 4.5, type: "Texture", generator: "Texture.toJSON" }, uuid: this.uuid, name: this.name, mapping: this.mapping, repeat: [this.repeat.x, this.repeat.y], offset: [this.offset.x, this.offset.y], center: [this.center.x, this.center.y], rotation: this.rotation, wrap: [this.wrapS, this.wrapT], format: this.format, type: this.type, encoding: this.encoding, minFilter: this.minFilter, magFilter: this.magFilter, anisotropy: this.anisotropy, flipY: this.flipY, premultiplyAlpha: this.premultiplyAlpha, unpackAlignment: this.unpackAlignment };
if (void 0 !== this.image) {
const i = this.image;
if ((void 0 === i.uuid && (i.uuid = W()), !e && void 0 === t.images[i.uuid])) {
let e;
if (Array.isArray(i)) {
e = [];
for (let t = 0, n = i.length; t < n; t++) i[t].isDataTexture ? e.push(rt(i[t].image)) : e.push(rt(i[t]));
} else e = rt(i);
t.images[i.uuid] = { uuid: i.uuid, url: e };
}
n.image = i.uuid;
}
return "{}" !== JSON.stringify(this.userData) && (n.userData = this.userData), e || (t.textures[this.uuid] = n), n;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
transformUv(t) {
if (300 !== this.mapping) return t;
if ((t.applyMatrix3(this.matrix), t.x < 0 || t.x > 1))
switch (this.wrapS) {
case h:
t.x = t.x - Math.floor(t.x);
break;
case c:
t.x = t.x < 0 ? 0 : 1;
break;
case u:
1 === Math.abs(Math.floor(t.x) % 2) ? (t.x = Math.ceil(t.x) - t.x) : (t.x = t.x - Math.floor(t.x));
}
if (t.y < 0 || t.y > 1)
switch (this.wrapT) {
case h:
t.y = t.y - Math.floor(t.y);
break;
case c:
t.y = t.y < 0 ? 0 : 1;
break;
case u:
1 === Math.abs(Math.floor(t.y) % 2) ? (t.y = Math.ceil(t.y) - t.y) : (t.y = t.y - Math.floor(t.y));
}
return this.flipY && (t.y = 1 - t.y), t;
}
set needsUpdate(t) {
!0 === t && this.version++;
}
}
function rt(t) {
return ("undefined" != typeof HTMLImageElement && t instanceof HTMLImageElement) || ("undefined" != typeof HTMLCanvasElement && t instanceof HTMLCanvasElement) || ("undefined" != typeof ImageBitmap && t instanceof ImageBitmap) ? et.getDataURL(t) : t.data ? { data: Array.prototype.slice.call(t.data), width: t.width, height: t.height, type: t.data.constructor.name } : (console.warn("THREE.Texture: Unable to serialize Texture."), {});
}
(it.DEFAULT_IMAGE = void 0), (it.DEFAULT_MAPPING = 300), (it.prototype.isTexture = !0);
class st {
constructor(t = 0, e = 0, n = 0, i = 1) {
(this.x = t), (this.y = e), (this.z = n), (this.w = i);
}
get width() {
return this.z;
}
set width(t) {
this.z = t;
}
get height() {
return this.w;
}
set height(t) {
this.w = t;
}
set(t, e, n, i) {
return (this.x = t), (this.y = e), (this.z = n), (this.w = i), this;
}
setScalar(t) {
return (this.x = t), (this.y = t), (this.z = t), (this.w = t), this;
}
setX(t) {
return (this.x = t), this;
}
setY(t) {
return (this.y = t), this;
}
setZ(t) {
return (this.z = t), this;
}
setW(t) {
return (this.w = t), this;
}
setComponent(t, e) {
switch (t) {
case 0:
this.x = e;
break;
case 1:
this.y = e;
break;
case 2:
this.z = e;
break;
case 3:
this.w = e;
break;
default:
throw new Error("index is out of range: " + t);
}
return this;
}
getComponent(t) {
switch (t) {
case 0:
return this.x;
case 1:
return this.y;
case 2:
return this.z;
case 3:
return this.w;
default:
throw new Error("index is out of range: " + t);
}
}
clone() {
return new this.constructor(this.x, this.y, this.z, this.w);
}
copy(t) {
return (this.x = t.x), (this.y = t.y), (this.z = t.z), (this.w = void 0 !== t.w ? t.w : 1), this;
}
add(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), (this.z += t.z), (this.w += t.w), this);
}
addScalar(t) {
return (this.x += t), (this.y += t), (this.z += t), (this.w += t), this;
}
addVectors(t, e) {
return (this.x = t.x + e.x), (this.y = t.y + e.y), (this.z = t.z + e.z), (this.w = t.w + e.w), this;
}
addScaledVector(t, e) {
return (this.x += t.x * e), (this.y += t.y * e), (this.z += t.z * e), (this.w += t.w * e), this;
}
sub(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), (this.z -= t.z), (this.w -= t.w), this);
}
subScalar(t) {
return (this.x -= t), (this.y -= t), (this.z -= t), (this.w -= t), this;
}
subVectors(t, e) {
return (this.x = t.x - e.x), (this.y = t.y - e.y), (this.z = t.z - e.z), (this.w = t.w - e.w), this;
}
multiply(t) {
return (this.x *= t.x), (this.y *= t.y), (this.z *= t.z), (this.w *= t.w), this;
}
multiplyScalar(t) {
return (this.x *= t), (this.y *= t), (this.z *= t), (this.w *= t), this;
}
applyMatrix4(t) {
const e = this.x,
n = this.y,
i = this.z,
r = this.w,
s = t.elements;
return (this.x = s[0] * e + s[4] * n + s[8] * i + s[12] * r), (this.y = s[1] * e + s[5] * n + s[9] * i + s[13] * r), (this.z = s[2] * e + s[6] * n + s[10] * i + s[14] * r), (this.w = s[3] * e + s[7] * n + s[11] * i + s[15] * r), this;
}
divideScalar(t) {
return this.multiplyScalar(1 / t);
}
setAxisAngleFromQuaternion(t) {
this.w = 2 * Math.acos(t.w);
const e = Math.sqrt(1 - t.w * t.w);
return e < 1e-4 ? ((this.x = 1), (this.y = 0), (this.z = 0)) : ((this.x = t.x / e), (this.y = t.y / e), (this.z = t.z / e)), this;
}
setAxisAngleFromRotationMatrix(t) {
let e, n, i, r;
const s = 0.01,
a = 0.1,
o = t.elements,
l = o[0],
h = o[4],
c = o[8],
u = o[1],
d = o[5],
p = o[9],
m = o[2],
f = o[6],
g = o[10];
if (Math.abs(h - u) < s && Math.abs(c - m) < s && Math.abs(p - f) < s) {
if (Math.abs(h + u) < a && Math.abs(c + m) < a && Math.abs(p + f) < a && Math.abs(l + d + g - 3) < a) return this.set(1, 0, 0, 0), this;
e = Math.PI;
const t = (l + 1) / 2,
o = (d + 1) / 2,
v = (g + 1) / 2,
x = (h + u) / 4,
y = (c + m) / 4,
_ = (p + f) / 4;
return t > o && t > v ? (t < s ? ((n = 0), (i = 0.707106781), (r = 0.707106781)) : ((n = Math.sqrt(t)), (i = x / n), (r = y / n))) : o > v ? (o < s ? ((n = 0.707106781), (i = 0), (r = 0.707106781)) : ((i = Math.sqrt(o)), (n = x / i), (r = _ / i))) : v < s ? ((n = 0.707106781), (i = 0.707106781), (r = 0)) : ((r = Math.sqrt(v)), (n = y / r), (i = _ / r)), this.set(n, i, r, e), this;
}
let v = Math.sqrt((f - p) * (f - p) + (c - m) * (c - m) + (u - h) * (u - h));
return Math.abs(v) < 0.001 && (v = 1), (this.x = (f - p) / v), (this.y = (c - m) / v), (this.z = (u - h) / v), (this.w = Math.acos((l + d + g - 1) / 2)), this;
}
min(t) {
return (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), (this.z = Math.min(this.z, t.z)), (this.w = Math.min(this.w, t.w)), this;
}
max(t) {
return (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), (this.z = Math.max(this.z, t.z)), (this.w = Math.max(this.w, t.w)), this;
}
clamp(t, e) {
return (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), (this.z = Math.max(t.z, Math.min(e.z, this.z))), (this.w = Math.max(t.w, Math.min(e.w, this.w))), this;
}
clampScalar(t, e) {
return (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), (this.z = Math.max(t, Math.min(e, this.z))), (this.w = Math.max(t, Math.min(e, this.w))), this;
}
clampLength(t, e) {
const n = this.length();
return this.divideScalar(n || 1).multiplyScalar(Math.max(t, Math.min(e, n)));
}
floor() {
return (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), (this.z = Math.floor(this.z)), (this.w = Math.floor(this.w)), this;
}
ceil() {
return (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), (this.z = Math.ceil(this.z)), (this.w = Math.ceil(this.w)), this;
}
round() {
return (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), (this.z = Math.round(this.z)), (this.w = Math.round(this.w)), this;
}
roundToZero() {
return (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), (this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z)), (this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w)), this;
}
negate() {
return (this.x = -this.x), (this.y = -this.y), (this.z = -this.z), (this.w = -this.w), this;
}
dot(t) {
return this.x * t.x + this.y * t.y + this.z * t.z + this.w * t.w;
}
lengthSq() {
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
}
length() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
}
manhattanLength() {
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);
}
normalize() {
return this.divideScalar(this.length() || 1);
}
setLength(t) {
return this.normalize().multiplyScalar(t);
}
lerp(t, e) {
return (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), (this.z += (t.z - this.z) * e), (this.w += (t.w - this.w) * e), this;
}
lerpVectors(t, e, n) {
return (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), (this.z = t.z + (e.z - t.z) * n), (this.w = t.w + (e.w - t.w) * n), this;
}
equals(t) {
return t.x === this.x && t.y === this.y && t.z === this.z && t.w === this.w;
}
fromArray(t, e = 0) {
return (this.x = t[e]), (this.y = t[e + 1]), (this.z = t[e + 2]), (this.w = t[e + 3]), this;
}
toArray(t = [], e = 0) {
return (t[e] = this.x), (t[e + 1] = this.y), (t[e + 2] = this.z), (t[e + 3] = this.w), t;
}
fromBufferAttribute(t, e, n) {
return void 0 !== n && console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."), (this.x = t.getX(e)), (this.y = t.getY(e)), (this.z = t.getZ(e)), (this.w = t.getW(e)), this;
}
random() {
return (this.x = Math.random()), (this.y = Math.random()), (this.z = Math.random()), (this.w = Math.random()), this;
}
*[Symbol.iterator]() {
yield this.x, yield this.y, yield this.z, yield this.w;
}
}
st.prototype.isVector4 = !0;
class at extends H {
constructor(t, e, n = {}) {
super(), (this.width = t), (this.height = e), (this.depth = 1), (this.scissor = new st(0, 0, t, e)), (this.scissorTest = !1), (this.viewport = new st(0, 0, t, e)), (this.texture = new it(void 0, n.mapping, n.wrapS, n.wrapT, n.magFilter, n.minFilter, n.format, n.type, n.anisotropy, n.encoding)), (this.texture.isRenderTargetTexture = !0), (this.texture.image = { width: t, height: e, depth: 1 }), (this.texture.generateMipmaps = void 0 !== n.generateMipmaps && n.generateMipmaps), (this.texture.internalFormat = void 0 !== n.internalFormat ? n.internalFormat : null), (this.texture.minFilter = void 0 !== n.minFilter ? n.minFilter : f), (this.depthBuffer = void 0 === n.depthBuffer || n.depthBuffer), (this.stencilBuffer = void 0 !== n.stencilBuffer && n.stencilBuffer), (this.depthTexture = void 0 !== n.depthTexture ? n.depthTexture : null);
}
setTexture(t) {
(t.image = { width: this.width, height: this.height, depth: this.depth }), (this.texture = t);
}
setSize(t, e, n = 1) {
(this.width === t && this.height === e && this.depth === n) || ((this.width = t), (this.height = e), (this.depth = n), (this.texture.image.width = t), (this.texture.image.height = e), (this.texture.image.depth = n), this.dispose()), this.viewport.set(0, 0, t, e), this.scissor.set(0, 0, t, e);
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return (this.width = t.width), (this.height = t.height), (this.depth = t.depth), this.viewport.copy(t.viewport), (this.texture = t.texture.clone()), (this.texture.image = { ...this.texture.image }), (this.depthBuffer = t.depthBuffer), (this.stencilBuffer = t.stencilBuffer), (this.depthTexture = t.depthTexture), this;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
}
at.prototype.isWebGLRenderTarget = !0;
(class extends at {
constructor(t, e, n) {
super(t, e);
const i = this.texture;
this.texture = [];
for (let t = 0; t < n; t++) this.texture[t] = i.clone();
}
setSize(t, e, n = 1) {
if (this.width !== t || this.height !== e || this.depth !== n) {
(this.width = t), (this.height = e), (this.depth = n);
for (let i = 0, r = this.texture.length; i < r; i++) (this.texture[i].image.width = t), (this.texture[i].image.height = e), (this.texture[i].image.depth = n);
this.dispose();
}
return this.viewport.set(0, 0, t, e), this.scissor.set(0, 0, t, e), this;
}
copy(t) {
this.dispose(), (this.width = t.width), (this.height = t.height), (this.depth = t.depth), this.viewport.set(0, 0, this.width, this.height), this.scissor.set(0, 0, this.width, this.height), (this.depthBuffer = t.depthBuffer), (this.stencilBuffer = t.stencilBuffer), (this.depthTexture = t.depthTexture), (this.texture.length = 0);
for (let e = 0, n = t.texture.length; e < n; e++) this.texture[e] = t.texture[e].clone();
return this;
}
}.prototype.isWebGLMultipleRenderTargets = !0);
class ot extends at {
constructor(t, e, n = {}) {
super(t, e, n), (this.samples = 4), (this.ignoreDepthForMultisampleCopy = void 0 === n.ignoreDepth || n.ignoreDepth), (this.useRenderToTexture = void 0 !== n.useRenderToTexture && n.useRenderToTexture), (this.useRenderbuffer = !1 === this.useRenderToTexture);
}
copy(t) {
return super.copy.call(this, t), (this.samples = t.samples), (this.useRenderToTexture = t.useRenderToTexture), (this.useRenderbuffer = t.useRenderbuffer), this;
}
}
ot.prototype.isWebGLMultisampleRenderTarget = !0;
class lt {
constructor(t = 0, e = 0, n = 0, i = 1) {
(this._x = t), (this._y = e), (this._z = n), (this._w = i);
}
static slerp(t, e, n, i) {
return console.warn("THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead."), n.slerpQuaternions(t, e, i);
}
static slerpFlat(t, e, n, i, r, s, a) {
let o = n[i + 0],
l = n[i + 1],
h = n[i + 2],
c = n[i + 3];
const u = r[s + 0],
d = r[s + 1],
p = r[s + 2],
m = r[s + 3];
if (0 === a) return (t[e + 0] = o), (t[e + 1] = l), (t[e + 2] = h), void (t[e + 3] = c);
if (1 === a) return (t[e + 0] = u), (t[e + 1] = d), (t[e + 2] = p), void (t[e + 3] = m);
if (c !== m || o !== u || l !== d || h !== p) {
let t = 1 - a;
const e = o * u + l * d + h * p + c * m,
n = e >= 0 ? 1 : -1,
i = 1 - e * e;
if (i > Number.EPSILON) {
const r = Math.sqrt(i),
s = Math.atan2(r, e * n);
(t = Math.sin(t * s) / r), (a = Math.sin(a * s) / r);
}
const r = a * n;
if (((o = o * t + u * r), (l = l * t + d * r), (h = h * t + p * r), (c = c * t + m * r), t === 1 - a)) {
const t = 1 / Math.sqrt(o * o + l * l + h * h + c * c);
(o *= t), (l *= t), (h *= t), (c *= t);
}
}
(t[e] = o), (t[e + 1] = l), (t[e + 2] = h), (t[e + 3] = c);
}
static multiplyQuaternionsFlat(t, e, n, i, r, s) {
const a = n[i],
o = n[i + 1],
l = n[i + 2],
h = n[i + 3],
c = r[s],
u = r[s + 1],
d = r[s + 2],
p = r[s + 3];
return (t[e] = a * p + h * c + o * d - l * u), (t[e + 1] = o * p + h * u + l * c - a * d), (t[e + 2] = l * p + h * d + a * u - o * c), (t[e + 3] = h * p - a * c - o * u - l * d), t;
}
get x() {
return this._x;
}
set x(t) {
(this._x = t), this._onChangeCallback();
}
get y() {
return this._y;
}
set y(t) {
(this._y = t), this._onChangeCallback();
}
get z() {
return this._z;
}
set z(t) {
(this._z = t), this._onChangeCallback();
}
get w() {
return this._w;
}
set w(t) {
(this._w = t), this._onChangeCallback();
}
set(t, e, n, i) {
return (this._x = t), (this._y = e), (this._z = n), (this._w = i), this._onChangeCallback(), this;
}
clone() {
return new this.constructor(this._x, this._y, this._z, this._w);
}
copy(t) {
return (this._x = t.x), (this._y = t.y), (this._z = t.z), (this._w = t.w), this._onChangeCallback(), this;
}
setFromEuler(t, e) {
if (!t || !t.isEuler) throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");
const n = t._x,
i = t._y,
r = t._z,
s = t._order,
a = Math.cos,
o = Math.sin,
l = a(n / 2),
h = a(i / 2),
c = a(r / 2),
u = o(n / 2),
d = o(i / 2),
p = o(r / 2);
switch (s) {
case "XYZ":
(this._x = u * h * c + l * d * p), (this._y = l * d * c - u * h * p), (this._z = l * h * p + u * d * c), (this._w = l * h * c - u * d * p);
break;
case "YXZ":
(this._x = u * h * c + l * d * p), (this._y = l * d * c - u * h * p), (this._z = l * h * p - u * d * c), (this._w = l * h * c + u * d * p);
break;
case "ZXY":
(this._x = u * h * c - l * d * p), (this._y = l * d * c + u * h * p), (this._z = l * h * p + u * d * c), (this._w = l * h * c - u * d * p);
break;
case "ZYX":
(this._x = u * h * c - l * d * p), (this._y = l * d * c + u * h * p), (this._z = l * h * p - u * d * c), (this._w = l * h * c + u * d * p);
break;
case "YZX":
(this._x = u * h * c + l * d * p), (this._y = l * d * c + u * h * p), (this._z = l * h * p - u * d * c), (this._w = l * h * c - u * d * p);
break;
case "XZY":
(this._x = u * h * c - l * d * p), (this._y = l * d * c - u * h * p), (this._z = l * h * p + u * d * c), (this._w = l * h * c + u * d * p);
break;
default:
console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + s);
}
return !1 !== e && this._onChangeCallback(), this;
}
setFromAxisAngle(t, e) {
const n = e / 2,
i = Math.sin(n);
return (this._x = t.x * i), (this._y = t.y * i), (this._z = t.z * i), (this._w = Math.cos(n)), this._onChangeCallback(), this;
}
setFromRotationMatrix(t) {
const e = t.elements,
n = e[0],
i = e[4],
r = e[8],
s = e[1],
a = e[5],
o = e[9],
l = e[2],
h = e[6],
c = e[10],
u = n + a + c;
if (u > 0) {
const t = 0.5 / Math.sqrt(u + 1);
(this._w = 0.25 / t), (this._x = (h - o) * t), (this._y = (r - l) * t), (this._z = (s - i) * t);
} else if (n > a && n > c) {
const t = 2 * Math.sqrt(1 + n - a - c);
(this._w = (h - o) / t), (this._x = 0.25 * t), (this._y = (i + s) / t), (this._z = (r + l) / t);
} else if (a > c) {
const t = 2 * Math.sqrt(1 + a - n - c);
(this._w = (r - l) / t), (this._x = (i + s) / t), (this._y = 0.25 * t), (this._z = (o + h) / t);
} else {
const t = 2 * Math.sqrt(1 + c - n - a);
(this._w = (s - i) / t), (this._x = (r + l) / t), (this._y = (o + h) / t), (this._z = 0.25 * t);
}
return this._onChangeCallback(), this;
}
setFromUnitVectors(t, e) {
let n = t.dot(e) + 1;
return n < Number.EPSILON ? ((n = 0), Math.abs(t.x) > Math.abs(t.z) ? ((this._x = -t.y), (this._y = t.x), (this._z = 0), (this._w = n)) : ((this._x = 0), (this._y = -t.z), (this._z = t.y), (this._w = n))) : ((this._x = t.y * e.z - t.z * e.y), (this._y = t.z * e.x - t.x * e.z), (this._z = t.x * e.y - t.y * e.x), (this._w = n)), this.normalize();
}
angleTo(t) {
return 2 * Math.acos(Math.abs(j(this.dot(t), -1, 1)));
}
rotateTowards(t, e) {
const n = this.angleTo(t);
if (0 === n) return this;
const i = Math.min(1, e / n);
return this.slerp(t, i), this;
}
identity() {
return this.set(0, 0, 0, 1);
}
invert() {
return this.conjugate();
}
conjugate() {
return (this._x *= -1), (this._y *= -1), (this._z *= -1), this._onChangeCallback(), this;
}
dot(t) {
return this._x * t._x + this._y * t._y + this._z * t._z + this._w * t._w;
}
lengthSq() {
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
}
length() {
return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
}
normalize() {
let t = this.length();
return 0 === t ? ((this._x = 0), (this._y = 0), (this._z = 0), (this._w = 1)) : ((t = 1 / t), (this._x = this._x * t), (this._y = this._y * t), (this._z = this._z * t), (this._w = this._w * t)), this._onChangeCallback(), this;
}
multiply(t, e) {
return void 0 !== e ? (console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(t, e)) : this.multiplyQuaternions(this, t);
}
premultiply(t) {
return this.multiplyQuaternions(t, this);
}
multiplyQuaternions(t, e) {
const n = t._x,
i = t._y,
r = t._z,
s = t._w,
a = e._x,
o = e._y,
l = e._z,
h = e._w;
return (this._x = n * h + s * a + i * l - r * o), (this._y = i * h + s * o + r * a - n * l), (this._z = r * h + s * l + n * o - i * a), (this._w = s * h - n * a - i * o - r * l), this._onChangeCallback(), this;
}
slerp(t, e) {
if (0 === e) return this;
if (1 === e) return this.copy(t);
const n = this._x,
i = this._y,
r = this._z,
s = this._w;
let a = s * t._w + n * t._x + i * t._y + r * t._z;
if ((a < 0 ? ((this._w = -t._w), (this._x = -t._x), (this._y = -t._y), (this._z = -t._z), (a = -a)) : this.copy(t), a >= 1)) return (this._w = s), (this._x = n), (this._y = i), (this._z = r), this;
const o = 1 - a * a;
if (o <= Number.EPSILON) {
const t = 1 - e;
return (this._w = t * s + e * this._w), (this._x = t * n + e * this._x), (this._y = t * i + e * this._y), (this._z = t * r + e * this._z), this.normalize(), this._onChangeCallback(), this;
}
const l = Math.sqrt(o),
h = Math.atan2(l, a),
c = Math.sin((1 - e) * h) / l,
u = Math.sin(e * h) / l;
return (this._w = s * c + this._w * u), (this._x = n * c + this._x * u), (this._y = i * c + this._y * u), (this._z = r * c + this._z * u), this._onChangeCallback(), this;
}
slerpQuaternions(t, e, n) {
this.copy(t).slerp(e, n);
}
random() {
const t = Math.random(),
e = Math.sqrt(1 - t),
n = Math.sqrt(t),
i = 2 * Math.PI * Math.random(),
r = 2 * Math.PI * Math.random();
return this.set(e * Math.cos(i), n * Math.sin(r), n * Math.cos(r), e * Math.sin(i));
}
equals(t) {
return t._x === this._x && t._y === this._y && t._z === this._z && t._w === this._w;
}
fromArray(t, e = 0) {
return (this._x = t[e]), (this._y = t[e + 1]), (this._z = t[e + 2]), (this._w = t[e + 3]), this._onChangeCallback(), this;
}
toArray(t = [], e = 0) {
return (t[e] = this._x), (t[e + 1] = this._y), (t[e + 2] = this._z), (t[e + 3] = this._w), t;
}
fromBufferAttribute(t, e) {
return (this._x = t.getX(e)), (this._y = t.getY(e)), (this._z = t.getZ(e)), (this._w = t.getW(e)), this;
}
_onChange(t) {
return (this._onChangeCallback = t), this;
}
_onChangeCallback() {}
}
lt.prototype.isQuaternion = !0;
class ht {
constructor(t = 0, e = 0, n = 0) {
(this.x = t), (this.y = e), (this.z = n);
}
set(t, e, n) {
return void 0 === n && (n = this.z), (this.x = t), (this.y = e), (this.z = n), this;
}
setScalar(t) {
return (this.x = t), (this.y = t), (this.z = t), this;
}
setX(t) {
return (this.x = t), this;
}
setY(t) {
return (this.y = t), this;
}
setZ(t) {
return (this.z = t), this;
}
setComponent(t, e) {
switch (t) {
case 0:
this.x = e;
break;
case 1:
this.y = e;
break;
case 2:
this.z = e;
break;
default:
throw new Error("index is out of range: " + t);
}
return this;
}
getComponent(t) {
switch (t) {
case 0:
return this.x;
case 1:
return this.y;
case 2:
return this.z;
default:
throw new Error("index is out of range: " + t);
}
}
clone() {
return new this.constructor(this.x, this.y, this.z);
}
copy(t) {
return (this.x = t.x), (this.y = t.y), (this.z = t.z), this;
}
add(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), (this.z += t.z), this);
}
addScalar(t) {
return (this.x += t), (this.y += t), (this.z += t), this;
}
addVectors(t, e) {
return (this.x = t.x + e.x), (this.y = t.y + e.y), (this.z = t.z + e.z), this;
}
addScaledVector(t, e) {
return (this.x += t.x * e), (this.y += t.y * e), (this.z += t.z * e), this;
}
sub(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), (this.z -= t.z), this);
}
subScalar(t) {
return (this.x -= t), (this.y -= t), (this.z -= t), this;
}
subVectors(t, e) {
return (this.x = t.x - e.x), (this.y = t.y - e.y), (this.z = t.z - e.z), this;
}
multiply(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), this.multiplyVectors(t, e)) : ((this.x *= t.x), (this.y *= t.y), (this.z *= t.z), this);
}
multiplyScalar(t) {
return (this.x *= t), (this.y *= t), (this.z *= t), this;
}
multiplyVectors(t, e) {
return (this.x = t.x * e.x), (this.y = t.y * e.y), (this.z = t.z * e.z), this;
}
applyEuler(t) {
return (t && t.isEuler) || console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."), this.applyQuaternion(ut.setFromEuler(t));
}
applyAxisAngle(t, e) {
return this.applyQuaternion(ut.setFromAxisAngle(t, e));
}
applyMatrix3(t) {
const e = this.x,
n = this.y,
i = this.z,
r = t.elements;
return (this.x = r[0] * e + r[3] * n + r[6] * i), (this.y = r[1] * e + r[4] * n + r[7] * i), (this.z = r[2] * e + r[5] * n + r[8] * i), this;
}
applyNormalMatrix(t) {
return this.applyMatrix3(t).normalize();
}
applyMatrix4(t) {
const e = this.x,
n = this.y,
i = this.z,
r = t.elements,
s = 1 / (r[3] * e + r[7] * n + r[11] * i + r[15]);
return (this.x = (r[0] * e + r[4] * n + r[8] * i + r[12]) * s), (this.y = (r[1] * e + r[5] * n + r[9] * i + r[13]) * s), (this.z = (r[2] * e + r[6] * n + r[10] * i + r[14]) * s), this;
}
applyQuaternion(t) {
const e = this.x,
n = this.y,
i = this.z,
r = t.x,
s = t.y,
a = t.z,
o = t.w,
l = o * e + s * i - a * n,
h = o * n + a * e - r * i,
c = o * i + r * n - s * e,
u = -r * e - s * n - a * i;
return (this.x = l * o + u * -r + h * -a - c * -s), (this.y = h * o + u * -s + c * -r - l * -a), (this.z = c * o + u * -a + l * -s - h * -r), this;
}
project(t) {
return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix);
}
unproject(t) {
return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld);
}
transformDirection(t) {
const e = this.x,
n = this.y,
i = this.z,
r = t.elements;
return (this.x = r[0] * e + r[4] * n + r[8] * i), (this.y = r[1] * e + r[5] * n + r[9] * i), (this.z = r[2] * e + r[6] * n + r[10] * i), this.normalize();
}
divide(t) {
return (this.x /= t.x), (this.y /= t.y), (this.z /= t.z), this;
}
divideScalar(t) {
return this.multiplyScalar(1 / t);
}
min(t) {
return (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), (this.z = Math.min(this.z, t.z)), this;
}
max(t) {
return (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), (this.z = Math.max(this.z, t.z)), this;
}
clamp(t, e) {
return (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), (this.z = Math.max(t.z, Math.min(e.z, this.z))), this;
}
clampScalar(t, e) {
return (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), (this.z = Math.max(t, Math.min(e, this.z))), this;
}
clampLength(t, e) {
const n = this.length();
return this.divideScalar(n || 1).multiplyScalar(Math.max(t, Math.min(e, n)));
}
floor() {
return (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), (this.z = Math.floor(this.z)), this;
}
ceil() {
return (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), (this.z = Math.ceil(this.z)), this;
}
round() {
return (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), (this.z = Math.round(this.z)), this;
}
roundToZero() {
return (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), (this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z)), this;
}
negate() {
return (this.x = -this.x), (this.y = -this.y), (this.z = -this.z), this;
}
dot(t) {
return this.x * t.x + this.y * t.y + this.z * t.z;
}
lengthSq() {
return this.x * this.x + this.y * this.y + this.z * this.z;
}
length() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}
manhattanLength() {
return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);
}
normalize() {
return this.divideScalar(this.length() || 1);
}
setLength(t) {
return this.normalize().multiplyScalar(t);
}
lerp(t, e) {
return (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), (this.z += (t.z - this.z) * e), this;
}
lerpVectors(t, e, n) {
return (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), (this.z = t.z + (e.z - t.z) * n), this;
}
cross(t, e) {
return void 0 !== e ? (console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), this.crossVectors(t, e)) : this.crossVectors(this, t);
}
crossVectors(t, e) {
const n = t.x,
i = t.y,
r = t.z,
s = e.x,
a = e.y,
o = e.z;
return (this.x = i * o - r * a), (this.y = r * s - n * o), (this.z = n * a - i * s), this;
}
projectOnVector(t) {
const e = t.lengthSq();
if (0 === e) return this.set(0, 0, 0);
const n = t.dot(this) / e;
return this.copy(t).multiplyScalar(n);
}
projectOnPlane(t) {
return ct.copy(this).projectOnVector(t), this.sub(ct);
}
reflect(t) {
return this.sub(ct.copy(t).multiplyScalar(2 * this.dot(t)));
}
angleTo(t) {
const e = Math.sqrt(this.lengthSq() * t.lengthSq());
if (0 === e) return Math.PI / 2;
const n = this.dot(t) / e;
return Math.acos(j(n, -1, 1));
}
distanceTo(t) {
return Math.sqrt(this.distanceToSquared(t));
}
distanceToSquared(t) {
const e = this.x - t.x,
n = this.y - t.y,
i = this.z - t.z;
return e * e + n * n + i * i;
}
manhattanDistanceTo(t) {
return Math.abs(this.x - t.x) + Math.abs(this.y - t.y) + Math.abs(this.z - t.z);
}
setFromSpherical(t) {
return this.setFromSphericalCoords(t.radius, t.phi, t.theta);
}
setFromSphericalCoords(t, e, n) {
const i = Math.sin(e) * t;
return (this.x = i * Math.sin(n)), (this.y = Math.cos(e) * t), (this.z = i * Math.cos(n)), this;
}
setFromCylindrical(t) {
return this.setFromCylindricalCoords(t.radius, t.theta, t.y);
}
setFromCylindricalCoords(t, e, n) {
return (this.x = t * Math.sin(e)), (this.y = n), (this.z = t * Math.cos(e)), this;
}
setFromMatrixPosition(t) {
const e = t.elements;
return (this.x = e[12]), (this.y = e[13]), (this.z = e[14]), this;
}
setFromMatrixScale(t) {
const e = this.setFromMatrixColumn(t, 0).length(),
n = this.setFromMatrixColumn(t, 1).length(),
i = this.setFromMatrixColumn(t, 2).length();
return (this.x = e), (this.y = n), (this.z = i), this;
}
setFromMatrixColumn(t, e) {
return this.fromArray(t.elements, 4 * e);
}
setFromMatrix3Column(t, e) {
return this.fromArray(t.elements, 3 * e);
}
equals(t) {
return t.x === this.x && t.y === this.y && t.z === this.z;
}
fromArray(t, e = 0) {
return (this.x = t[e]), (this.y = t[e + 1]), (this.z = t[e + 2]), this;
}
toArray(t = [], e = 0) {
return (t[e] = this.x), (t[e + 1] = this.y), (t[e + 2] = this.z), t;
}
fromBufferAttribute(t, e, n) {
return void 0 !== n && console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."), (this.x = t.getX(e)), (this.y = t.getY(e)), (this.z = t.getZ(e)), this;
}
random() {
return (this.x = Math.random()), (this.y = Math.random()), (this.z = Math.random()), this;
}
randomDirection() {
const t = 2 * (Math.random() - 0.5),
e = Math.random() * Math.PI * 2,
n = Math.sqrt(1 - t ** 2);
return (this.x = n * Math.cos(e)), (this.y = n * Math.sin(e)), (this.z = t), this;
}
*[Symbol.iterator]() {
yield this.x, yield this.y, yield this.z;
}
}
ht.prototype.isVector3 = !0;
const ct = new ht(),
ut = new lt();
class dt {
constructor(t = new ht(1 / 0, 1 / 0, 1 / 0), e = new ht(-1 / 0, -1 / 0, -1 / 0)) {
(this.min = t), (this.max = e);
}
set(t, e) {
return this.min.copy(t), this.max.copy(e), this;
}
setFromArray(t) {
let e = 1 / 0,
n = 1 / 0,
i = 1 / 0,
r = -1 / 0,
s = -1 / 0,
a = -1 / 0;
for (let o = 0, l = t.length; o < l; o += 3) {
const l = t[o],
h = t[o + 1],
c = t[o + 2];
l < e && (e = l), h < n && (n = h), c < i && (i = c), l > r && (r = l), h > s && (s = h), c > a && (a = c);
}
return this.min.set(e, n, i), this.max.set(r, s, a), this;
}
setFromBufferAttribute(t) {
let e = 1 / 0,
n = 1 / 0,
i = 1 / 0,
r = -1 / 0,
s = -1 / 0,
a = -1 / 0;
for (let o = 0, l = t.count; o < l; o++) {
const l = t.getX(o),
h = t.getY(o),
c = t.getZ(o);
l < e && (e = l), h < n && (n = h), c < i && (i = c), l > r && (r = l), h > s && (s = h), c > a && (a = c);
}
return this.min.set(e, n, i), this.max.set(r, s, a), this;
}
setFromPoints(t) {
this.makeEmpty();
for (let e = 0, n = t.length; e < n; e++) this.expandByPoint(t[e]);
return this;
}
setFromCenterAndSize(t, e) {
const n = mt.copy(e).multiplyScalar(0.5);
return this.min.copy(t).sub(n), this.max.copy(t).add(n), this;
}
setFromObject(t) {
return this.makeEmpty(), this.expandByObject(t);
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return this.min.copy(t.min), this.max.copy(t.max), this;
}
makeEmpty() {
return (this.min.x = this.min.y = this.min.z = 1 / 0), (this.max.x = this.max.y = this.max.z = -1 / 0), this;
}
isEmpty() {
return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;
}
getCenter(t) {
return this.isEmpty() ? t.set(0, 0, 0) : t.addVectors(this.min, this.max).multiplyScalar(0.5);
}
getSize(t) {
return this.isEmpty() ? t.set(0, 0, 0) : t.subVectors(this.max, this.min);
}
expandByPoint(t) {
return this.min.min(t), this.max.max(t), this;
}
expandByVector(t) {
return this.min.sub(t), this.max.add(t), this;
}
expandByScalar(t) {
return this.min.addScalar(-t), this.max.addScalar(t), this;
}
expandByObject(t) {
t.updateWorldMatrix(!1, !1);
const e = t.geometry;
void 0 !== e && (null === e.boundingBox && e.computeBoundingBox(), ft.copy(e.boundingBox), ft.applyMatrix4(t.matrixWorld), this.union(ft));
const n = t.children;
for (let t = 0, e = n.length; t < e; t++) this.expandByObject(n[t]);
return this;
}
containsPoint(t) {
return !(t.x < this.min.x || t.x > this.max.x || t.y < this.min.y || t.y > this.max.y || t.z < this.min.z || t.z > this.max.z);
}
containsBox(t) {
return this.min.x <= t.min.x && t.max.x <= this.max.x && this.min.y <= t.min.y && t.max.y <= this.max.y && this.min.z <= t.min.z && t.max.z <= this.max.z;
}
getParameter(t, e) {
return e.set((t.x - this.min.x) / (this.max.x - this.min.x), (t.y - this.min.y) / (this.max.y - this.min.y), (t.z - this.min.z) / (this.max.z - this.min.z));
}
intersectsBox(t) {
return !(t.max.x < this.min.x || t.min.x > this.max.x || t.max.y < this.min.y || t.min.y > this.max.y || t.max.z < this.min.z || t.min.z > this.max.z);
}
intersectsSphere(t) {
return this.clampPoint(t.center, mt), mt.distanceToSquared(t.center) <= t.radius * t.radius;
}
intersectsPlane(t) {
let e, n;
return t.normal.x > 0 ? ((e = t.normal.x * this.min.x), (n = t.normal.x * this.max.x)) : ((e = t.normal.x * this.max.x), (n = t.normal.x * this.min.x)), t.normal.y > 0 ? ((e += t.normal.y * this.min.y), (n += t.normal.y * this.max.y)) : ((e += t.normal.y * this.max.y), (n += t.normal.y * this.min.y)), t.normal.z > 0 ? ((e += t.normal.z * this.min.z), (n += t.normal.z * this.max.z)) : ((e += t.normal.z * this.max.z), (n += t.normal.z * this.min.z)), e <= -t.constant && n >= -t.constant;
}
intersectsTriangle(t) {
if (this.isEmpty()) return !1;
this.getCenter(wt), Mt.subVectors(this.max, wt), gt.subVectors(t.a, wt), vt.subVectors(t.b, wt), xt.subVectors(t.c, wt), yt.subVectors(vt, gt), _t.subVectors(xt, vt), bt.subVectors(gt, xt);
let e = [0, -yt.z, yt.y, 0, -_t.z, _t.y, 0, -bt.z, bt.y, yt.z, 0, -yt.x, _t.z, 0, -_t.x, bt.z, 0, -bt.x, -yt.y, yt.x, 0, -_t.y, _t.x, 0, -bt.y, bt.x, 0];
return !!Tt(e, gt, vt, xt, Mt) && ((e = [1, 0, 0, 0, 1, 0, 0, 0, 1]), !!Tt(e, gt, vt, xt, Mt) && (St.crossVectors(yt, _t), (e = [St.x, St.y, St.z]), Tt(e, gt, vt, xt, Mt)));
}
clampPoint(t, e) {
return e.copy(t).clamp(this.min, this.max);
}
distanceToPoint(t) {
return mt.copy(t).clamp(this.min, this.max).sub(t).length();
}
getBoundingSphere(t) {
return this.getCenter(t.center), (t.radius = 0.5 * this.getSize(mt).length()), t;
}
intersect(t) {
return this.min.max(t.min), this.max.min(t.max), this.isEmpty() && this.makeEmpty(), this;
}
union(t) {
return this.min.min(t.min), this.max.max(t.max), this;
}
applyMatrix4(t) {
return this.isEmpty() || (pt[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(t), pt[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(t), pt[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(t), pt[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(t), pt[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(t), pt[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(t), pt[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(t), pt[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(t), this.setFromPoints(pt)), this;
}
translate(t) {
return this.min.add(t), this.max.add(t), this;
}
equals(t) {
return t.min.equals(this.min) && t.max.equals(this.max);
}
}
dt.prototype.isBox3 = !0;
const pt = [new ht(), new ht(), new ht(), new ht(), new ht(), new ht(), new ht(), new ht()],
mt = new ht(),
ft = new dt(),
gt = new ht(),
vt = new ht(),
xt = new ht(),
yt = new ht(),
_t = new ht(),
bt = new ht(),
wt = new ht(),
Mt = new ht(),
St = new ht(),
Et = new ht();
function Tt(t, e, n, i, r) {
for (let s = 0, a = t.length - 3; s <= a; s += 3) {
Et.fromArray(t, s);
const a = r.x * Math.abs(Et.x) + r.y * Math.abs(Et.y) + r.z * Math.abs(Et.z),
o = e.dot(Et),
l = n.dot(Et),
h = i.dot(Et);
if (Math.max(-Math.max(o, l, h), Math.min(o, l, h)) > a) return !1;
}
return !0;
}
const At = new dt(),
Lt = new ht(),
Ct = new ht(),
Rt = new ht();
class Pt {
constructor(t = new ht(), e = -1) {
(this.center = t), (this.radius = e);
}
set(t, e) {
return this.center.copy(t), (this.radius = e), this;
}
setFromPoints(t, e) {
const n = this.center;
void 0 !== e ? n.copy(e) : At.setFromPoints(t).getCenter(n);
let i = 0;
for (let e = 0, r = t.length; e < r; e++) i = Math.max(i, n.distanceToSquared(t[e]));
return (this.radius = Math.sqrt(i)), this;
}
copy(t) {
return this.center.copy(t.center), (this.radius = t.radius), this;
}
isEmpty() {
return this.radius < 0;
}
makeEmpty() {
return this.center.set(0, 0, 0), (this.radius = -1), this;
}
containsPoint(t) {
return t.distanceToSquared(this.center) <= this.radius * this.radius;
}
distanceToPoint(t) {
return t.distanceTo(this.center) - this.radius;
}
intersectsSphere(t) {
const e = this.radius + t.radius;
return t.center.distanceToSquared(this.center) <= e * e;
}
intersectsBox(t) {
return t.intersectsSphere(this);
}
intersectsPlane(t) {
return Math.abs(t.distanceToPoint(this.center)) <= this.radius;
}
clampPoint(t, e) {
const n = this.center.distanceToSquared(t);
return e.copy(t), n > this.radius * this.radius && (e.sub(this.center).normalize(), e.multiplyScalar(this.radius).add(this.center)), e;
}
getBoundingBox(t) {
return this.isEmpty() ? (t.makeEmpty(), t) : (t.set(this.center, this.center), t.expandByScalar(this.radius), t);
}
applyMatrix4(t) {
return this.center.applyMatrix4(t), (this.radius = this.radius * t.getMaxScaleOnAxis()), this;
}
translate(t) {
return this.center.add(t), this;
}
expandByPoint(t) {
Rt.subVectors(t, this.center);
const e = Rt.lengthSq();
if (e > this.radius * this.radius) {
const t = Math.sqrt(e),
n = 0.5 * (t - this.radius);
this.center.add(Rt.multiplyScalar(n / t)), (this.radius += n);
}
return this;
}
union(t) {
return !0 === this.center.equals(t.center) ? Ct.set(0, 0, 1).multiplyScalar(t.radius) : Ct.subVectors(t.center, this.center).normalize().multiplyScalar(t.radius), this.expandByPoint(Lt.copy(t.center).add(Ct)), this.expandByPoint(Lt.copy(t.center).sub(Ct)), this;
}
equals(t) {
return t.center.equals(this.center) && t.radius === this.radius;
}
clone() {
return new this.constructor().copy(this);
}
}
const Dt = new ht(),
It = new ht(),
Nt = new ht(),
zt = new ht(),
Ot = new ht(),
Ft = new ht(),
Bt = new ht();
class Ut {
constructor(t = new ht(), e = new ht(0, 0, -1)) {
(this.origin = t), (this.direction = e);
}
set(t, e) {
return this.origin.copy(t), this.direction.copy(e), this;
}
copy(t) {
return this.origin.copy(t.origin), this.direction.copy(t.direction), this;
}
at(t, e) {
return e.copy(this.direction).multiplyScalar(t).add(this.origin);
}
lookAt(t) {
return this.direction.copy(t).sub(this.origin).normalize(), this;
}
recast(t) {
return this.origin.copy(this.at(t, Dt)), this;
}
closestPointToPoint(t, e) {
e.subVectors(t, this.origin);
const n = e.dot(this.direction);
return n < 0 ? e.copy(this.origin) : e.copy(this.direction).multiplyScalar(n).add(this.origin);
}
distanceToPoint(t) {
return Math.sqrt(this.distanceSqToPoint(t));
}
distanceSqToPoint(t) {
const e = Dt.subVectors(t, this.origin).dot(this.direction);
return e < 0 ? this.origin.distanceToSquared(t) : (Dt.copy(this.direction).multiplyScalar(e).add(this.origin), Dt.distanceToSquared(t));
}
distanceSqToSegment(t, e, n, i) {
It.copy(t).add(e).multiplyScalar(0.5), Nt.copy(e).sub(t).normalize(), zt.copy(this.origin).sub(It);
const r = 0.5 * t.distanceTo(e),
s = -this.direction.dot(Nt),
a = zt.dot(this.direction),
o = -zt.dot(Nt),
l = zt.lengthSq(),
h = Math.abs(1 - s * s);
let c, u, d, p;
if (h > 0)
if (((c = s * o - a), (u = s * a - o), (p = r * h), c >= 0))
if (u >= -p)
if (u <= p) {
const t = 1 / h;
(c *= t), (u *= t), (d = c * (c + s * u + 2 * a) + u * (s * c + u + 2 * o) + l);
} else (u = r), (c = Math.max(0, -(s * u + a))), (d = -c * c + u * (u + 2 * o) + l);
else (u = -r), (c = Math.max(0, -(s * u + a))), (d = -c * c + u * (u + 2 * o) + l);
else u <= -p ? ((c = Math.max(0, -(-s * r + a))), (u = c > 0 ? -r : Math.min(Math.max(-r, -o), r)), (d = -c * c + u * (u + 2 * o) + l)) : u <= p ? ((c = 0), (u = Math.min(Math.max(-r, -o), r)), (d = u * (u + 2 * o) + l)) : ((c = Math.max(0, -(s * r + a))), (u = c > 0 ? r : Math.min(Math.max(-r, -o), r)), (d = -c * c + u * (u + 2 * o) + l));
else (u = s > 0 ? -r : r), (c = Math.max(0, -(s * u + a))), (d = -c * c + u * (u + 2 * o) + l);
return n && n.copy(this.direction).multiplyScalar(c).add(this.origin), i && i.copy(Nt).multiplyScalar(u).add(It), d;
}
intersectSphere(t, e) {
Dt.subVectors(t.center, this.origin);
const n = Dt.dot(this.direction),
i = Dt.dot(Dt) - n * n,
r = t.radius * t.radius;
if (i > r) return null;
const s = Math.sqrt(r - i),
a = n - s,
o = n + s;
return a < 0 && o < 0 ? null : a < 0 ? this.at(o, e) : this.at(a, e);
}
intersectsSphere(t) {
return this.distanceSqToPoint(t.center) <= t.radius * t.radius;
}
distanceToPlane(t) {
const e = t.normal.dot(this.direction);
if (0 === e) return 0 === t.distanceToPoint(this.origin) ? 0 : null;
const n = -(this.origin.dot(t.normal) + t.constant) / e;
return n >= 0 ? n : null;
}
intersectPlane(t, e) {
const n = this.distanceToPlane(t);
return null === n ? null : this.at(n, e);
}
intersectsPlane(t) {
const e = t.distanceToPoint(this.origin);
if (0 === e) return !0;
return t.normal.dot(this.direction) * e < 0;
}
intersectBox(t, e) {
let n, i, r, s, a, o;
const l = 1 / this.direction.x,
h = 1 / this.direction.y,
c = 1 / this.direction.z,
u = this.origin;
return l >= 0 ? ((n = (t.min.x - u.x) * l), (i = (t.max.x - u.x) * l)) : ((n = (t.max.x - u.x) * l), (i = (t.min.x - u.x) * l)), h >= 0 ? ((r = (t.min.y - u.y) * h), (s = (t.max.y - u.y) * h)) : ((r = (t.max.y - u.y) * h), (s = (t.min.y - u.y) * h)), n > s || r > i ? null : ((r > n || n != n) && (n = r), (s < i || i != i) && (i = s), c >= 0 ? ((a = (t.min.z - u.z) * c), (o = (t.max.z - u.z) * c)) : ((a = (t.max.z - u.z) * c), (o = (t.min.z - u.z) * c)), n > o || a > i ? null : ((a > n || n != n) && (n = a), (o < i || i != i) && (i = o), i < 0 ? null : this.at(n >= 0 ? n : i, e)));
}
intersectsBox(t) {
return null !== this.intersectBox(t, Dt);
}
intersectTriangle(t, e, n, i, r) {
Ot.subVectors(e, t), Ft.subVectors(n, t), Bt.crossVectors(Ot, Ft);
let s,
a = this.direction.dot(Bt);
if (a > 0) {
if (i) return null;
s = 1;
} else {
if (!(a < 0)) return null;
(s = -1), (a = -a);
}
zt.subVectors(this.origin, t);
const o = s * this.direction.dot(Ft.crossVectors(zt, Ft));
if (o < 0) return null;
const l = s * this.direction.dot(Ot.cross(zt));
if (l < 0) return null;
if (o + l > a) return null;
const h = -s * zt.dot(Bt);
return h < 0 ? null : this.at(h / a, r);
}
applyMatrix4(t) {
return this.origin.applyMatrix4(t), this.direction.transformDirection(t), this;
}
equals(t) {
return t.origin.equals(this.origin) && t.direction.equals(this.direction);
}
clone() {
return new this.constructor().copy(this);
}
}
class Ht {
constructor() {
(this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]), arguments.length > 0 && console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.");
}
set(t, e, n, i, r, s, a, o, l, h, c, u, d, p, m, f) {
const g = this.elements;
return (g[0] = t), (g[4] = e), (g[8] = n), (g[12] = i), (g[1] = r), (g[5] = s), (g[9] = a), (g[13] = o), (g[2] = l), (g[6] = h), (g[10] = c), (g[14] = u), (g[3] = d), (g[7] = p), (g[11] = m), (g[15] = f), this;
}
identity() {
return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this;
}
clone() {
return new Ht().fromArray(this.elements);
}
copy(t) {
const e = this.elements,
n = t.elements;
return (e[0] = n[0]), (e[1] = n[1]), (e[2] = n[2]), (e[3] = n[3]), (e[4] = n[4]), (e[5] = n[5]), (e[6] = n[6]), (e[7] = n[7]), (e[8] = n[8]), (e[9] = n[9]), (e[10] = n[10]), (e[11] = n[11]), (e[12] = n[12]), (e[13] = n[13]), (e[14] = n[14]), (e[15] = n[15]), this;
}
copyPosition(t) {
const e = this.elements,
n = t.elements;
return (e[12] = n[12]), (e[13] = n[13]), (e[14] = n[14]), this;
}
setFromMatrix3(t) {
const e = t.elements;
return this.set(e[0], e[3], e[6], 0, e[1], e[4], e[7], 0, e[2], e[5], e[8], 0, 0, 0, 0, 1), this;
}
extractBasis(t, e, n) {
return t.setFromMatrixColumn(this, 0), e.setFromMatrixColumn(this, 1), n.setFromMatrixColumn(this, 2), this;
}
makeBasis(t, e, n) {
return this.set(t.x, e.x, n.x, 0, t.y, e.y, n.y, 0, t.z, e.z, n.z, 0, 0, 0, 0, 1), this;
}
extractRotation(t) {
const e = this.elements,
n = t.elements,
i = 1 / Vt.setFromMatrixColumn(t, 0).length(),
r = 1 / Vt.setFromMatrixColumn(t, 1).length(),
s = 1 / Vt.setFromMatrixColumn(t, 2).length();
return (e[0] = n[0] * i), (e[1] = n[1] * i), (e[2] = n[2] * i), (e[3] = 0), (e[4] = n[4] * r), (e[5] = n[5] * r), (e[6] = n[6] * r), (e[7] = 0), (e[8] = n[8] * s), (e[9] = n[9] * s), (e[10] = n[10] * s), (e[11] = 0), (e[12] = 0), (e[13] = 0), (e[14] = 0), (e[15] = 1), this;
}
makeRotationFromEuler(t) {
(t && t.isEuler) || console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
const e = this.elements,
n = t.x,
i = t.y,
r = t.z,
s = Math.cos(n),
a = Math.sin(n),
o = Math.cos(i),
l = Math.sin(i),
h = Math.cos(r),
c = Math.sin(r);
if ("XYZ" === t.order) {
const t = s * h,
n = s * c,
i = a * h,
r = a * c;
(e[0] = o * h), (e[4] = -o * c), (e[8] = l), (e[1] = n + i * l), (e[5] = t - r * l), (e[9] = -a * o), (e[2] = r - t * l), (e[6] = i + n * l), (e[10] = s * o);
} else if ("YXZ" === t.order) {
const t = o * h,
n = o * c,
i = l * h,
r = l * c;
(e[0] = t + r * a), (e[4] = i * a - n), (e[8] = s * l), (e[1] = s * c), (e[5] = s * h), (e[9] = -a), (e[2] = n * a - i), (e[6] = r + t * a), (e[10] = s * o);
} else if ("ZXY" === t.order) {
const t = o * h,
n = o * c,
i = l * h,
r = l * c;
(e[0] = t - r * a), (e[4] = -s * c), (e[8] = i + n * a), (e[1] = n + i * a), (e[5] = s * h), (e[9] = r - t * a), (e[2] = -s * l), (e[6] = a), (e[10] = s * o);
} else if ("ZYX" === t.order) {
const t = s * h,
n = s * c,
i = a * h,
r = a * c;
(e[0] = o * h), (e[4] = i * l - n), (e[8] = t * l + r), (e[1] = o * c), (e[5] = r * l + t), (e[9] = n * l - i), (e[2] = -l), (e[6] = a * o), (e[10] = s * o);
} else if ("YZX" === t.order) {
const t = s * o,
n = s * l,
i = a * o,
r = a * l;
(e[0] = o * h), (e[4] = r - t * c), (e[8] = i * c + n), (e[1] = c), (e[5] = s * h), (e[9] = -a * h), (e[2] = -l * h), (e[6] = n * c + i), (e[10] = t - r * c);
} else if ("XZY" === t.order) {
const t = s * o,
n = s * l,
i = a * o,
r = a * l;
(e[0] = o * h), (e[4] = -c), (e[8] = l * h), (e[1] = t * c + r), (e[5] = s * h), (e[9] = n * c - i), (e[2] = i * c - n), (e[6] = a * h), (e[10] = r * c + t);
}
return (e[3] = 0), (e[7] = 0), (e[11] = 0), (e[12] = 0), (e[13] = 0), (e[14] = 0), (e[15] = 1), this;
}
makeRotationFromQuaternion(t) {
return this.compose(Gt, t, Wt);
}
lookAt(t, e, n) {
const i = this.elements;
return Xt.subVectors(t, e), 0 === Xt.lengthSq() && (Xt.z = 1), Xt.normalize(), jt.crossVectors(n, Xt), 0 === jt.lengthSq() && (1 === Math.abs(n.z) ? (Xt.x += 1e-4) : (Xt.z += 1e-4), Xt.normalize(), jt.crossVectors(n, Xt)), jt.normalize(), qt.crossVectors(Xt, jt), (i[0] = jt.x), (i[4] = qt.x), (i[8] = Xt.x), (i[1] = jt.y), (i[5] = qt.y), (i[9] = Xt.y), (i[2] = jt.z), (i[6] = qt.z), (i[10] = Xt.z), this;
}
multiply(t, e) {
return void 0 !== e ? (console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), this.multiplyMatrices(t, e)) : this.multiplyMatrices(this, t);
}
premultiply(t) {
return this.multiplyMatrices(t, this);
}
multiplyMatrices(t, e) {
const n = t.elements,
i = e.elements,
r = this.elements,
s = n[0],
a = n[4],
o = n[8],
l = n[12],
h = n[1],
c = n[5],
u = n[9],
d = n[13],
p = n[2],
m = n[6],
f = n[10],
g = n[14],
v = n[3],
x = n[7],
y = n[11],
_ = n[15],
b = i[0],
w = i[4],
M = i[8],
S = i[12],
E = i[1],
T = i[5],
A = i[9],
L = i[13],
C = i[2],
R = i[6],
P = i[10],
D = i[14],
I = i[3],
N = i[7],
z = i[11],
O = i[15];
return (r[0] = s * b + a * E + o * C + l * I), (r[4] = s * w + a * T + o * R + l * N), (r[8] = s * M + a * A + o * P + l * z), (r[12] = s * S + a * L + o * D + l * O), (r[1] = h * b + c * E + u * C + d * I), (r[5] = h * w + c * T + u * R + d * N), (r[9] = h * M + c * A + u * P + d * z), (r[13] = h * S + c * L + u * D + d * O), (r[2] = p * b + m * E + f * C + g * I), (r[6] = p * w + m * T + f * R + g * N), (r[10] = p * M + m * A + f * P + g * z), (r[14] = p * S + m * L + f * D + g * O), (r[3] = v * b + x * E + y * C + _ * I), (r[7] = v * w + x * T + y * R + _ * N), (r[11] = v * M + x * A + y * P + _ * z), (r[15] = v * S + x * L + y * D + _ * O), this;
}
multiplyScalar(t) {
const e = this.elements;
return (e[0] *= t), (e[4] *= t), (e[8] *= t), (e[12] *= t), (e[1] *= t), (e[5] *= t), (e[9] *= t), (e[13] *= t), (e[2] *= t), (e[6] *= t), (e[10] *= t), (e[14] *= t), (e[3] *= t), (e[7] *= t), (e[11] *= t), (e[15] *= t), this;
}
determinant() {
const t = this.elements,
e = t[0],
n = t[4],
i = t[8],
r = t[12],
s = t[1],
a = t[5],
o = t[9],
l = t[13],
h = t[2],
c = t[6],
u = t[10],
d = t[14];
return t[3] * (+r * o * c - i * l * c - r * a * u + n * l * u + i * a * d - n * o * d) + t[7] * (+e * o * d - e * l * u + r * s * u - i * s * d + i * l * h - r * o * h) + t[11] * (+e * l * c - e * a * d - r * s * c + n * s * d + r * a * h - n * l * h) + t[15] * (-i * a * h - e * o * c + e * a * u + i * s * c - n * s * u + n * o * h);
}
transpose() {
const t = this.elements;
let e;
return (e = t[1]), (t[1] = t[4]), (t[4] = e), (e = t[2]), (t[2] = t[8]), (t[8] = e), (e = t[6]), (t[6] = t[9]), (t[9] = e), (e = t[3]), (t[3] = t[12]), (t[12] = e), (e = t[7]), (t[7] = t[13]), (t[13] = e), (e = t[11]), (t[11] = t[14]), (t[14] = e), this;
}
setPosition(t, e, n) {
const i = this.elements;
return t.isVector3 ? ((i[12] = t.x), (i[13] = t.y), (i[14] = t.z)) : ((i[12] = t), (i[13] = e), (i[14] = n)), this;
}
invert() {
const t = this.elements,
e = t[0],
n = t[1],
i = t[2],
r = t[3],
s = t[4],
a = t[5],
o = t[6],
l = t[7],
h = t[8],
c = t[9],
u = t[10],
d = t[11],
p = t[12],
m = t[13],
f = t[14],
g = t[15],
v = c * f * l - m * u * l + m * o * d - a * f * d - c * o * g + a * u * g,
x = p * u * l - h * f * l - p * o * d + s * f * d + h * o * g - s * u * g,
y = h * m * l - p * c * l + p * a * d - s * m * d - h * a * g + s * c * g,
_ = p * c * o - h * m * o - p * a * u + s * m * u + h * a * f - s * c * f,
b = e * v + n * x + i * y + r * _;
if (0 === b) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
const w = 1 / b;
return (t[0] = v * w), (t[1] = (m * u * r - c * f * r - m * i * d + n * f * d + c * i * g - n * u * g) * w), (t[2] = (a * f * r - m * o * r + m * i * l - n * f * l - a * i * g + n * o * g) * w), (t[3] = (c * o * r - a * u * r - c * i * l + n * u * l + a * i * d - n * o * d) * w), (t[4] = x * w), (t[5] = (h * f * r - p * u * r + p * i * d - e * f * d - h * i * g + e * u * g) * w), (t[6] = (p * o * r - s * f * r - p * i * l + e * f * l + s * i * g - e * o * g) * w), (t[7] = (s * u * r - h * o * r + h * i * l - e * u * l - s * i * d + e * o * d) * w), (t[8] = y * w), (t[9] = (p * c * r - h * m * r - p * n * d + e * m * d + h * n * g - e * c * g) * w), (t[10] = (s * m * r - p * a * r + p * n * l - e * m * l - s * n * g + e * a * g) * w), (t[11] = (h * a * r - s * c * r - h * n * l + e * c * l + s * n * d - e * a * d) * w), (t[12] = _ * w), (t[13] = (h * m * i - p * c * i + p * n * u - e * m * u - h * n * f + e * c * f) * w), (t[14] = (p * a * i - s * m * i - p * n * o + e * m * o + s * n * f - e * a * f) * w), (t[15] = (s * c * i - h * a * i + h * n * o - e * c * o - s * n * u + e * a * u) * w), this;
}
scale(t) {
const e = this.elements,
n = t.x,
i = t.y,
r = t.z;
return (e[0] *= n), (e[4] *= i), (e[8] *= r), (e[1] *= n), (e[5] *= i), (e[9] *= r), (e[2] *= n), (e[6] *= i), (e[10] *= r), (e[3] *= n), (e[7] *= i), (e[11] *= r), this;
}
getMaxScaleOnAxis() {
const t = this.elements,
e = t[0] * t[0] + t[1] * t[1] + t[2] * t[2],
n = t[4] * t[4] + t[5] * t[5] + t[6] * t[6],
i = t[8] * t[8] + t[9] * t[9] + t[10] * t[10];
return Math.sqrt(Math.max(e, n, i));
}
makeTranslation(t, e, n) {
return this.set(1, 0, 0, t, 0, 1, 0, e, 0, 0, 1, n, 0, 0, 0, 1), this;
}
makeRotationX(t) {
const e = Math.cos(t),
n = Math.sin(t);
return this.set(1, 0, 0, 0, 0, e, -n, 0, 0, n, e, 0, 0, 0, 0, 1), this;
}
makeRotationY(t) {
const e = Math.cos(t),
n = Math.sin(t);
return this.set(e, 0, n, 0, 0, 1, 0, 0, -n, 0, e, 0, 0, 0, 0, 1), this;
}
makeRotationZ(t) {
const e = Math.cos(t),
n = Math.sin(t);
return this.set(e, -n, 0, 0, n, e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this;
}
makeRotationAxis(t, e) {
const n = Math.cos(e),
i = Math.sin(e),
r = 1 - n,
s = t.x,
a = t.y,
o = t.z,
l = r * s,
h = r * a;
return this.set(l * s + n, l * a - i * o, l * o + i * a, 0, l * a + i * o, h * a + n, h * o - i * s, 0, l * o - i * a, h * o + i * s, r * o * o + n, 0, 0, 0, 0, 1), this;
}
makeScale(t, e, n) {
return this.set(t, 0, 0, 0, 0, e, 0, 0, 0, 0, n, 0, 0, 0, 0, 1), this;
}
makeShear(t, e, n, i, r, s) {
return this.set(1, n, r, 0, t, 1, s, 0, e, i, 1, 0, 0, 0, 0, 1), this;
}
compose(t, e, n) {
const i = this.elements,
r = e._x,
s = e._y,
a = e._z,
o = e._w,
l = r + r,
h = s + s,
c = a + a,
u = r * l,
d = r * h,
p = r * c,
m = s * h,
f = s * c,
g = a * c,
v = o * l,
x = o * h,
y = o * c,
_ = n.x,
b = n.y,
w = n.z;
return (i[0] = (1 - (m + g)) * _), (i[1] = (d + y) * _), (i[2] = (p - x) * _), (i[3] = 0), (i[4] = (d - y) * b), (i[5] = (1 - (u + g)) * b), (i[6] = (f + v) * b), (i[7] = 0), (i[8] = (p + x) * w), (i[9] = (f - v) * w), (i[10] = (1 - (u + m)) * w), (i[11] = 0), (i[12] = t.x), (i[13] = t.y), (i[14] = t.z), (i[15] = 1), this;
}
decompose(t, e, n) {
const i = this.elements;
let r = Vt.set(i[0], i[1], i[2]).length();
const s = Vt.set(i[4], i[5], i[6]).length(),
a = Vt.set(i[8], i[9], i[10]).length();
this.determinant() < 0 && (r = -r), (t.x = i[12]), (t.y = i[13]), (t.z = i[14]), kt.copy(this);
const o = 1 / r,
l = 1 / s,
h = 1 / a;
return (kt.elements[0] *= o), (kt.elements[1] *= o), (kt.elements[2] *= o), (kt.elements[4] *= l), (kt.elements[5] *= l), (kt.elements[6] *= l), (kt.elements[8] *= h), (kt.elements[9] *= h), (kt.elements[10] *= h), e.setFromRotationMatrix(kt), (n.x = r), (n.y = s), (n.z = a), this;
}
makePerspective(t, e, n, i, r, s) {
void 0 === s && console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
const a = this.elements,
o = (2 * r) / (e - t),
l = (2 * r) / (n - i),
h = (e + t) / (e - t),
c = (n + i) / (n - i),
u = -(s + r) / (s - r),
d = (-2 * s * r) / (s - r);
return (a[0] = o), (a[4] = 0), (a[8] = h), (a[12] = 0), (a[1] = 0), (a[5] = l), (a[9] = c), (a[13] = 0), (a[2] = 0), (a[6] = 0), (a[10] = u), (a[14] = d), (a[3] = 0), (a[7] = 0), (a[11] = -1), (a[15] = 0), this;
}
makeOrthographic(t, e, n, i, r, s) {
const a = this.elements,
o = 1 / (e - t),
l = 1 / (n - i),
h = 1 / (s - r),
c = (e + t) * o,
u = (n + i) * l,
d = (s + r) * h;
return (a[0] = 2 * o), (a[4] = 0), (a[8] = 0), (a[12] = -c), (a[1] = 0), (a[5] = 2 * l), (a[9] = 0), (a[13] = -u), (a[2] = 0), (a[6] = 0), (a[10] = -2 * h), (a[14] = -d), (a[3] = 0), (a[7] = 0), (a[11] = 0), (a[15] = 1), this;
}
equals(t) {
const e = this.elements,
n = t.elements;
for (let t = 0; t < 16; t++) if (e[t] !== n[t]) return !1;
return !0;
}
fromArray(t, e = 0) {
for (let n = 0; n < 16; n++) this.elements[n] = t[n + e];
return this;
}
toArray(t = [], e = 0) {
const n = this.elements;
return (t[e] = n[0]), (t[e + 1] = n[1]), (t[e + 2] = n[2]), (t[e + 3] = n[3]), (t[e + 4] = n[4]), (t[e + 5] = n[5]), (t[e + 6] = n[6]), (t[e + 7] = n[7]), (t[e + 8] = n[8]), (t[e + 9] = n[9]), (t[e + 10] = n[10]), (t[e + 11] = n[11]), (t[e + 12] = n[12]), (t[e + 13] = n[13]), (t[e + 14] = n[14]), (t[e + 15] = n[15]), t;
}
}
Ht.prototype.isMatrix4 = !0;
const Vt = new ht(),
kt = new Ht(),
Gt = new ht(0, 0, 0),
Wt = new ht(1, 1, 1),
jt = new ht(),
qt = new ht(),
Xt = new ht(),
Yt = new Ht(),
Jt = new lt();
class $t {
constructor(t = 0, e = 0, n = 0, i = $t.DefaultOrder) {
(this._x = t), (this._y = e), (this._z = n), (this._order = i);
}
get x() {
return this._x;
}
set x(t) {
(this._x = t), this._onChangeCallback();
}
get y() {
return this._y;
}
set y(t) {
(this._y = t), this._onChangeCallback();
}
get z() {
return this._z;
}
set z(t) {
(this._z = t), this._onChangeCallback();
}
get order() {
return this._order;
}
set order(t) {
(this._order = t), this._onChangeCallback();
}
set(t, e, n, i = this._order) {
return (this._x = t), (this._y = e), (this._z = n), (this._order = i), this._onChangeCallback(), this;
}
clone() {
return new this.constructor(this._x, this._y, this._z, this._order);
}
copy(t) {
return (this._x = t._x), (this._y = t._y), (this._z = t._z), (this._order = t._order), this._onChangeCallback(), this;
}
setFromRotationMatrix(t, e = this._order, n = !0) {
const i = t.elements,
r = i[0],
s = i[4],
a = i[8],
o = i[1],
l = i[5],
h = i[9],
c = i[2],
u = i[6],
d = i[10];
switch (e) {
case "XYZ":
(this._y = Math.asin(j(a, -1, 1))), Math.abs(a) < 0.9999999 ? ((this._x = Math.atan2(-h, d)), (this._z = Math.atan2(-s, r))) : ((this._x = Math.atan2(u, l)), (this._z = 0));
break;
case "YXZ":
(this._x = Math.asin(-j(h, -1, 1))), Math.abs(h) < 0.9999999 ? ((this._y = Math.atan2(a, d)), (this._z = Math.atan2(o, l))) : ((this._y = Math.atan2(-c, r)), (this._z = 0));
break;
case "ZXY":
(this._x = Math.asin(j(u, -1, 1))), Math.abs(u) < 0.9999999 ? ((this._y = Math.atan2(-c, d)), (this._z = Math.atan2(-s, l))) : ((this._y = 0), (this._z = Math.atan2(o, r)));
break;
case "ZYX":
(this._y = Math.asin(-j(c, -1, 1))), Math.abs(c) < 0.9999999 ? ((this._x = Math.atan2(u, d)), (this._z = Math.atan2(o, r))) : ((this._x = 0), (this._z = Math.atan2(-s, l)));
break;
case "YZX":
(this._z = Math.asin(j(o, -1, 1))), Math.abs(o) < 0.9999999 ? ((this._x = Math.atan2(-h, l)), (this._y = Math.atan2(-c, r))) : ((this._x = 0), (this._y = Math.atan2(a, d)));
break;
case "XZY":
(this._z = Math.asin(-j(s, -1, 1))), Math.abs(s) < 0.9999999 ? ((this._x = Math.atan2(u, l)), (this._y = Math.atan2(a, r))) : ((this._x = Math.atan2(-h, d)), (this._y = 0));
break;
default:
console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: " + e);
}
return (this._order = e), !0 === n && this._onChangeCallback(), this;
}
setFromQuaternion(t, e, n) {
return Yt.makeRotationFromQuaternion(t), this.setFromRotationMatrix(Yt, e, n);
}
setFromVector3(t, e = this._order) {
return this.set(t.x, t.y, t.z, e);
}
reorder(t) {
return Jt.setFromEuler(this), this.setFromQuaternion(Jt, t);
}
equals(t) {
return t._x === this._x && t._y === this._y && t._z === this._z && t._order === this._order;
}
fromArray(t) {
return (this._x = t[0]), (this._y = t[1]), (this._z = t[2]), void 0 !== t[3] && (this._order = t[3]), this._onChangeCallback(), this;
}
toArray(t = [], e = 0) {
return (t[e] = this._x), (t[e + 1] = this._y), (t[e + 2] = this._z), (t[e + 3] = this._order), t;
}
toVector3(t) {
return t ? t.set(this._x, this._y, this._z) : new ht(this._x, this._y, this._z);
}
_onChange(t) {
return (this._onChangeCallback = t), this;
}
_onChangeCallback() {}
}
($t.prototype.isEuler = !0), ($t.DefaultOrder = "XYZ"), ($t.RotationOrders = ["XYZ", "YZX", "ZXY", "XZY", "YXZ", "ZYX"]);
class Zt {
constructor() {
this.mask = 1;
}
set(t) {
this.mask = ((1 << t) | 0) >>> 0;
}
enable(t) {
this.mask |= (1 << t) | 0;
}
enableAll() {
this.mask = -1;
}
toggle(t) {
this.mask ^= (1 << t) | 0;
}
disable(t) {
this.mask &= ~((1 << t) | 0);
}
disableAll() {
this.mask = 0;
}
test(t) {
return 0 != (this.mask & t.mask);
}
isEnabled(t) {
return 0 != (this.mask & ((1 << t) | 0));
}
}
let Qt = 0;
const Kt = new ht(),
te = new lt(),
ee = new Ht(),
ne = new ht(),
ie = new ht(),
re = new ht(),
se = new lt(),
ae = new ht(1, 0, 0),
oe = new ht(0, 1, 0),
le = new ht(0, 0, 1),
he = { type: "added" },
ce = { type: "removed" };
class ue extends H {
constructor() {
super(), Object.defineProperty(this, "id", { value: Qt++ }), (this.uuid = W()), (this.name = ""), (this.type = "Object3D"), (this.parent = null), (this.children = []), (this.up = ue.DefaultUp.clone());
const t = new ht(),
e = new $t(),
n = new lt(),
i = new ht(1, 1, 1);
e._onChange(function () {
n.setFromEuler(e, !1);
}),
n._onChange(function () {
e.setFromQuaternion(n, void 0, !1);
}),
Object.defineProperties(this, { position: { configurable: !0, enumerable: !0, value: t }, rotation: { configurable: !0, enumerable: !0, value: e }, quaternion: { configurable: !0, enumerable: !0, value: n }, scale: { configurable: !0, enumerable: !0, value: i }, modelViewMatrix: { value: new Ht() }, normalMatrix: { value: new Z() } }),
(this.matrix = new Ht()),
(this.matrixWorld = new Ht()),
(this.matrixAutoUpdate = ue.DefaultMatrixAutoUpdate),
(this.matrixWorldNeedsUpdate = !1),
(this.layers = new Zt()),
(this.visible = !0),
(this.castShadow = !1),
(this.receiveShadow = !1),
(this.frustumCulled = !0),
(this.renderOrder = 0),
(this.animations = []),
(this.userData = {});
}
onBeforeRender() {}
onAfterRender() {}
applyMatrix4(t) {
this.matrixAutoUpdate && this.updateMatrix(), this.matrix.premultiply(t), this.matrix.decompose(this.position, this.quaternion, this.scale);
}
applyQuaternion(t) {
return this.quaternion.premultiply(t), this;
}
setRotationFromAxisAngle(t, e) {
this.quaternion.setFromAxisAngle(t, e);
}
setRotationFromEuler(t) {
this.quaternion.setFromEuler(t, !0);
}
setRotationFromMatrix(t) {
this.quaternion.setFromRotationMatrix(t);
}
setRotationFromQuaternion(t) {
this.quaternion.copy(t);
}
rotateOnAxis(t, e) {
return te.setFromAxisAngle(t, e), this.quaternion.multiply(te), this;
}
rotateOnWorldAxis(t, e) {
return te.setFromAxisAngle(t, e), this.quaternion.premultiply(te), this;
}
rotateX(t) {
return this.rotateOnAxis(ae, t);
}
rotateY(t) {
return this.rotateOnAxis(oe, t);
}
rotateZ(t) {
return this.rotateOnAxis(le, t);
}
translateOnAxis(t, e) {
return Kt.copy(t).applyQuaternion(this.quaternion), this.position.add(Kt.multiplyScalar(e)), this;
}
translateX(t) {
return this.translateOnAxis(ae, t);
}
translateY(t) {
return this.translateOnAxis(oe, t);
}
translateZ(t) {
return this.translateOnAxis(le, t);
}
localToWorld(t) {
return t.applyMatrix4(this.matrixWorld);
}
worldToLocal(t) {
return t.applyMatrix4(ee.copy(this.matrixWorld).invert());
}
lookAt(t, e, n) {
t.isVector3 ? ne.copy(t) : ne.set(t, e, n);
const i = this.parent;
this.updateWorldMatrix(!0, !1), ie.setFromMatrixPosition(this.matrixWorld), this.isCamera || this.isLight ? ee.lookAt(ie, ne, this.up) : ee.lookAt(ne, ie, this.up), this.quaternion.setFromRotationMatrix(ee), i && (ee.extractRotation(i.matrixWorld), te.setFromRotationMatrix(ee), this.quaternion.premultiply(te.invert()));
}
add(t) {
if (arguments.length > 1) {
for (let t = 0; t < arguments.length; t++) this.add(arguments[t]);
return this;
}
return t === this ? (console.error("THREE.Object3D.add: object can't be added as a child of itself.", t), this) : (t && t.isObject3D ? (null !== t.parent && t.parent.remove(t), (t.parent = this), this.children.push(t), t.dispatchEvent(he)) : console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", t), this);
}
remove(t) {
if (arguments.length > 1) {
for (let t = 0; t < arguments.length; t++) this.remove(arguments[t]);
return this;
}
const e = this.children.indexOf(t);
return -1 !== e && ((t.parent = null), this.children.splice(e, 1), t.dispatchEvent(ce)), this;
}
removeFromParent() {
const t = this.parent;
return null !== t && t.remove(this), this;
}
clear() {
for (let t = 0; t < this.children.length; t++) {
const e = this.children[t];
(e.parent = null), e.dispatchEvent(ce);
}
return (this.children.length = 0), this;
}
attach(t) {
return this.updateWorldMatrix(!0, !1), ee.copy(this.matrixWorld).invert(), null !== t.parent && (t.parent.updateWorldMatrix(!0, !1), ee.multiply(t.parent.matrixWorld)), t.applyMatrix4(ee), this.add(t), t.updateWorldMatrix(!1, !0), this;
}
getObjectById(t) {
return this.getObjectByProperty("id", t);
}
getObjectByName(t) {
return this.getObjectByProperty("name", t);
}
getObjectByProperty(t, e) {
if (this[t] === e) return this;
for (let n = 0, i = this.children.length; n < i; n++) {
const i = this.children[n].getObjectByProperty(t, e);
if (void 0 !== i) return i;
}
}
getWorldPosition(t) {
return this.updateWorldMatrix(!0, !1), t.setFromMatrixPosition(this.matrixWorld);
}
getWorldQuaternion(t) {
return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(ie, t, re), t;
}
getWorldScale(t) {
return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(ie, se, t), t;
}
getWorldDirection(t) {
this.updateWorldMatrix(!0, !1);
const e = this.matrixWorld.elements;
return t.set(e[8], e[9], e[10]).normalize();
}
raycast() {}
traverse(t) {
t(this);
const e = this.children;
for (let n = 0, i = e.length; n < i; n++) e[n].traverse(t);
}
traverseVisible(t) {
if (!1 === this.visible) return;
t(this);
const e = this.children;
for (let n = 0, i = e.length; n < i; n++) e[n].traverseVisible(t);
}
traverseAncestors(t) {
const e = this.parent;
null !== e && (t(e), e.traverseAncestors(t));
}
updateMatrix() {
this.matrix.compose(this.position, this.quaternion, this.scale), (this.matrixWorldNeedsUpdate = !0);
}
updateMatrixWorld(t) {
this.matrixAutoUpdate && this.updateMatrix(), (this.matrixWorldNeedsUpdate || t) && (null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), (this.matrixWorldNeedsUpdate = !1), (t = !0));
const e = this.children;
for (let n = 0, i = e.length; n < i; n++) e[n].updateMatrixWorld(t);
}
updateWorldMatrix(t, e) {
const n = this.parent;
if ((!0 === t && null !== n && n.updateWorldMatrix(!0, !1), this.matrixAutoUpdate && this.updateMatrix(), null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), !0 === e)) {
const t = this.children;
for (let e = 0, n = t.length; e < n; e++) t[e].updateWorldMatrix(!1, !0);
}
}
toJSON(t) {
const e = void 0 === t || "string" == typeof t,
n = {};
e && ((t = { geometries: {}, materials: {}, textures: {}, images: {}, shapes: {}, skeletons: {}, animations: {} }), (n.metadata = { version: 4.5, type: "Object", generator: "Object3D.toJSON" }));
const i = {};
function r(e, n) {
return void 0 === e[n.uuid] && (e[n.uuid] = n.toJSON(t)), n.uuid;
}
if (((i.uuid = this.uuid), (i.type = this.type), "" !== this.name && (i.name = this.name), !0 === this.castShadow && (i.castShadow = !0), !0 === this.receiveShadow && (i.receiveShadow = !0), !1 === this.visible && (i.visible = !1), !1 === this.frustumCulled && (i.frustumCulled = !1), 0 !== this.renderOrder && (i.renderOrder = this.renderOrder), "{}" !== JSON.stringify(this.userData) && (i.userData = this.userData), (i.layers = this.layers.mask), (i.matrix = this.matrix.toArray()), !1 === this.matrixAutoUpdate && (i.matrixAutoUpdate = !1), this.isInstancedMesh && ((i.type = "InstancedMesh"), (i.count = this.count), (i.instanceMatrix = this.instanceMatrix.toJSON()), null !== this.instanceColor && (i.instanceColor = this.instanceColor.toJSON())), this.isScene)) this.background && (this.background.isColor ? (i.background = this.background.toJSON()) : this.background.isTexture && (i.background = this.background.toJSON(t).uuid)), this.environment && this.environment.isTexture && (i.environment = this.environment.toJSON(t).uuid);
else if (this.isMesh || this.isLine || this.isPoints) {
i.geometry = r(t.geometries, this.geometry);
const e = this.geometry.parameters;
if (void 0 !== e && void 0 !== e.shapes) {
const n = e.shapes;
if (Array.isArray(n))
for (let e = 0, i = n.length; e < i; e++) {
const i = n[e];
r(t.shapes, i);
}
else r(t.shapes, n);
}
}
if ((this.isSkinnedMesh && ((i.bindMode = this.bindMode), (i.bindMatrix = this.bindMatrix.toArray()), void 0 !== this.skeleton && (r(t.skeletons, this.skeleton), (i.skeleton = this.skeleton.uuid))), void 0 !== this.material))
if (Array.isArray(this.material)) {
const e = [];
for (let n = 0, i = this.material.length; n < i; n++) e.push(r(t.materials, this.material[n]));
i.material = e;
} else i.material = r(t.materials, this.material);
if (this.children.length > 0) {
i.children = [];
for (let e = 0; e < this.children.length; e++) i.children.push(this.children[e].toJSON(t).object);
}
if (this.animations.length > 0) {
i.animations = [];
for (let e = 0; e < this.animations.length; e++) {
const n = this.animations[e];
i.animations.push(r(t.animations, n));
}
}
if (e) {
const e = s(t.geometries),
i = s(t.materials),
r = s(t.textures),
a = s(t.images),
o = s(t.shapes),
l = s(t.skeletons),
h = s(t.animations);
e.length > 0 && (n.geometries = e), i.length > 0 && (n.materials = i), r.length > 0 && (n.textures = r), a.length > 0 && (n.images = a), o.length > 0 && (n.shapes = o), l.length > 0 && (n.skeletons = l), h.length > 0 && (n.animations = h);
}
return (n.object = i), n;
function s(t) {
const e = [];
for (const n in t) {
const i = t[n];
delete i.metadata, e.push(i);
}
return e;
}
}
clone(t) {
return new this.constructor().copy(this, t);
}
copy(t, e = !0) {
if (((this.name = t.name), this.up.copy(t.up), this.position.copy(t.position), (this.rotation.order = t.rotation.order), this.quaternion.copy(t.quaternion), this.scale.copy(t.scale), this.matrix.copy(t.matrix), this.matrixWorld.copy(t.matrixWorld), (this.matrixAutoUpdate = t.matrixAutoUpdate), (this.matrixWorldNeedsUpdate = t.matrixWorldNeedsUpdate), (this.layers.mask = t.layers.mask), (this.visible = t.visible), (this.castShadow = t.castShadow), (this.receiveShadow = t.receiveShadow), (this.frustumCulled = t.frustumCulled), (this.renderOrder = t.renderOrder), (this.userData = JSON.parse(JSON.stringify(t.userData))), !0 === e))
for (let e = 0; e < t.children.length; e++) {
const n = t.children[e];
this.add(n.clone());
}
return this;
}
}
(ue.DefaultUp = new ht(0, 1, 0)), (ue.DefaultMatrixAutoUpdate = !0), (ue.prototype.isObject3D = !0);
const de = new ht(),
pe = new ht(),
me = new ht(),
fe = new ht(),
ge = new ht(),
ve = new ht(),
xe = new ht(),
ye = new ht(),
_e = new ht(),
be = new ht();
class we {
constructor(t = new ht(), e = new ht(), n = new ht()) {
(this.a = t), (this.b = e), (this.c = n);
}
static getNormal(t, e, n, i) {
i.subVectors(n, e), de.subVectors(t, e), i.cross(de);
const r = i.lengthSq();
return r > 0 ? i.multiplyScalar(1 / Math.sqrt(r)) : i.set(0, 0, 0);
}
static getBarycoord(t, e, n, i, r) {
de.subVectors(i, e), pe.subVectors(n, e), me.subVectors(t, e);
const s = de.dot(de),
a = de.dot(pe),
o = de.dot(me),
l = pe.dot(pe),
h = pe.dot(me),
c = s * l - a * a;
if (0 === c) return r.set(-2, -1, -1);
const u = 1 / c,
d = (l * o - a * h) * u,
p = (s * h - a * o) * u;
return r.set(1 - d - p, p, d);
}
static containsPoint(t, e, n, i) {
return this.getBarycoord(t, e, n, i, fe), fe.x >= 0 && fe.y >= 0 && fe.x + fe.y <= 1;
}
static getUV(t, e, n, i, r, s, a, o) {
return this.getBarycoord(t, e, n, i, fe), o.set(0, 0), o.addScaledVector(r, fe.x), o.addScaledVector(s, fe.y), o.addScaledVector(a, fe.z), o;
}
static isFrontFacing(t, e, n, i) {
return de.subVectors(n, e), pe.subVectors(t, e), de.cross(pe).dot(i) < 0;
}
set(t, e, n) {
return this.a.copy(t), this.b.copy(e), this.c.copy(n), this;
}
setFromPointsAndIndices(t, e, n, i) {
return this.a.copy(t[e]), this.b.copy(t[n]), this.c.copy(t[i]), this;
}
setFromAttributeAndIndices(t, e, n, i) {
return this.a.fromBufferAttribute(t, e), this.b.fromBufferAttribute(t, n), this.c.fromBufferAttribute(t, i), this;
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return this.a.copy(t.a), this.b.copy(t.b), this.c.copy(t.c), this;
}
getArea() {
return de.subVectors(this.c, this.b), pe.subVectors(this.a, this.b), 0.5 * de.cross(pe).length();
}
getMidpoint(t) {
return t
.addVectors(this.a, this.b)
.add(this.c)
.multiplyScalar(1 / 3);
}
getNormal(t) {
return we.getNormal(this.a, this.b, this.c, t);
}
getPlane(t) {
return t.setFromCoplanarPoints(this.a, this.b, this.c);
}
getBarycoord(t, e) {
return we.getBarycoord(t, this.a, this.b, this.c, e);
}
getUV(t, e, n, i, r) {
return we.getUV(t, this.a, this.b, this.c, e, n, i, r);
}
containsPoint(t) {
return we.containsPoint(t, this.a, this.b, this.c);
}
isFrontFacing(t) {
return we.isFrontFacing(this.a, this.b, this.c, t);
}
intersectsBox(t) {
return t.intersectsTriangle(this);
}
closestPointToPoint(t, e) {
const n = this.a,
i = this.b,
r = this.c;
let s, a;
ge.subVectors(i, n), ve.subVectors(r, n), ye.subVectors(t, n);
const o = ge.dot(ye),
l = ve.dot(ye);
if (o <= 0 && l <= 0) return e.copy(n);
_e.subVectors(t, i);
const h = ge.dot(_e),
c = ve.dot(_e);
if (h >= 0 && c <= h) return e.copy(i);
const u = o * c - h * l;
if (u <= 0 && o >= 0 && h <= 0) return (s = o / (o - h)), e.copy(n).addScaledVector(ge, s);
be.subVectors(t, r);
const d = ge.dot(be),
p = ve.dot(be);
if (p >= 0 && d <= p) return e.copy(r);
const m = d * l - o * p;
if (m <= 0 && l >= 0 && p <= 0) return (a = l / (l - p)), e.copy(n).addScaledVector(ve, a);
const f = h * p - d * c;
if (f <= 0 && c - h >= 0 && d - p >= 0) return xe.subVectors(r, i), (a = (c - h) / (c - h + (d - p))), e.copy(i).addScaledVector(xe, a);
const g = 1 / (f + m + u);
return (s = m * g), (a = u * g), e.copy(n).addScaledVector(ge, s).addScaledVector(ve, a);
}
equals(t) {
return t.a.equals(this.a) && t.b.equals(this.b) && t.c.equals(this.c);
}
}
let Me = 0;
class Se extends H {
constructor() {
super(), Object.defineProperty(this, "id", { value: Me++ }), (this.uuid = W()), (this.name = ""), (this.type = "Material"), (this.fog = !0), (this.blending = 1), (this.side = 0), (this.vertexColors = !1), (this.opacity = 1), (this.format = S), (this.transparent = !1), (this.blendSrc = 204), (this.blendDst = 205), (this.blendEquation = n), (this.blendSrcAlpha = null), (this.blendDstAlpha = null), (this.blendEquationAlpha = null), (this.depthFunc = 3), (this.depthTest = !0), (this.depthWrite = !0), (this.stencilWriteMask = 255), (this.stencilFunc = 519), (this.stencilRef = 0), (this.stencilFuncMask = 255), (this.stencilFail = O), (this.stencilZFail = O), (this.stencilZPass = O), (this.stencilWrite = !1), (this.clippingPlanes = null), (this.clipIntersection = !1), (this.clipShadows = !1), (this.shadowSide = null), (this.colorWrite = !0), (this.precision = null), (this.polygonOffset = !1), (this.polygonOffsetFactor = 0), (this.polygonOffsetUnits = 0), (this.dithering = !1), (this.alphaToCoverage = !1), (this.premultipliedAlpha = !1), (this.visible = !0), (this.toneMapped = !0), (this.userData = {}), (this.version = 0), (this._alphaTest = 0);
}
get alphaTest() {
return this._alphaTest;
}
set alphaTest(t) {
this._alphaTest > 0 != t > 0 && this.version++, (this._alphaTest = t);
}
onBuild() {}
onBeforeRender() {}
onBeforeCompile() {}
customProgramCacheKey() {
return this.onBeforeCompile.toString();
}
setValues(t) {
if (void 0 !== t)
for (const e in t) {
const n = t[e];
if (void 0 === n) {
console.warn("THREE.Material: '" + e + "' parameter is undefined.");
continue;
}
if ("shading" === e) {
console.warn("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead."), (this.flatShading = 1 === n);
continue;
}
const i = this[e];
void 0 !== i ? (i && i.isColor ? i.set(n) : i && i.isVector3 && n && n.isVector3 ? i.copy(n) : (this[e] = n)) : console.warn("THREE." + this.type + ": '" + e + "' is not a property of this material.");
}
}
toJSON(t) {
const e = void 0 === t || "string" == typeof t;
e && (t = { textures: {}, images: {} });
const n = { metadata: { version: 4.5, type: "Material", generator: "Material.toJSON" } };
function i(t) {
const e = [];
for (const n in t) {
const i = t[n];
delete i.metadata, e.push(i);
}
return e;
}
if (((n.uuid = this.uuid), (n.type = this.type), "" !== this.name && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), void 0 !== this.roughness && (n.roughness = this.roughness), void 0 !== this.metalness && (n.metalness = this.metalness), void 0 !== this.sheen && (n.sheen = this.sheen), this.sheenColor && this.sheenColor.isColor && (n.sheenColor = this.sheenColor.getHex()), void 0 !== this.sheenRoughness && (n.sheenRoughness = this.sheenRoughness), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity && 1 !== this.emissiveIntensity && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), void 0 !== this.specularIntensity && (n.specularIntensity = this.specularIntensity), this.specularColor && this.specularColor.isColor && (n.specularColor = this.specularColor.getHex()), void 0 !== this.shininess && (n.shininess = this.shininess), void 0 !== this.clearcoat && (n.clearcoat = this.clearcoat), void 0 !== this.clearcoatRoughness && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(t).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(t).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && ((n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(t).uuid), (n.clearcoatNormalScale = this.clearcoatNormalScale.toArray())), this.map && this.map.isTexture && (n.map = this.map.toJSON(t).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(t).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(t).uuid), this.lightMap && this.lightMap.isTexture && ((n.lightMap = this.lightMap.toJSON(t).uuid), (n.lightMapIntensity = this.lightMapIntensity)), this.aoMap && this.aoMap.isTexture && ((n.aoMap = this.aoMap.toJSON(t).uuid), (n.aoMapIntensity = this.aoMapIntensity)), this.bumpMap && this.bumpMap.isTexture && ((n.bumpMap = this.bumpMap.toJSON(t).uuid), (n.bumpScale = this.bumpScale)), this.normalMap && this.normalMap.isTexture && ((n.normalMap = this.normalMap.toJSON(t).uuid), (n.normalMapType = this.normalMapType), (n.normalScale = this.normalScale.toArray())), this.displacementMap && this.displacementMap.isTexture && ((n.displacementMap = this.displacementMap.toJSON(t).uuid), (n.displacementScale = this.displacementScale), (n.displacementBias = this.displacementBias)), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(t).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(t).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(t).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(t).uuid), this.specularIntensityMap && this.specularIntensityMap.isTexture && (n.specularIntensityMap = this.specularIntensityMap.toJSON(t).uuid), this.specularColorMap && this.specularColorMap.isTexture && (n.specularColorMap = this.specularColorMap.toJSON(t).uuid), this.envMap && this.envMap.isTexture && ((n.envMap = this.envMap.toJSON(t).uuid), void 0 !== this.combine && (n.combine = this.combine)), void 0 !== this.envMapIntensity && (n.envMapIntensity = this.envMapIntensity), void 0 !== this.reflectivity && (n.reflectivity = this.reflectivity), void 0 !== this.refractionRatio && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(t).uuid), void 0 !== this.transmission && (n.transmission = this.transmission), this.transmissionMap && this.transmissionMap.isTexture && (n.transmissionMap = this.transmissionMap.toJSON(t).uuid), void 0 !== this.thickness && (n.thickness = this.thickness), this.thicknessMap && this.thicknessMap.isTexture && (n.thicknessMap = this.thicknessMap.toJSON(t).uuid), void 0 !== this.attenuationDistance && (n.attenuationDistance = this.attenuationDistance), void 0 !== this.attenuationColor && (n.attenuationColor = this.attenuationColor.getHex()), void 0 !== this.size && (n.size = this.size), null !== this.shadowSide && (n.shadowSide = this.shadowSide), void 0 !== this.sizeAttenuation && (n.sizeAttenuation = this.sizeAttenuation), 1 !== this.blending && (n.blending = this.blending), 0 !== this.side && (n.side = this.side), this.vertexColors && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), this.format !== S && (n.format = this.format), !0 === this.transparent && (n.transparent = this.transparent), (n.depthFunc = this.depthFunc), (n.depthTest = this.depthTest), (n.depthWrite = this.depthWrite), (n.colorWrite = this.colorWrite), (n.stencilWrite = this.stencilWrite), (n.stencilWriteMask = this.stencilWriteMask), (n.stencilFunc = this.stencilFunc), (n.stencilRef = this.stencilRef), (n.stencilFuncMask = this.stencilFuncMask), (n.stencilFail = this.stencilFail), (n.stencilZFail = this.stencilZFail), (n.stencilZPass = this.stencilZPass), this.rotation && 0 !== this.rotation && (n.rotation = this.rotation), !0 === this.polygonOffset && (n.polygonOffset = !0), 0 !== this.polygonOffsetFactor && (n.polygonOffsetFactor = this.polygonOffsetFactor), 0 !== this.polygonOffsetUnits && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth && 1 !== this.linewidth && (n.linewidth = this.linewidth), void 0 !== this.dashSize && (n.dashSize = this.dashSize), void 0 !== this.gapSize && (n.gapSize = this.gapSize), void 0 !== this.scale && (n.scale = this.scale), !0 === this.dithering && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), !0 === this.alphaToCoverage && (n.alphaToCoverage = this.alphaToCoverage), !0 === this.premultipliedAlpha && (n.premultipliedAlpha = this.premultipliedAlpha), !0 === this.wireframe && (n.wireframe = this.wireframe), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), "round" !== this.wireframeLinecap && (n.wireframeLinecap = this.wireframeLinecap), "round" !== this.wireframeLinejoin && (n.wireframeLinejoin = this.wireframeLinejoin), !0 === this.flatShading && (n.flatShading = this.flatShading), !1 === this.visible && (n.visible = !1), !1 === this.toneMapped && (n.toneMapped = !1), "{}" !== JSON.stringify(this.userData) && (n.userData = this.userData), e)) {
const e = i(t.textures),
r = i(t.images);
e.length > 0 && (n.textures = e), r.length > 0 && (n.images = r);
}
return n;
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
(this.name = t.name), (this.fog = t.fog), (this.blending = t.blending), (this.side = t.side), (this.vertexColors = t.vertexColors), (this.opacity = t.opacity), (this.format = t.format), (this.transparent = t.transparent), (this.blendSrc = t.blendSrc), (this.blendDst = t.blendDst), (this.blendEquation = t.blendEquation), (this.blendSrcAlpha = t.blendSrcAlpha), (this.blendDstAlpha = t.blendDstAlpha), (this.blendEquationAlpha = t.blendEquationAlpha), (this.depthFunc = t.depthFunc), (this.depthTest = t.depthTest), (this.depthWrite = t.depthWrite), (this.stencilWriteMask = t.stencilWriteMask), (this.stencilFunc = t.stencilFunc), (this.stencilRef = t.stencilRef), (this.stencilFuncMask = t.stencilFuncMask), (this.stencilFail = t.stencilFail), (this.stencilZFail = t.stencilZFail), (this.stencilZPass = t.stencilZPass), (this.stencilWrite = t.stencilWrite);
const e = t.clippingPlanes;
let n = null;
if (null !== e) {
const t = e.length;
n = new Array(t);
for (let i = 0; i !== t; ++i) n[i] = e[i].clone();
}
return (this.clippingPlanes = n), (this.clipIntersection = t.clipIntersection), (this.clipShadows = t.clipShadows), (this.shadowSide = t.shadowSide), (this.colorWrite = t.colorWrite), (this.precision = t.precision), (this.polygonOffset = t.polygonOffset), (this.polygonOffsetFactor = t.polygonOffsetFactor), (this.polygonOffsetUnits = t.polygonOffsetUnits), (this.dithering = t.dithering), (this.alphaTest = t.alphaTest), (this.alphaToCoverage = t.alphaToCoverage), (this.premultipliedAlpha = t.premultipliedAlpha), (this.visible = t.visible), (this.toneMapped = t.toneMapped), (this.userData = JSON.parse(JSON.stringify(t.userData))), this;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
set needsUpdate(t) {
!0 === t && this.version++;
}
}
Se.prototype.isMaterial = !0;
const Ee = { aliceblue: 15792383, antiquewhite: 16444375, aqua: 65535, aquamarine: 8388564, azure: 15794175, beige: 16119260, bisque: 16770244, black: 0, blanchedalmond: 16772045, blue: 255, blueviolet: 9055202, brown: 10824234, burlywood: 14596231, cadetblue: 6266528, chartreuse: 8388352, chocolate: 13789470, coral: 16744272, cornflowerblue: 6591981, cornsilk: 16775388, crimson: 14423100, cyan: 65535, darkblue: 139, darkcyan: 35723, darkgoldenrod: 12092939, darkgray: 11119017, darkgreen: 25600, darkgrey: 11119017, darkkhaki: 12433259, darkmagenta: 9109643, darkolivegreen: 5597999, darkorange: 16747520, darkorchid: 10040012, darkred: 9109504, darksalmon: 15308410, darkseagreen: 9419919, darkslateblue: 4734347, darkslategray: 3100495, darkslategrey: 3100495, darkturquoise: 52945, darkviolet: 9699539, deeppink: 16716947, deepskyblue: 49151, dimgray: 6908265, dimgrey: 6908265, dodgerblue: 2003199, firebrick: 11674146, floralwhite: 16775920, forestgreen: 2263842, fuchsia: 16711935, gainsboro: 14474460, ghostwhite: 16316671, gold: 16766720, goldenrod: 14329120, gray: 8421504, green: 32768, greenyellow: 11403055, grey: 8421504, honeydew: 15794160, hotpink: 16738740, indianred: 13458524, indigo: 4915330, ivory: 16777200, khaki: 15787660, lavender: 15132410, lavenderblush: 16773365, lawngreen: 8190976, lemonchiffon: 16775885, lightblue: 11393254, lightcoral: 15761536, lightcyan: 14745599, lightgoldenrodyellow: 16448210, lightgray: 13882323, lightgreen: 9498256, lightgrey: 13882323, lightpink: 16758465, lightsalmon: 16752762, lightseagreen: 2142890, lightskyblue: 8900346, lightslategray: 7833753, lightslategrey: 7833753, lightsteelblue: 11584734, lightyellow: 16777184, lime: 65280, limegreen: 3329330, linen: 16445670, magenta: 16711935, maroon: 8388608, mediumaquamarine: 6737322, mediumblue: 205, mediumorchid: 12211667, mediumpurple: 9662683, mediumseagreen: 3978097, mediumslateblue: 8087790, mediumspringgreen: 64154, mediumturquoise: 4772300, mediumvioletred: 13047173, midnightblue: 1644912, mintcream: 16121850, mistyrose: 16770273, moccasin: 16770229, navajowhite: 16768685, navy: 128, oldlace: 16643558, olive: 8421376, olivedrab: 7048739, orange: 16753920, orangered: 16729344, orchid: 14315734, palegoldenrod: 15657130, palegreen: 10025880, paleturquoise: 11529966, palevioletred: 14381203, papayawhip: 16773077, peachpuff: 16767673, peru: 13468991, pink: 16761035, plum: 14524637, powderblue: 11591910, purple: 8388736, rebeccapurple: 6697881, red: 16711680, rosybrown: 12357519, royalblue: 4286945, saddlebrown: 9127187, salmon: 16416882, sandybrown: 16032864, seagreen: 3050327, seashell: 16774638, sienna: 10506797, silver: 12632256, skyblue: 8900331, slateblue: 6970061, slategray: 7372944, slategrey: 7372944, snow: 16775930, springgreen: 65407, steelblue: 4620980, tan: 13808780, teal: 32896, thistle: 14204888, tomato: 16737095, turquoise: 4251856, violet: 15631086, wheat: 16113331, white: 16777215, whitesmoke: 16119285, yellow: 16776960, yellowgreen: 10145074 },
Te = { h: 0, s: 0, l: 0 },
Ae = { h: 0, s: 0, l: 0 };
function Le(t, e, n) {
return n < 0 && (n += 1), n > 1 && (n -= 1), n < 1 / 6 ? t + 6 * (e - t) * n : n < 0.5 ? e : n < 2 / 3 ? t + 6 * (e - t) * (2 / 3 - n) : t;
}
function Ce(t) {
return t < 0.04045 ? 0.0773993808 * t : Math.pow(0.9478672986 * t + 0.0521327014, 2.4);
}
function Re(t) {
return t < 0.0031308 ? 12.92 * t : 1.055 * Math.pow(t, 0.41666) - 0.055;
}
class Pe {
constructor(t, e, n) {
return void 0 === e && void 0 === n ? this.set(t) : this.setRGB(t, e, n);
}
set(t) {
return t && t.isColor ? this.copy(t) : "number" == typeof t ? this.setHex(t) : "string" == typeof t && this.setStyle(t), this;
}
setScalar(t) {
return (this.r = t), (this.g = t), (this.b = t), this;
}
setHex(t) {
return (t = Math.floor(t)), (this.r = ((t >> 16) & 255) / 255), (this.g = ((t >> 8) & 255) / 255), (this.b = (255 & t) / 255), this;
}
setRGB(t, e, n) {
return (this.r = t), (this.g = e), (this.b = n), this;
}
setHSL(t, e, n) {
if (((t = q(t, 1)), (e = j(e, 0, 1)), (n = j(n, 0, 1)), 0 === e)) this.r = this.g = this.b = n;
else {
const i = n <= 0.5 ? n * (1 + e) : n + e - n * e,
r = 2 * n - i;
(this.r = Le(r, i, t + 1 / 3)), (this.g = Le(r, i, t)), (this.b = Le(r, i, t - 1 / 3));
}
return this;
}
setStyle(t) {
function e(e) {
void 0 !== e && parseFloat(e) < 1 && console.warn("THREE.Color: Alpha component of " + t + " will be ignored.");
}
let n;
if ((n = /^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t))) {
let t;
const i = n[1],
r = n[2];
switch (i) {
case "rgb":
case "rgba":
if ((t = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))) return (this.r = Math.min(255, parseInt(t[1], 10)) / 255), (this.g = Math.min(255, parseInt(t[2], 10)) / 255), (this.b = Math.min(255, parseInt(t[3], 10)) / 255), e(t[4]), this;
if ((t = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))) return (this.r = Math.min(100, parseInt(t[1], 10)) / 100), (this.g = Math.min(100, parseInt(t[2], 10)) / 100), (this.b = Math.min(100, parseInt(t[3], 10)) / 100), e(t[4]), this;
break;
case "hsl":
case "hsla":
if ((t = /^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))) {
const n = parseFloat(t[1]) / 360,
i = parseInt(t[2], 10) / 100,
r = parseInt(t[3], 10) / 100;
return e(t[4]), this.setHSL(n, i, r);
}
}
} else if ((n = /^\#([A-Fa-f\d]+)$/.exec(t))) {
const t = n[1],
e = t.length;
if (3 === e) return (this.r = parseInt(t.charAt(0) + t.charAt(0), 16) / 255), (this.g = parseInt(t.charAt(1) + t.charAt(1), 16) / 255), (this.b = parseInt(t.charAt(2) + t.charAt(2), 16) / 255), this;
if (6 === e) return (this.r = parseInt(t.charAt(0) + t.charAt(1), 16) / 255), (this.g = parseInt(t.charAt(2) + t.charAt(3), 16) / 255), (this.b = parseInt(t.charAt(4) + t.charAt(5), 16) / 255), this;
}
return t && t.length > 0 ? this.setColorName(t) : this;
}
setColorName(t) {
const e = Ee[t.toLowerCase()];
return void 0 !== e ? this.setHex(e) : console.warn("THREE.Color: Unknown color " + t), this;
}
clone() {
return new this.constructor(this.r, this.g, this.b);
}
copy(t) {
return (this.r = t.r), (this.g = t.g), (this.b = t.b), this;
}
copySRGBToLinear(t) {
return (this.r = Ce(t.r)), (this.g = Ce(t.g)), (this.b = Ce(t.b)), this;
}
copyLinearToSRGB(t) {
return (this.r = Re(t.r)), (this.g = Re(t.g)), (this.b = Re(t.b)), this;
}
convertSRGBToLinear() {
return this.copySRGBToLinear(this), this;
}
convertLinearToSRGB() {
return this.copyLinearToSRGB(this), this;
}
getHex() {
return ((255 * this.r) << 16) ^ ((255 * this.g) << 8) ^ ((255 * this.b) << 0);
}
getHexString() {
return ("000000" + this.getHex().toString(16)).slice(-6);
}
getHSL(t) {
const e = this.r,
n = this.g,
i = this.b,
r = Math.max(e, n, i),
s = Math.min(e, n, i);
let a, o;
const l = (s + r) / 2;
if (s === r) (a = 0), (o = 0);
else {
const t = r - s;
switch (((o = l <= 0.5 ? t / (r + s) : t / (2 - r - s)), r)) {
case e:
a = (n - i) / t + (n < i ? 6 : 0);
break;
case n:
a = (i - e) / t + 2;
break;
case i:
a = (e - n) / t + 4;
}
a /= 6;
}
return (t.h = a), (t.s = o), (t.l = l), t;
}
getStyle() {
return "rgb(" + ((255 * this.r) | 0) + "," + ((255 * this.g) | 0) + "," + ((255 * this.b) | 0) + ")";
}
offsetHSL(t, e, n) {
return this.getHSL(Te), (Te.h += t), (Te.s += e), (Te.l += n), this.setHSL(Te.h, Te.s, Te.l), this;
}
add(t) {
return (this.r += t.r), (this.g += t.g), (this.b += t.b), this;
}
addColors(t, e) {
return (this.r = t.r + e.r), (this.g = t.g + e.g), (this.b = t.b + e.b), this;
}
addScalar(t) {
return (this.r += t), (this.g += t), (this.b += t), this;
}
sub(t) {
return (this.r = Math.max(0, this.r - t.r)), (this.g = Math.max(0, this.g - t.g)), (this.b = Math.max(0, this.b - t.b)), this;
}
multiply(t) {
return (this.r *= t.r), (this.g *= t.g), (this.b *= t.b), this;
}
multiplyScalar(t) {
return (this.r *= t), (this.g *= t), (this.b *= t), this;
}
lerp(t, e) {
return (this.r += (t.r - this.r) * e), (this.g += (t.g - this.g) * e), (this.b += (t.b - this.b) * e), this;
}
lerpColors(t, e, n) {
return (this.r = t.r + (e.r - t.r) * n), (this.g = t.g + (e.g - t.g) * n), (this.b = t.b + (e.b - t.b) * n), this;
}
lerpHSL(t, e) {
this.getHSL(Te), t.getHSL(Ae);
const n = X(Te.h, Ae.h, e),
i = X(Te.s, Ae.s, e),
r = X(Te.l, Ae.l, e);
return this.setHSL(n, i, r), this;
}
equals(t) {
return t.r === this.r && t.g === this.g && t.b === this.b;
}
fromArray(t, e = 0) {
return (this.r = t[e]), (this.g = t[e + 1]), (this.b = t[e + 2]), this;
}
toArray(t = [], e = 0) {
return (t[e] = this.r), (t[e + 1] = this.g), (t[e + 2] = this.b), t;
}
fromBufferAttribute(t, e) {
return (this.r = t.getX(e)), (this.g = t.getY(e)), (this.b = t.getZ(e)), !0 === t.normalized && ((this.r /= 255), (this.g /= 255), (this.b /= 255)), this;
}
toJSON() {
return this.getHex();
}
}
(Pe.NAMES = Ee), (Pe.prototype.isColor = !0), (Pe.prototype.r = 1), (Pe.prototype.g = 1), (Pe.prototype.b = 1);
class De extends Se {
constructor(t) {
super(), (this.type = "MeshBasicMaterial"), (this.color = new Pe(16777215)), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = "round"), (this.wireframeLinejoin = "round"), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), this;
}
}
De.prototype.isMeshBasicMaterial = !0;
const Ie = new ht(),
Ne = new $();
class ze {
constructor(t, e, n) {
if (Array.isArray(t)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
(this.name = ""), (this.array = t), (this.itemSize = e), (this.count = void 0 !== t ? t.length / e : 0), (this.normalized = !0 === n), (this.usage = F), (this.updateRange = { offset: 0, count: -1 }), (this.version = 0);
}
onUploadCallback() {}
set needsUpdate(t) {
!0 === t && this.version++;
}
setUsage(t) {
return (this.usage = t), this;
}
copy(t) {
return (this.name = t.name), (this.array = new t.array.constructor(t.array)), (this.itemSize = t.itemSize), (this.count = t.count), (this.normalized = t.normalized), (this.usage = t.usage), this;
}
copyAt(t, e, n) {
(t *= this.itemSize), (n *= e.itemSize);
for (let i = 0, r = this.itemSize; i < r; i++) this.array[t + i] = e.array[n + i];
return this;
}
copyArray(t) {
return this.array.set(t), this;
}
copyColorsArray(t) {
const e = this.array;
let n = 0;
for (let i = 0, r = t.length; i < r; i++) {
let r = t[i];
void 0 === r && (console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined", i), (r = new Pe())), (e[n++] = r.r), (e[n++] = r.g), (e[n++] = r.b);
}
return this;
}
copyVector2sArray(t) {
const e = this.array;
let n = 0;
for (let i = 0, r = t.length; i < r; i++) {
let r = t[i];
void 0 === r && (console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined", i), (r = new $())), (e[n++] = r.x), (e[n++] = r.y);
}
return this;
}
copyVector3sArray(t) {
const e = this.array;
let n = 0;
for (let i = 0, r = t.length; i < r; i++) {
let r = t[i];
void 0 === r && (console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined", i), (r = new ht())), (e[n++] = r.x), (e[n++] = r.y), (e[n++] = r.z);
}
return this;
}
copyVector4sArray(t) {
const e = this.array;
let n = 0;
for (let i = 0, r = t.length; i < r; i++) {
let r = t[i];
void 0 === r && (console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined", i), (r = new st())), (e[n++] = r.x), (e[n++] = r.y), (e[n++] = r.z), (e[n++] = r.w);
}
return this;
}
applyMatrix3(t) {
if (2 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) Ne.fromBufferAttribute(this, e), Ne.applyMatrix3(t), this.setXY(e, Ne.x, Ne.y);
else if (3 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) Ie.fromBufferAttribute(this, e), Ie.applyMatrix3(t), this.setXYZ(e, Ie.x, Ie.y, Ie.z);
return this;
}
applyMatrix4(t) {
for (let e = 0, n = this.count; e < n; e++) (Ie.x = this.getX(e)), (Ie.y = this.getY(e)), (Ie.z = this.getZ(e)), Ie.applyMatrix4(t), this.setXYZ(e, Ie.x, Ie.y, Ie.z);
return this;
}
applyNormalMatrix(t) {
for (let e = 0, n = this.count; e < n; e++) (Ie.x = this.getX(e)), (Ie.y = this.getY(e)), (Ie.z = this.getZ(e)), Ie.applyNormalMatrix(t), this.setXYZ(e, Ie.x, Ie.y, Ie.z);
return this;
}
transformDirection(t) {
for (let e = 0, n = this.count; e < n; e++) (Ie.x = this.getX(e)), (Ie.y = this.getY(e)), (Ie.z = this.getZ(e)), Ie.transformDirection(t), this.setXYZ(e, Ie.x, Ie.y, Ie.z);
return this;
}
set(t, e = 0) {
return this.array.set(t, e), this;
}
getX(t) {
return this.array[t * this.itemSize];
}
setX(t, e) {
return (this.array[t * this.itemSize] = e), this;
}
getY(t) {
return this.array[t * this.itemSize + 1];
}
setY(t, e) {
return (this.array[t * this.itemSize + 1] = e), this;
}
getZ(t) {
return this.array[t * this.itemSize + 2];
}
setZ(t, e) {
return (this.array[t * this.itemSize + 2] = e), this;
}
getW(t) {
return this.array[t * this.itemSize + 3];
}
setW(t, e) {
return (this.array[t * this.itemSize + 3] = e), this;
}
setXY(t, e, n) {
return (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), this;
}
setXYZ(t, e, n, i) {
return (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), (this.array[t + 2] = i), this;
}
setXYZW(t, e, n, i, r) {
return (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), (this.array[t + 2] = i), (this.array[t + 3] = r), this;
}
onUpload(t) {
return (this.onUploadCallback = t), this;
}
clone() {
return new this.constructor(this.array, this.itemSize).copy(this);
}
toJSON() {
const t = { itemSize: this.itemSize, type: this.array.constructor.name, array: Array.prototype.slice.call(this.array), normalized: this.normalized };
return "" !== this.name && (t.name = this.name), this.usage !== F && (t.usage = this.usage), (0 === this.updateRange.offset && -1 === this.updateRange.count) || (t.updateRange = this.updateRange), t;
}
}
ze.prototype.isBufferAttribute = !0;
class Oe extends ze {
constructor(t, e, n) {
super(new Uint16Array(t), e, n);
}
}
class Fe extends ze {
constructor(t, e, n) {
super(new Uint32Array(t), e, n);
}
}
(class extends ze {
constructor(t, e, n) {
super(new Uint16Array(t), e, n);
}
}.prototype.isFloat16BufferAttribute = !0);
class Be extends ze {
constructor(t, e, n) {
super(new Float32Array(t), e, n);
}
}
let Ue = 0;
const He = new Ht(),
Ve = new ue(),
ke = new ht(),
Ge = new dt(),
We = new dt(),
je = new ht();
class qe extends H {
constructor() {
super(), Object.defineProperty(this, "id", { value: Ue++ }), (this.uuid = W()), (this.name = ""), (this.type = "BufferGeometry"), (this.index = null), (this.attributes = {}), (this.morphAttributes = {}), (this.morphTargetsRelative = !1), (this.groups = []), (this.boundingBox = null), (this.boundingSphere = null), (this.drawRange = { start: 0, count: 1 / 0 }), (this.userData = {});
}
getIndex() {
return this.index;
}
setIndex(t) {
return Array.isArray(t) ? (this.index = new (Q(t) > 65535 ? Fe : Oe)(t, 1)) : (this.index = t), this;
}
getAttribute(t) {
return this.attributes[t];
}
setAttribute(t, e) {
return (this.attributes[t] = e), this;
}
deleteAttribute(t) {
return delete this.attributes[t], this;
}
hasAttribute(t) {
return void 0 !== this.attributes[t];
}
addGroup(t, e, n = 0) {
this.groups.push({ start: t, count: e, materialIndex: n });
}
clearGroups() {
this.groups = [];
}
setDrawRange(t, e) {
(this.drawRange.start = t), (this.drawRange.count = e);
}
applyMatrix4(t) {
const e = this.attributes.position;
void 0 !== e && (e.applyMatrix4(t), (e.needsUpdate = !0));
const n = this.attributes.normal;
if (void 0 !== n) {
const e = new Z().getNormalMatrix(t);
n.applyNormalMatrix(e), (n.needsUpdate = !0);
}
const i = this.attributes.tangent;
return void 0 !== i && (i.transformDirection(t), (i.needsUpdate = !0)), null !== this.boundingBox && this.computeBoundingBox(), null !== this.boundingSphere && this.computeBoundingSphere(), this;
}
applyQuaternion(t) {
return He.makeRotationFromQuaternion(t), this.applyMatrix4(He), this;
}
rotateX(t) {
return He.makeRotationX(t), this.applyMatrix4(He), this;
}
rotateY(t) {
return He.makeRotationY(t), this.applyMatrix4(He), this;
}
rotateZ(t) {
return He.makeRotationZ(t), this.applyMatrix4(He), this;
}
translate(t, e, n) {
return He.makeTranslation(t, e, n), this.applyMatrix4(He), this;
}
scale(t, e, n) {
return He.makeScale(t, e, n), this.applyMatrix4(He), this;
}
lookAt(t) {
return Ve.lookAt(t), Ve.updateMatrix(), this.applyMatrix4(Ve.matrix), this;
}
center() {
return this.computeBoundingBox(), this.boundingBox.getCenter(ke).negate(), this.translate(ke.x, ke.y, ke.z), this;
}
setFromPoints(t) {
const e = [];
for (let n = 0, i = t.length; n < i; n++) {
const i = t[n];
e.push(i.x, i.y, i.z || 0);
}
return this.setAttribute("position", new Be(e, 3)), this;
}
computeBoundingBox() {
null === this.boundingBox && (this.boundingBox = new dt());
const t = this.attributes.position,
e = this.morphAttributes.position;
if (t && t.isGLBufferAttribute) return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this), void this.boundingBox.set(new ht(-1 / 0, -1 / 0, -1 / 0), new ht(1 / 0, 1 / 0, 1 / 0));
if (void 0 !== t) {
if ((this.boundingBox.setFromBufferAttribute(t), e))
for (let t = 0, n = e.length; t < n; t++) {
const n = e[t];
Ge.setFromBufferAttribute(n), this.morphTargetsRelative ? (je.addVectors(this.boundingBox.min, Ge.min), this.boundingBox.expandByPoint(je), je.addVectors(this.boundingBox.max, Ge.max), this.boundingBox.expandByPoint(je)) : (this.boundingBox.expandByPoint(Ge.min), this.boundingBox.expandByPoint(Ge.max));
}
} else this.boundingBox.makeEmpty();
(isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) && console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this);
}
computeBoundingSphere() {
null === this.boundingSphere && (this.boundingSphere = new Pt());
const t = this.attributes.position,
e = this.morphAttributes.position;
if (t && t.isGLBufferAttribute) return console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this), void this.boundingSphere.set(new ht(), 1 / 0);
if (t) {
const n = this.boundingSphere.center;
if ((Ge.setFromBufferAttribute(t), e))
for (let t = 0, n = e.length; t < n; t++) {
const n = e[t];
We.setFromBufferAttribute(n), this.morphTargetsRelative ? (je.addVectors(Ge.min, We.min), Ge.expandByPoint(je), je.addVectors(Ge.max, We.max), Ge.expandByPoint(je)) : (Ge.expandByPoint(We.min), Ge.expandByPoint(We.max));
}
Ge.getCenter(n);
let i = 0;
for (let e = 0, r = t.count; e < r; e++) je.fromBufferAttribute(t, e), (i = Math.max(i, n.distanceToSquared(je)));
if (e)
for (let r = 0, s = e.length; r < s; r++) {
const s = e[r],
a = this.morphTargetsRelative;
for (let e = 0, r = s.count; e < r; e++) je.fromBufferAttribute(s, e), a && (ke.fromBufferAttribute(t, e), je.add(ke)), (i = Math.max(i, n.distanceToSquared(je)));
}
(this.boundingSphere.radius = Math.sqrt(i)), isNaN(this.boundingSphere.radius) && console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this);
}
}
computeTangents() {
const t = this.index,
e = this.attributes;
if (null === t || void 0 === e.position || void 0 === e.normal || void 0 === e.uv) return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");
const n = t.array,
i = e.position.array,
r = e.normal.array,
s = e.uv.array,
a = i.length / 3;
void 0 === e.tangent && this.setAttribute("tangent", new ze(new Float32Array(4 * a), 4));
const o = e.tangent.array,
l = [],
h = [];
for (let t = 0; t < a; t++) (l[t] = new ht()), (h[t] = new ht());
const c = new ht(),
u = new ht(),
d = new ht(),
p = new $(),
m = new $(),
f = new $(),
g = new ht(),
v = new ht();
function x(t, e, n) {
c.fromArray(i, 3 * t), u.fromArray(i, 3 * e), d.fromArray(i, 3 * n), p.fromArray(s, 2 * t), m.fromArray(s, 2 * e), f.fromArray(s, 2 * n), u.sub(c), d.sub(c), m.sub(p), f.sub(p);
const r = 1 / (m.x * f.y - f.x * m.y);
isFinite(r) && (g.copy(u).multiplyScalar(f.y).addScaledVector(d, -m.y).multiplyScalar(r), v.copy(d).multiplyScalar(m.x).addScaledVector(u, -f.x).multiplyScalar(r), l[t].add(g), l[e].add(g), l[n].add(g), h[t].add(v), h[e].add(v), h[n].add(v));
}
let y = this.groups;
0 === y.length && (y = [{ start: 0, count: n.length }]);
for (let t = 0, e = y.length; t < e; ++t) {
const e = y[t],
i = e.start;
for (let t = i, r = i + e.count; t < r; t += 3) x(n[t + 0], n[t + 1], n[t + 2]);
}
const _ = new ht(),
b = new ht(),
w = new ht(),
M = new ht();
function S(t) {
w.fromArray(r, 3 * t), M.copy(w);
const e = l[t];
_.copy(e), _.sub(w.multiplyScalar(w.dot(e))).normalize(), b.crossVectors(M, e);
const n = b.dot(h[t]) < 0 ? -1 : 1;
(o[4 * t] = _.x), (o[4 * t + 1] = _.y), (o[4 * t + 2] = _.z), (o[4 * t + 3] = n);
}
for (let t = 0, e = y.length; t < e; ++t) {
const e = y[t],
i = e.start;
for (let t = i, r = i + e.count; t < r; t += 3) S(n[t + 0]), S(n[t + 1]), S(n[t + 2]);
}
}
computeVertexNormals() {
const t = this.index,
e = this.getAttribute("position");
if (void 0 !== e) {
let n = this.getAttribute("normal");
if (void 0 === n) (n = new ze(new Float32Array(3 * e.count), 3)), this.setAttribute("normal", n);
else for (let t = 0, e = n.count; t < e; t++) n.setXYZ(t, 0, 0, 0);
const i = new ht(),
r = new ht(),
s = new ht(),
a = new ht(),
o = new ht(),
l = new ht(),
h = new ht(),
c = new ht();
if (t)
for (let u = 0, d = t.count; u < d; u += 3) {
const d = t.getX(u + 0),
p = t.getX(u + 1),
m = t.getX(u + 2);
i.fromBufferAttribute(e, d), r.fromBufferAttribute(e, p), s.fromBufferAttribute(e, m), h.subVectors(s, r), c.subVectors(i, r), h.cross(c), a.fromBufferAttribute(n, d), o.fromBufferAttribute(n, p), l.fromBufferAttribute(n, m), a.add(h), o.add(h), l.add(h), n.setXYZ(d, a.x, a.y, a.z), n.setXYZ(p, o.x, o.y, o.z), n.setXYZ(m, l.x, l.y, l.z);
}
else for (let t = 0, a = e.count; t < a; t += 3) i.fromBufferAttribute(e, t + 0), r.fromBufferAttribute(e, t + 1), s.fromBufferAttribute(e, t + 2), h.subVectors(s, r), c.subVectors(i, r), h.cross(c), n.setXYZ(t + 0, h.x, h.y, h.z), n.setXYZ(t + 1, h.x, h.y, h.z), n.setXYZ(t + 2, h.x, h.y, h.z);
this.normalizeNormals(), (n.needsUpdate = !0);
}
}
merge(t, e) {
if (!t || !t.isBufferGeometry) return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.", t);
void 0 === e && ((e = 0), console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
const n = this.attributes;
for (const i in n) {
if (void 0 === t.attributes[i]) continue;
const r = n[i].array,
s = t.attributes[i],
a = s.array,
o = s.itemSize * e,
l = Math.min(a.length, r.length - o);
for (let t = 0, e = o; t < l; t++, e++) r[e] = a[t];
}
return this;
}
normalizeNormals() {
const t = this.attributes.normal;
for (let e = 0, n = t.count; e < n; e++) je.fromBufferAttribute(t, e), je.normalize(), t.setXYZ(e, je.x, je.y, je.z);
}
toNonIndexed() {
function t(t, e) {
const n = t.array,
i = t.itemSize,
r = t.normalized,
s = new n.constructor(e.length * i);
let a = 0,
o = 0;
for (let r = 0, l = e.length; r < l; r++) {
a = t.isInterleavedBufferAttribute ? e[r] * t.data.stride + t.offset : e[r] * i;
for (let t = 0; t < i; t++) s[o++] = n[a++];
}
return new ze(s, i, r);
}
if (null === this.index) return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."), this;
const e = new qe(),
n = this.index.array,
i = this.attributes;
for (const r in i) {
const s = t(i[r], n);
e.setAttribute(r, s);
}
const r = this.morphAttributes;
for (const i in r) {
const s = [],
a = r[i];
for (let e = 0, i = a.length; e < i; e++) {
const i = t(a[e], n);
s.push(i);
}
e.morphAttributes[i] = s;
}
e.morphTargetsRelative = this.morphTargetsRelative;
const s = this.groups;
for (let t = 0, n = s.length; t < n; t++) {
const n = s[t];
e.addGroup(n.start, n.count, n.materialIndex);
}
return e;
}
toJSON() {
const t = { metadata: { version: 4.5, type: "BufferGeometry", generator: "BufferGeometry.toJSON" } };
if (((t.uuid = this.uuid), (t.type = this.type), "" !== this.name && (t.name = this.name), Object.keys(this.userData).length > 0 && (t.userData = this.userData), void 0 !== this.parameters)) {
const e = this.parameters;
for (const n in e) void 0 !== e[n] && (t[n] = e[n]);
return t;
}
t.data = { attributes: {} };
const e = this.index;
null !== e && (t.data.index = { type: e.array.constructor.name, array: Array.prototype.slice.call(e.array) });
const n = this.attributes;
for (const e in n) {
const i = n[e];
t.data.attributes[e] = i.toJSON(t.data);
}
const i = {};
let r = !1;
for (const e in this.morphAttributes) {
const n = this.morphAttributes[e],
s = [];
for (let e = 0, i = n.length; e < i; e++) {
const i = n[e];
s.push(i.toJSON(t.data));
}
s.length > 0 && ((i[e] = s), (r = !0));
}
r && ((t.data.morphAttributes = i), (t.data.morphTargetsRelative = this.morphTargetsRelative));
const s = this.groups;
s.length > 0 && (t.data.groups = JSON.parse(JSON.stringify(s)));
const a = this.boundingSphere;
return null !== a && (t.data.boundingSphere = { center: a.center.toArray(), radius: a.radius }), t;
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
(this.index = null), (this.attributes = {}), (this.morphAttributes = {}), (this.groups = []), (this.boundingBox = null), (this.boundingSphere = null);
const e = {};
this.name = t.name;
const n = t.index;
null !== n && this.setIndex(n.clone(e));
const i = t.attributes;
for (const t in i) {
const n = i[t];
this.setAttribute(t, n.clone(e));
}
const r = t.morphAttributes;
for (const t in r) {
const n = [],
i = r[t];
for (let t = 0, r = i.length; t < r; t++) n.push(i[t].clone(e));
this.morphAttributes[t] = n;
}
this.morphTargetsRelative = t.morphTargetsRelative;
const s = t.groups;
for (let t = 0, e = s.length; t < e; t++) {
const e = s[t];
this.addGroup(e.start, e.count, e.materialIndex);
}
const a = t.boundingBox;
null !== a && (this.boundingBox = a.clone());
const o = t.boundingSphere;
return null !== o && (this.boundingSphere = o.clone()), (this.drawRange.start = t.drawRange.start), (this.drawRange.count = t.drawRange.count), (this.userData = t.userData), void 0 !== t.parameters && (this.parameters = Object.assign({}, t.parameters)), this;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
}
qe.prototype.isBufferGeometry = !0;
const Xe = new Ht(),
Ye = new Ut(),
Je = new Pt(),
$e = new ht(),
Ze = new ht(),
Qe = new ht(),
Ke = new ht(),
tn = new ht(),
en = new ht(),
nn = new ht(),
rn = new ht(),
sn = new ht(),
an = new $(),
on = new $(),
ln = new $(),
hn = new ht(),
cn = new ht();
class un extends ue {
constructor(t = new qe(), e = new De()) {
super(), (this.type = "Mesh"), (this.geometry = t), (this.material = e), this.updateMorphTargets();
}
copy(t) {
return super.copy(t), void 0 !== t.morphTargetInfluences && (this.morphTargetInfluences = t.morphTargetInfluences.slice()), void 0 !== t.morphTargetDictionary && (this.morphTargetDictionary = Object.assign({}, t.morphTargetDictionary)), (this.material = t.material), (this.geometry = t.geometry), this;
}
updateMorphTargets() {
const t = this.geometry;
if (t.isBufferGeometry) {
const e = t.morphAttributes,
n = Object.keys(e);
if (n.length > 0) {
const t = e[n[0]];
if (void 0 !== t) {
(this.morphTargetInfluences = []), (this.morphTargetDictionary = {});
for (let e = 0, n = t.length; e < n; e++) {
const n = t[e].name || String(e);
this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e);
}
}
}
} else {
const e = t.morphTargets;
void 0 !== e && e.length > 0 && console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
}
}
raycast(t, e) {
const n = this.geometry,
i = this.material,
r = this.matrixWorld;
if (void 0 === i) return;
if ((null === n.boundingSphere && n.computeBoundingSphere(), Je.copy(n.boundingSphere), Je.applyMatrix4(r), !1 === t.ray.intersectsSphere(Je))) return;
if ((Xe.copy(r).invert(), Ye.copy(t.ray).applyMatrix4(Xe), null !== n.boundingBox && !1 === Ye.intersectsBox(n.boundingBox))) return;
let s;
if (n.isBufferGeometry) {
const r = n.index,
a = n.attributes.position,
o = n.morphAttributes.position,
l = n.morphTargetsRelative,
h = n.attributes.uv,
c = n.attributes.uv2,
u = n.groups,
d = n.drawRange;
if (null !== r)
if (Array.isArray(i))
for (let n = 0, p = u.length; n < p; n++) {
const p = u[n],
m = i[p.materialIndex];
for (let n = Math.max(p.start, d.start), i = Math.min(r.count, Math.min(p.start + p.count, d.start + d.count)); n < i; n += 3) {
const i = r.getX(n),
u = r.getX(n + 1),
d = r.getX(n + 2);
(s = dn(this, m, t, Ye, a, o, l, h, c, i, u, d)), s && ((s.faceIndex = Math.floor(n / 3)), (s.face.materialIndex = p.materialIndex), e.push(s));
}
}
else {
for (let n = Math.max(0, d.start), u = Math.min(r.count, d.start + d.count); n < u; n += 3) {
const u = r.getX(n),
d = r.getX(n + 1),
p = r.getX(n + 2);
(s = dn(this, i, t, Ye, a, o, l, h, c, u, d, p)), s && ((s.faceIndex = Math.floor(n / 3)), e.push(s));
}
}
else if (void 0 !== a)
if (Array.isArray(i))
for (let n = 0, r = u.length; n < r; n++) {
const r = u[n],
p = i[r.materialIndex];
for (let n = Math.max(r.start, d.start), i = Math.min(a.count, Math.min(r.start + r.count, d.start + d.count)); n < i; n += 3) {
(s = dn(this, p, t, Ye, a, o, l, h, c, n, n + 1, n + 2)), s && ((s.faceIndex = Math.floor(n / 3)), (s.face.materialIndex = r.materialIndex), e.push(s));
}
}
else {
for (let n = Math.max(0, d.start), r = Math.min(a.count, d.start + d.count); n < r; n += 3) {
(s = dn(this, i, t, Ye, a, o, l, h, c, n, n + 1, n + 2)), s && ((s.faceIndex = Math.floor(n / 3)), e.push(s));
}
}
} else n.isGeometry && console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
}
}
function dn(t, e, n, i, r, s, a, o, l, h, c, u) {
$e.fromBufferAttribute(r, h), Ze.fromBufferAttribute(r, c), Qe.fromBufferAttribute(r, u);
const d = t.morphTargetInfluences;
if (s && d) {
nn.set(0, 0, 0), rn.set(0, 0, 0), sn.set(0, 0, 0);
for (let t = 0, e = s.length; t < e; t++) {
const e = d[t],
n = s[t];
0 !== e && (Ke.fromBufferAttribute(n, h), tn.fromBufferAttribute(n, c), en.fromBufferAttribute(n, u), a ? (nn.addScaledVector(Ke, e), rn.addScaledVector(tn, e), sn.addScaledVector(en, e)) : (nn.addScaledVector(Ke.sub($e), e), rn.addScaledVector(tn.sub(Ze), e), sn.addScaledVector(en.sub(Qe), e)));
}
$e.add(nn), Ze.add(rn), Qe.add(sn);
}
t.isSkinnedMesh && (t.boneTransform(h, $e), t.boneTransform(c, Ze), t.boneTransform(u, Qe));
const p = (function (t, e, n, i, r, s, a, o) {
let l;
if (((l = 1 === e.side ? i.intersectTriangle(a, s, r, !0, o) : i.intersectTriangle(r, s, a, 2 !== e.side, o)), null === l)) return null;
cn.copy(o), cn.applyMatrix4(t.matrixWorld);
const h = n.ray.origin.distanceTo(cn);
return h < n.near || h > n.far ? null : { distance: h, point: cn.clone(), object: t };
})(t, e, n, i, $e, Ze, Qe, hn);
if (p) {
o && (an.fromBufferAttribute(o, h), on.fromBufferAttribute(o, c), ln.fromBufferAttribute(o, u), (p.uv = we.getUV(hn, $e, Ze, Qe, an, on, ln, new $()))), l && (an.fromBufferAttribute(l, h), on.fromBufferAttribute(l, c), ln.fromBufferAttribute(l, u), (p.uv2 = we.getUV(hn, $e, Ze, Qe, an, on, ln, new $())));
const t = { a: h, b: c, c: u, normal: new ht(), materialIndex: 0 };
we.getNormal($e, Ze, Qe, t.normal), (p.face = t);
}
return p;
}
un.prototype.isMesh = !0;
class pn extends qe {
constructor(t = 1, e = 1, n = 1, i = 1, r = 1, s = 1) {
super(), (this.type = "BoxGeometry"), (this.parameters = { width: t, height: e, depth: n, widthSegments: i, heightSegments: r, depthSegments: s });
const a = this;
(i = Math.floor(i)), (r = Math.floor(r)), (s = Math.floor(s));
const o = [],
l = [],
h = [],
c = [];
let u = 0,
d = 0;
function p(t, e, n, i, r, s, p, m, f, g, v) {
const x = s / f,
y = p / g,
_ = s / 2,
b = p / 2,
w = m / 2,
M = f + 1,
S = g + 1;
let E = 0,
T = 0;
const A = new ht();
for (let s = 0; s < S; s++) {
const a = s * y - b;
for (let o = 0; o < M; o++) {
const u = o * x - _;
(A[t] = u * i), (A[e] = a * r), (A[n] = w), l.push(A.x, A.y, A.z), (A[t] = 0), (A[e] = 0), (A[n] = m > 0 ? 1 : -1), h.push(A.x, A.y, A.z), c.push(o / f), c.push(1 - s / g), (E += 1);
}
}
for (let t = 0; t < g; t++)
for (let e = 0; e < f; e++) {
const n = u + e + M * t,
i = u + e + M * (t + 1),
r = u + (e + 1) + M * (t + 1),
s = u + (e + 1) + M * t;
o.push(n, i, s), o.push(i, r, s), (T += 6);
}
a.addGroup(d, T, v), (d += T), (u += E);
}
p("z", "y", "x", -1, -1, n, e, t, s, r, 0), p("z", "y", "x", 1, -1, n, e, -t, s, r, 1), p("x", "z", "y", 1, 1, t, n, e, i, s, 2), p("x", "z", "y", 1, -1, t, n, -e, i, s, 3), p("x", "y", "z", 1, -1, t, e, n, i, r, 4), p("x", "y", "z", -1, -1, t, e, -n, i, r, 5), this.setIndex(o), this.setAttribute("position", new Be(l, 3)), this.setAttribute("normal", new Be(h, 3)), this.setAttribute("uv", new Be(c, 2));
}
static fromJSON(t) {
return new pn(t.width, t.height, t.depth, t.widthSegments, t.heightSegments, t.depthSegments);
}
}
function mn(t) {
const e = {};
for (const n in t) {
e[n] = {};
for (const i in t[n]) {
const r = t[n][i];
r && (r.isColor || r.isMatrix3 || r.isMatrix4 || r.isVector2 || r.isVector3 || r.isVector4 || r.isTexture || r.isQuaternion) ? (e[n][i] = r.clone()) : Array.isArray(r) ? (e[n][i] = r.slice()) : (e[n][i] = r);
}
}
return e;
}
function fn(t) {
const e = {};
for (let n = 0; n < t.length; n++) {
const i = mn(t[n]);
for (const t in i) e[t] = i[t];
}
return e;
}
const gn = { clone: mn, merge: fn };
class vn extends Se {
constructor(t) {
super(), (this.type = "ShaderMaterial"), (this.defines = {}), (this.uniforms = {}), (this.vertexShader = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"), (this.fragmentShader = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"), (this.linewidth = 1), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.fog = !1), (this.lights = !1), (this.clipping = !1), (this.extensions = { derivatives: !1, fragDepth: !1, drawBuffers: !1, shaderTextureLOD: !1 }), (this.defaultAttributeValues = { color: [1, 1, 1], uv: [0, 0], uv2: [0, 0] }), (this.index0AttributeName = void 0), (this.uniformsNeedUpdate = !1), (this.glslVersion = null), void 0 !== t && (void 0 !== t.attributes && console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."), this.setValues(t));
}
copy(t) {
return super.copy(t), (this.fragmentShader = t.fragmentShader), (this.vertexShader = t.vertexShader), (this.uniforms = mn(t.uniforms)), (this.defines = Object.assign({}, t.defines)), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.lights = t.lights), (this.clipping = t.clipping), (this.extensions = Object.assign({}, t.extensions)), (this.glslVersion = t.glslVersion), this;
}
toJSON(t) {
const e = super.toJSON(t);
(e.glslVersion = this.glslVersion), (e.uniforms = {});
for (const n in this.uniforms) {
const i = this.uniforms[n].value;
i && i.isTexture ? (e.uniforms[n] = { type: "t", value: i.toJSON(t).uuid }) : i && i.isColor ? (e.uniforms[n] = { type: "c", value: i.getHex() }) : i && i.isVector2 ? (e.uniforms[n] = { type: "v2", value: i.toArray() }) : i && i.isVector3 ? (e.uniforms[n] = { type: "v3", value: i.toArray() }) : i && i.isVector4 ? (e.uniforms[n] = { type: "v4", value: i.toArray() }) : i && i.isMatrix3 ? (e.uniforms[n] = { type: "m3", value: i.toArray() }) : i && i.isMatrix4 ? (e.uniforms[n] = { type: "m4", value: i.toArray() }) : (e.uniforms[n] = { value: i });
}
Object.keys(this.defines).length > 0 && (e.defines = this.defines), (e.vertexShader = this.vertexShader), (e.fragmentShader = this.fragmentShader);
const n = {};
for (const t in this.extensions) !0 === this.extensions[t] && (n[t] = !0);
return Object.keys(n).length > 0 && (e.extensions = n), e;
}
}
vn.prototype.isShaderMaterial = !0;
class xn extends ue {
constructor() {
super(), (this.type = "Camera"), (this.matrixWorldInverse = new Ht()), (this.projectionMatrix = new Ht()), (this.projectionMatrixInverse = new Ht());
}
copy(t, e) {
return super.copy(t, e), this.matrixWorldInverse.copy(t.matrixWorldInverse), this.projectionMatrix.copy(t.projectionMatrix), this.projectionMatrixInverse.copy(t.projectionMatrixInverse), this;
}
getWorldDirection(t) {
this.updateWorldMatrix(!0, !1);
const e = this.matrixWorld.elements;
return t.set(-e[8], -e[9], -e[10]).normalize();
}
updateMatrixWorld(t) {
super.updateMatrixWorld(t), this.matrixWorldInverse.copy(this.matrixWorld).invert();
}
updateWorldMatrix(t, e) {
super.updateWorldMatrix(t, e), this.matrixWorldInverse.copy(this.matrixWorld).invert();
}
clone() {
return new this.constructor().copy(this);
}
}
xn.prototype.isCamera = !0;
class yn extends xn {
constructor(t = 50, e = 1, n = 0.1, i = 2e3) {
super(), (this.type = "PerspectiveCamera"), (this.fov = t), (this.zoom = 1), (this.near = n), (this.far = i), (this.focus = 10), (this.aspect = e), (this.view = null), (this.filmGauge = 35), (this.filmOffset = 0), this.updateProjectionMatrix();
}
copy(t, e) {
return super.copy(t, e), (this.fov = t.fov), (this.zoom = t.zoom), (this.near = t.near), (this.far = t.far), (this.focus = t.focus), (this.aspect = t.aspect), (this.view = null === t.view ? null : Object.assign({}, t.view)), (this.filmGauge = t.filmGauge), (this.filmOffset = t.filmOffset), this;
}
setFocalLength(t) {
const e = (0.5 * this.getFilmHeight()) / t;
(this.fov = 2 * G * Math.atan(e)), this.updateProjectionMatrix();
}
getFocalLength() {
const t = Math.tan(0.5 * k * this.fov);
return (0.5 * this.getFilmHeight()) / t;
}
getEffectiveFOV() {
return 2 * G * Math.atan(Math.tan(0.5 * k * this.fov) / this.zoom);
}
getFilmWidth() {
return this.filmGauge * Math.min(this.aspect, 1);
}
getFilmHeight() {
return this.filmGauge / Math.max(this.aspect, 1);
}
setViewOffset(t, e, n, i, r, s) {
(this.aspect = t / e), null === this.view && (this.view = { enabled: !0, fullWidth: 1, fullHeight: 1, offsetX: 0, offsetY: 0, width: 1, height: 1 }), (this.view.enabled = !0), (this.view.fullWidth = t), (this.view.fullHeight = e), (this.view.offsetX = n), (this.view.offsetY = i), (this.view.width = r), (this.view.height = s), this.updateProjectionMatrix();
}
clearViewOffset() {
null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix();
}
updateProjectionMatrix() {
const t = this.near;
let e = (t * Math.tan(0.5 * k * this.fov)) / this.zoom,
n = 2 * e,
i = this.aspect * n,
r = -0.5 * i;
const s = this.view;
if (null !== this.view && this.view.enabled) {
const t = s.fullWidth,
a = s.fullHeight;
(r += (s.offsetX * i) / t), (e -= (s.offsetY * n) / a), (i *= s.width / t), (n *= s.height / a);
}
const a = this.filmOffset;
0 !== a && (r += (t * a) / this.getFilmWidth()), this.projectionMatrix.makePerspective(r, r + i, e, e - n, t, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert();
}
toJSON(t) {
const e = super.toJSON(t);
return (e.object.fov = this.fov), (e.object.zoom = this.zoom), (e.object.near = this.near), (e.object.far = this.far), (e.object.focus = this.focus), (e.object.aspect = this.aspect), null !== this.view && (e.object.view = Object.assign({}, this.view)), (e.object.filmGauge = this.filmGauge), (e.object.filmOffset = this.filmOffset), e;
}
}
yn.prototype.isPerspectiveCamera = !0;
const _n = 90;
class bn extends ue {
constructor(t, e, n) {
if ((super(), (this.type = "CubeCamera"), !0 !== n.isWebGLCubeRenderTarget)) return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");
this.renderTarget = n;
const i = new yn(_n, 1, t, e);
(i.layers = this.layers), i.up.set(0, -1, 0), i.lookAt(new ht(1, 0, 0)), this.add(i);
const r = new yn(_n, 1, t, e);
(r.layers = this.layers), r.up.set(0, -1, 0), r.lookAt(new ht(-1, 0, 0)), this.add(r);
const s = new yn(_n, 1, t, e);
(s.layers = this.layers), s.up.set(0, 0, 1), s.lookAt(new ht(0, 1, 0)), this.add(s);
const a = new yn(_n, 1, t, e);
(a.layers = this.layers), a.up.set(0, 0, -1), a.lookAt(new ht(0, -1, 0)), this.add(a);
const o = new yn(_n, 1, t, e);
(o.layers = this.layers), o.up.set(0, -1, 0), o.lookAt(new ht(0, 0, 1)), this.add(o);
const l = new yn(_n, 1, t, e);
(l.layers = this.layers), l.up.set(0, -1, 0), l.lookAt(new ht(0, 0, -1)), this.add(l);
}
update(t, e) {
null === this.parent && this.updateMatrixWorld();
const n = this.renderTarget,
[i, r, s, a, o, l] = this.children,
h = t.xr.enabled,
c = t.getRenderTarget();
t.xr.enabled = !1;
const u = n.texture.generateMipmaps;
(n.texture.generateMipmaps = !1), t.setRenderTarget(n, 0), t.render(e, i), t.setRenderTarget(n, 1), t.render(e, r), t.setRenderTarget(n, 2), t.render(e, s), t.setRenderTarget(n, 3), t.render(e, a), t.setRenderTarget(n, 4), t.render(e, o), (n.texture.generateMipmaps = u), t.setRenderTarget(n, 5), t.render(e, l), t.setRenderTarget(c), (t.xr.enabled = h);
}
}
class wn extends it {
constructor(t, e, n, r, s, a, o, l, h, c) {
super((t = void 0 !== t ? t : []), (e = void 0 !== e ? e : i), n, r, s, a, o, l, h, c), (this.flipY = !1);
}
get images() {
return this.image;
}
set images(t) {
this.image = t;
}
}
wn.prototype.isCubeTexture = !0;
class Mn extends at {
constructor(t, e, n) {
Number.isInteger(e) && (console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"), (e = n)), super(t, t, e), (e = e || {}), (this.texture = new wn(void 0, e.mapping, e.wrapS, e.wrapT, e.magFilter, e.minFilter, e.format, e.type, e.anisotropy, e.encoding)), (this.texture.isRenderTargetTexture = !0), (this.texture.generateMipmaps = void 0 !== e.generateMipmaps && e.generateMipmaps), (this.texture.minFilter = void 0 !== e.minFilter ? e.minFilter : f), (this.texture._needsFlipEnvMap = !1);
}
fromEquirectangularTexture(t, e) {
(this.texture.type = e.type), (this.texture.format = S), (this.texture.encoding = e.encoding), (this.texture.generateMipmaps = e.generateMipmaps), (this.texture.minFilter = e.minFilter), (this.texture.magFilter = e.magFilter);
const n = { uniforms: { tEquirect: { value: null } }, vertexShader: "\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t", fragmentShader: "\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t" },
i = new pn(5, 5, 5),
r = new vn({ name: "CubemapFromEquirect", uniforms: mn(n.uniforms), vertexShader: n.vertexShader, fragmentShader: n.fragmentShader, side: 1, blending: 0 });
r.uniforms.tEquirect.value = e;
const s = new un(i, r),
a = e.minFilter;
e.minFilter === g && (e.minFilter = f);
return new bn(1, 10, this).update(t, s), (e.minFilter = a), s.geometry.dispose(), s.material.dispose(), this;
}
clear(t, e, n, i) {
const r = t.getRenderTarget();
for (let r = 0; r < 6; r++) t.setRenderTarget(this, r), t.clear(e, n, i);
t.setRenderTarget(r);
}
}
Mn.prototype.isWebGLCubeRenderTarget = !0;
const Sn = new ht(),
En = new ht(),
Tn = new Z();
class An {
constructor(t = new ht(1, 0, 0), e = 0) {
(this.normal = t), (this.constant = e);
}
set(t, e) {
return this.normal.copy(t), (this.constant = e), this;
}
setComponents(t, e, n, i) {
return this.normal.set(t, e, n), (this.constant = i), this;
}
setFromNormalAndCoplanarPoint(t, e) {
return this.normal.copy(t), (this.constant = -e.dot(this.normal)), this;
}
setFromCoplanarPoints(t, e, n) {
const i = Sn.subVectors(n, e).cross(En.subVectors(t, e)).normalize();
return this.setFromNormalAndCoplanarPoint(i, t), this;
}
copy(t) {
return this.normal.copy(t.normal), (this.constant = t.constant), this;
}
normalize() {
const t = 1 / this.normal.length();
return this.normal.multiplyScalar(t), (this.constant *= t), this;
}
negate() {
return (this.constant *= -1), this.normal.negate(), this;
}
distanceToPoint(t) {
return this.normal.dot(t) + this.constant;
}
distanceToSphere(t) {
return this.distanceToPoint(t.center) - t.radius;
}
projectPoint(t, e) {
return e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t);
}
intersectLine(t, e) {
const n = t.delta(Sn),
i = this.normal.dot(n);
if (0 === i) return 0 === this.distanceToPoint(t.start) ? e.copy(t.start) : null;
const r = -(t.start.dot(this.normal) + this.constant) / i;
return r < 0 || r > 1 ? null : e.copy(n).multiplyScalar(r).add(t.start);
}
intersectsLine(t) {
const e = this.distanceToPoint(t.start),
n = this.distanceToPoint(t.end);
return (e < 0 && n > 0) || (n < 0 && e > 0);
}
intersectsBox(t) {
return t.intersectsPlane(this);
}
intersectsSphere(t) {
return t.intersectsPlane(this);
}
coplanarPoint(t) {
return t.copy(this.normal).multiplyScalar(-this.constant);
}
applyMatrix4(t, e) {
const n = e || Tn.getNormalMatrix(t),
i = this.coplanarPoint(Sn).applyMatrix4(t),
r = this.normal.applyMatrix3(n).normalize();
return (this.constant = -i.dot(r)), this;
}
translate(t) {
return (this.constant -= t.dot(this.normal)), this;
}
equals(t) {
return t.normal.equals(this.normal) && t.constant === this.constant;
}
clone() {
return new this.constructor().copy(this);
}
}
An.prototype.isPlane = !0;
const Ln = new Pt(),
Cn = new ht();
class Rn {
constructor(t = new An(), e = new An(), n = new An(), i = new An(), r = new An(), s = new An()) {
this.planes = [t, e, n, i, r, s];
}
set(t, e, n, i, r, s) {
const a = this.planes;
return a[0].copy(t), a[1].copy(e), a[2].copy(n), a[3].copy(i), a[4].copy(r), a[5].copy(s), this;
}
copy(t) {
const e = this.planes;
for (let n = 0; n < 6; n++) e[n].copy(t.planes[n]);
return this;
}
setFromProjectionMatrix(t) {
const e = this.planes,
n = t.elements,
i = n[0],
r = n[1],
s = n[2],
a = n[3],
o = n[4],
l = n[5],
h = n[6],
c = n[7],
u = n[8],
d = n[9],
p = n[10],
m = n[11],
f = n[12],
g = n[13],
v = n[14],
x = n[15];
return e[0].setComponents(a - i, c - o, m - u, x - f).normalize(), e[1].setComponents(a + i, c + o, m + u, x + f).normalize(), e[2].setComponents(a + r, c + l, m + d, x + g).normalize(), e[3].setComponents(a - r, c - l, m - d, x - g).normalize(), e[4].setComponents(a - s, c - h, m - p, x - v).normalize(), e[5].setComponents(a + s, c + h, m + p, x + v).normalize(), this;
}
intersectsObject(t) {
const e = t.geometry;
return null === e.boundingSphere && e.computeBoundingSphere(), Ln.copy(e.boundingSphere).applyMatrix4(t.matrixWorld), this.intersectsSphere(Ln);
}
intersectsSprite(t) {
return Ln.center.set(0, 0, 0), (Ln.radius = 0.7071067811865476), Ln.applyMatrix4(t.matrixWorld), this.intersectsSphere(Ln);
}
intersectsSphere(t) {
const e = this.planes,
n = t.center,
i = -t.radius;
for (let t = 0; t < 6; t++) {
if (e[t].distanceToPoint(n) < i) return !1;
}
return !0;
}
intersectsBox(t) {
const e = this.planes;
for (let n = 0; n < 6; n++) {
const i = e[n];
if (((Cn.x = i.normal.x > 0 ? t.max.x : t.min.x), (Cn.y = i.normal.y > 0 ? t.max.y : t.min.y), (Cn.z = i.normal.z > 0 ? t.max.z : t.min.z), i.distanceToPoint(Cn) < 0)) return !1;
}
return !0;
}
containsPoint(t) {
const e = this.planes;
for (let n = 0; n < 6; n++) if (e[n].distanceToPoint(t) < 0) return !1;
return !0;
}
clone() {
return new this.constructor().copy(this);
}
}
function Pn() {
let t = null,
e = !1,
n = null,
i = null;
function r(e, s) {
n(e, s), (i = t.requestAnimationFrame(r));
}
return {
start: function () {
!0 !== e && null !== n && ((i = t.requestAnimationFrame(r)), (e = !0));
},
stop: function () {
t.cancelAnimationFrame(i), (e = !1);
},
setAnimationLoop: function (t) {
n = t;
},
setContext: function (e) {
t = e;
},
};
}
function Dn(t, e) {
const n = e.isWebGL2,
i = new WeakMap();
return {
get: function (t) {
return t.isInterleavedBufferAttribute && (t = t.data), i.get(t);
},
remove: function (e) {
e.isInterleavedBufferAttribute && (e = e.data);
const n = i.get(e);
n && (t.deleteBuffer(n.buffer), i.delete(e));
},
update: function (e, r) {
if (e.isGLBufferAttribute) {
const t = i.get(e);
return void ((!t || t.version < e.version) && i.set(e, { buffer: e.buffer, type: e.type, bytesPerElement: e.elementSize, version: e.version }));
}
e.isInterleavedBufferAttribute && (e = e.data);
const s = i.get(e);
void 0 === s
? i.set(
e,
(function (e, i) {
const r = e.array,
s = e.usage,
a = t.createBuffer();
t.bindBuffer(i, a), t.bufferData(i, r, s), e.onUploadCallback();
let o = 5126;
return r instanceof Float32Array ? (o = 5126) : r instanceof Float64Array ? console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.") : r instanceof Uint16Array ? (e.isFloat16BufferAttribute ? (n ? (o = 5131) : console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.")) : (o = 5123)) : r instanceof Int16Array ? (o = 5122) : r instanceof Uint32Array ? (o = 5125) : r instanceof Int32Array ? (o = 5124) : r instanceof Int8Array ? (o = 5120) : (r instanceof Uint8Array || r instanceof Uint8ClampedArray) && (o = 5121), { buffer: a, type: o, bytesPerElement: r.BYTES_PER_ELEMENT, version: e.version };
})(e, r)
)
: s.version < e.version &&
(!(function (e, i, r) {
const s = i.array,
a = i.updateRange;
t.bindBuffer(r, e), -1 === a.count ? t.bufferSubData(r, 0, s) : (n ? t.bufferSubData(r, a.offset * s.BYTES_PER_ELEMENT, s, a.offset, a.count) : t.bufferSubData(r, a.offset * s.BYTES_PER_ELEMENT, s.subarray(a.offset, a.offset + a.count)), (a.count = -1));
})(s.buffer, e, r),
(s.version = e.version));
},
};
}
class In extends qe {
constructor(t = 1, e = 1, n = 1, i = 1) {
super(), (this.type = "PlaneGeometry"), (this.parameters = { width: t, height: e, widthSegments: n, heightSegments: i });
const r = t / 2,
s = e / 2,
a = Math.floor(n),
o = Math.floor(i),
l = a + 1,
h = o + 1,
c = t / a,
u = e / o,
d = [],
p = [],
m = [],
f = [];
for (let t = 0; t < h; t++) {
const e = t * u - s;
for (let n = 0; n < l; n++) {
const i = n * c - r;
p.push(i, -e, 0), m.push(0, 0, 1), f.push(n / a), f.push(1 - t / o);
}
}
for (let t = 0; t < o; t++)
for (let e = 0; e < a; e++) {
const n = e + l * t,
i = e + l * (t + 1),
r = e + 1 + l * (t + 1),
s = e + 1 + l * t;
d.push(n, i, s), d.push(i, r, s);
}
this.setIndex(d), this.setAttribute("position", new Be(p, 3)), this.setAttribute("normal", new Be(m, 3)), this.setAttribute("uv", new Be(f, 2));
}
static fromJSON(t) {
return new In(t.width, t.height, t.widthSegments, t.heightSegments);
}
}
const Nn = {
alphamap_fragment: "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
alphamap_pars_fragment: "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",
alphatest_fragment: "#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif",
alphatest_pars_fragment: "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif",
aomap_fragment: "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif",
aomap_pars_fragment: "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",
begin_vertex: "vec3 transformed = vec3( position );",
beginnormal_vertex: "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",
bsdfs: "vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",
bumpmap_pars_fragment: "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",
clipping_planes_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",
clipping_planes_pars_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",
clipping_planes_pars_vertex: "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",
clipping_planes_vertex: "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",
color_fragment: "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",
color_pars_fragment: "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",
color_pars_vertex: "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",
color_vertex: "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",
common: "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",
cube_uv_reflection_fragment: "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 ) + 0.5;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\treturn texture2D( envMap, uv ).rgb;\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",
defaultnormal_vertex: "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",
displacementmap_pars_vertex: "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",
displacementmap_vertex: "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",
emissivemap_fragment: "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",
emissivemap_pars_fragment: "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",
encodings_fragment: "gl_FragColor = linearToOutputTexel( gl_FragColor );",
encodings_pars_fragment: "vec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn 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.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn 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.a );\n}",
envmap_fragment: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",
envmap_common_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",
envmap_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",
envmap_pars_vertex: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",
envmap_physical_pars_fragment: "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",
envmap_vertex: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",
fog_vertex: "#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",
fog_pars_vertex: "#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",
fog_fragment: "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",
fog_pars_fragment: "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
gradientmap_pars_fragment: "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",
lightmap_fragment: "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",
lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",
lights_lambert_vertex: "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",
lights_pars_begin: "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",
lights_toon_fragment: "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",
lights_toon_pars_fragment: "varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",
lights_phong_fragment: "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",
lights_phong_pars_fragment: "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",
lights_physical_fragment: "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= specularColorMapTexelToLinear( texture2D( specularColorMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= sheenColorMapTexelToLinear( texture2D( sheenColorMap, vUv ) ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",
lights_physical_pars_fragment: "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",
lights_fragment_begin: "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",
lights_fragment_maps: "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",
lights_fragment_end: "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",
logdepthbuf_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",
logdepthbuf_pars_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",
logdepthbuf_pars_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",
logdepthbuf_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",
map_fragment: "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",
map_pars_fragment: "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",
map_particle_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",
map_particle_pars_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",
metalnessmap_fragment: "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",
metalnessmap_pars_fragment: "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",
morphnormal_vertex: "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",
morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",
morphtarget_vertex: "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\t#ifndef USE_MORPHNORMALS\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\t\t\t#else\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\t\t\t#endif\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",
normal_fragment_begin: "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",
normal_fragment_maps: "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",
normal_pars_fragment: "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",
normal_pars_vertex: "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",
normal_vertex: "#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",
normalmap_pars_fragment: "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",
clearcoat_normal_fragment_begin: "#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",
clearcoat_normal_fragment_maps: "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",
clearcoat_pars_fragment: "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",
output_fragment: "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",
packing: "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",
premultiplied_alpha_fragment: "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",
project_vertex: "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",
dithering_fragment: "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",
dithering_pars_fragment: "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",
roughnessmap_fragment: "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",
roughnessmap_pars_fragment: "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",
shadowmap_pars_fragment:
"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",
shadowmap_pars_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",
shadowmap_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",
shadowmask_pars_fragment: "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",
skinbase_vertex: "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",
skinning_pars_vertex: "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",
skinning_vertex: "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",
skinnormal_vertex: "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",
specularmap_fragment: "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",
specularmap_pars_fragment: "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",
tonemapping_fragment: "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",
tonemapping_pars_fragment: "#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",
transmission_fragment: "#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif",
transmission_pars_fragment: "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",
uv_pars_fragment: "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",
uv_pars_vertex: "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",
uv_vertex: "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",
uv2_pars_fragment: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",
uv2_pars_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",
uv2_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",
worldpos_vertex: "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",
background_vert: "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",
background_frag: "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
cube_vert: "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",
cube_frag: "#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
depth_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",
depth_frag: "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",
distanceRGBA_vert: "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",
distanceRGBA_frag: "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",
equirect_vert: "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
equirect_frag: "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
linedashed_vert: "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
linedashed_frag: "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
meshbasic_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",
meshbasic_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
meshlambert_vert: "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
meshlambert_frag: "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
meshmatcap_vert: "#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",
meshmatcap_frag: "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
meshnormal_vert: "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
meshnormal_frag: "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",
meshphong_vert: "#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
meshphong_frag: "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
meshphysical_vert: "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",
meshphysical_frag: "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n\t#endif\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
meshtoon_vert: "#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
meshtoon_frag: "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
points_vert: "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
points_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
shadow_vert: "#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
shadow_frag: "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
sprite_vert: "uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
sprite_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
},
zn = { common: { diffuse: { value: new Pe(16777215) }, opacity: { value: 1 }, map: { value: null }, uvTransform: { value: new Z() }, uv2Transform: { value: new Z() }, alphaMap: { value: null }, alphaTest: { value: 0 } }, specularmap: { specularMap: { value: null } }, envmap: { envMap: { value: null }, flipEnvMap: { value: -1 }, reflectivity: { value: 1 }, ior: { value: 1.5 }, refractionRatio: { value: 0.98 } }, aomap: { aoMap: { value: null }, aoMapIntensity: { value: 1 } }, lightmap: { lightMap: { value: null }, lightMapIntensity: { value: 1 } }, emissivemap: { emissiveMap: { value: null } }, bumpmap: { bumpMap: { value: null }, bumpScale: { value: 1 } }, normalmap: { normalMap: { value: null }, normalScale: { value: new $(1, 1) } }, displacementmap: { displacementMap: { value: null }, displacementScale: { value: 1 }, displacementBias: { value: 0 } }, roughnessmap: { roughnessMap: { value: null } }, metalnessmap: { metalnessMap: { value: null } }, gradientmap: { gradientMap: { value: null } }, fog: { fogDensity: { value: 25e-5 }, fogNear: { value: 1 }, fogFar: { value: 2e3 }, fogColor: { value: new Pe(16777215) } }, lights: { ambientLightColor: { value: [] }, lightProbe: { value: [] }, directionalLights: { value: [], properties: { direction: {}, color: {} } }, directionalLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {} } }, directionalShadowMap: { value: [] }, directionalShadowMatrix: { value: [] }, spotLights: { value: [], properties: { color: {}, position: {}, direction: {}, distance: {}, coneCos: {}, penumbraCos: {}, decay: {} } }, spotLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {} } }, spotShadowMap: { value: [] }, spotShadowMatrix: { value: [] }, pointLights: { value: [], properties: { color: {}, position: {}, decay: {}, distance: {} } }, pointLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {}, shadowCameraNear: {}, shadowCameraFar: {} } }, pointShadowMap: { value: [] }, pointShadowMatrix: { value: [] }, hemisphereLights: { value: [], properties: { direction: {}, skyColor: {}, groundColor: {} } }, rectAreaLights: { value: [], properties: { color: {}, position: {}, width: {}, height: {} } }, ltc_1: { value: null }, ltc_2: { value: null } }, points: { diffuse: { value: new Pe(16777215) }, opacity: { value: 1 }, size: { value: 1 }, scale: { value: 1 }, map: { value: null }, alphaMap: { value: null }, alphaTest: { value: 0 }, uvTransform: { value: new Z() } }, sprite: { diffuse: { value: new Pe(16777215) }, opacity: { value: 1 }, center: { value: new $(0.5, 0.5) }, rotation: { value: 0 }, map: { value: null }, alphaMap: { value: null }, alphaTest: { value: 0 }, uvTransform: { value: new Z() } } },
On = { basic: { uniforms: fn([zn.common, zn.specularmap, zn.envmap, zn.aomap, zn.lightmap, zn.fog]), vertexShader: Nn.meshbasic_vert, fragmentShader: Nn.meshbasic_frag }, lambert: { uniforms: fn([zn.common, zn.specularmap, zn.envmap, zn.aomap, zn.lightmap, zn.emissivemap, zn.fog, zn.lights, { emissive: { value: new Pe(0) } }]), vertexShader: Nn.meshlambert_vert, fragmentShader: Nn.meshlambert_frag }, phong: { uniforms: fn([zn.common, zn.specularmap, zn.envmap, zn.aomap, zn.lightmap, zn.emissivemap, zn.bumpmap, zn.normalmap, zn.displacementmap, zn.fog, zn.lights, { emissive: { value: new Pe(0) }, specular: { value: new Pe(1118481) }, shininess: { value: 30 } }]), vertexShader: Nn.meshphong_vert, fragmentShader: Nn.meshphong_frag }, standard: { uniforms: fn([zn.common, zn.envmap, zn.aomap, zn.lightmap, zn.emissivemap, zn.bumpmap, zn.normalmap, zn.displacementmap, zn.roughnessmap, zn.metalnessmap, zn.fog, zn.lights, { emissive: { value: new Pe(0) }, roughness: { value: 1 }, metalness: { value: 0 }, envMapIntensity: { value: 1 } }]), vertexShader: Nn.meshphysical_vert, fragmentShader: Nn.meshphysical_frag }, toon: { uniforms: fn([zn.common, zn.aomap, zn.lightmap, zn.emissivemap, zn.bumpmap, zn.normalmap, zn.displacementmap, zn.gradientmap, zn.fog, zn.lights, { emissive: { value: new Pe(0) } }]), vertexShader: Nn.meshtoon_vert, fragmentShader: Nn.meshtoon_frag }, matcap: { uniforms: fn([zn.common, zn.bumpmap, zn.normalmap, zn.displacementmap, zn.fog, { matcap: { value: null } }]), vertexShader: Nn.meshmatcap_vert, fragmentShader: Nn.meshmatcap_frag }, points: { uniforms: fn([zn.points, zn.fog]), vertexShader: Nn.points_vert, fragmentShader: Nn.points_frag }, dashed: { uniforms: fn([zn.common, zn.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 } }]), vertexShader: Nn.linedashed_vert, fragmentShader: Nn.linedashed_frag }, depth: { uniforms: fn([zn.common, zn.displacementmap]), vertexShader: Nn.depth_vert, fragmentShader: Nn.depth_frag }, normal: { uniforms: fn([zn.common, zn.bumpmap, zn.normalmap, zn.displacementmap, { opacity: { value: 1 } }]), vertexShader: Nn.meshnormal_vert, fragmentShader: Nn.meshnormal_frag }, sprite: { uniforms: fn([zn.sprite, zn.fog]), vertexShader: Nn.sprite_vert, fragmentShader: Nn.sprite_frag }, background: { uniforms: { uvTransform: { value: new Z() }, t2D: { value: null } }, vertexShader: Nn.background_vert, fragmentShader: Nn.background_frag }, cube: { uniforms: fn([zn.envmap, { opacity: { value: 1 } }]), vertexShader: Nn.cube_vert, fragmentShader: Nn.cube_frag }, equirect: { uniforms: { tEquirect: { value: null } }, vertexShader: Nn.equirect_vert, fragmentShader: Nn.equirect_frag }, distanceRGBA: { uniforms: fn([zn.common, zn.displacementmap, { referencePosition: { value: new ht() }, nearDistance: { value: 1 }, farDistance: { value: 1e3 } }]), vertexShader: Nn.distanceRGBA_vert, fragmentShader: Nn.distanceRGBA_frag }, shadow: { uniforms: fn([zn.lights, zn.fog, { color: { value: new Pe(0) }, opacity: { value: 1 } }]), vertexShader: Nn.shadow_vert, fragmentShader: Nn.shadow_frag } };
function Fn(t, e, n, i, r) {
const s = new Pe(0);
let a,
l,
h = 0,
c = null,
u = 0,
d = null;
function p(t, e) {
n.buffers.color.setClear(t.r, t.g, t.b, e, r);
}
return {
getClearColor: function () {
return s;
},
setClearColor: function (t, e = 1) {
s.set(t), (h = e), p(s, h);
},
getClearAlpha: function () {
return h;
},
setClearAlpha: function (t) {
(h = t), p(s, h);
},
render: function (n, r) {
let m = !1,
f = !0 === r.isScene ? r.background : null;
f && f.isTexture && (f = e.get(f));
const g = t.xr,
v = g.getSession && g.getSession();
v && "additive" === v.environmentBlendMode && (f = null),
null === f ? p(s, h) : f && f.isColor && (p(f, 1), (m = !0)),
(t.autoClear || m) && t.clear(t.autoClearColor, t.autoClearDepth, t.autoClearStencil),
f && (f.isCubeTexture || f.mapping === o)
? (void 0 === l &&
((l = new un(new pn(1, 1, 1), new vn({ name: "BackgroundCubeMaterial", uniforms: mn(On.cube.uniforms), vertexShader: On.cube.vertexShader, fragmentShader: On.cube.fragmentShader, side: 1, depthTest: !1, depthWrite: !1, fog: !1 }))),
l.geometry.deleteAttribute("normal"),
l.geometry.deleteAttribute("uv"),
(l.onBeforeRender = function (t, e, n) {
this.matrixWorld.copyPosition(n.matrixWorld);
}),
Object.defineProperty(l.material, "envMap", {
get: function () {
return this.uniforms.envMap.value;
},
}),
i.update(l)),
(l.material.uniforms.envMap.value = f),
(l.material.uniforms.flipEnvMap.value = f.isCubeTexture && !1 === f.isRenderTargetTexture ? -1 : 1),
(c === f && u === f.version && d === t.toneMapping) || ((l.material.needsUpdate = !0), (c = f), (u = f.version), (d = t.toneMapping)),
n.unshift(l, l.geometry, l.material, 0, 0, null))
: f &&
f.isTexture &&
(void 0 === a &&
((a = new un(new In(2, 2), new vn({ name: "BackgroundMaterial", uniforms: mn(On.background.uniforms), vertexShader: On.background.vertexShader, fragmentShader: On.background.fragmentShader, side: 0, depthTest: !1, depthWrite: !1, fog: !1 }))),
a.geometry.deleteAttribute("normal"),
Object.defineProperty(a.material, "map", {
get: function () {
return this.uniforms.t2D.value;
},
}),
i.update(a)),
(a.material.uniforms.t2D.value = f),
!0 === f.matrixAutoUpdate && f.updateMatrix(),
a.material.uniforms.uvTransform.value.copy(f.matrix),
(c === f && u === f.version && d === t.toneMapping) || ((a.material.needsUpdate = !0), (c = f), (u = f.version), (d = t.toneMapping)),
n.unshift(a, a.geometry, a.material, 0, 0, null));
},
};
}
function Bn(t, e, n, i) {
const r = t.getParameter(34921),
s = i.isWebGL2 ? null : e.get("OES_vertex_array_object"),
a = i.isWebGL2 || null !== s,
o = {},
l = d(null);
let h = l;
function c(e) {
return i.isWebGL2 ? t.bindVertexArray(e) : s.bindVertexArrayOES(e);
}
function u(e) {
return i.isWebGL2 ? t.deleteVertexArray(e) : s.deleteVertexArrayOES(e);
}
function d(t) {
const e = [],
n = [],
i = [];
for (let t = 0; t < r; t++) (e[t] = 0), (n[t] = 0), (i[t] = 0);
return { geometry: null, program: null, wireframe: !1, newAttributes: e, enabledAttributes: n, attributeDivisors: i, object: t, attributes: {}, index: null };
}
function p() {
const t = h.newAttributes;
for (let e = 0, n = t.length; e < n; e++) t[e] = 0;
}
function m(t) {
f(t, 0);
}
function f(n, r) {
const s = h.newAttributes,
a = h.enabledAttributes,
o = h.attributeDivisors;
if (((s[n] = 1), 0 === a[n] && (t.enableVertexAttribArray(n), (a[n] = 1)), o[n] !== r)) {
(i.isWebGL2 ? t : e.get("ANGLE_instanced_arrays"))[i.isWebGL2 ? "vertexAttribDivisor" : "vertexAttribDivisorANGLE"](n, r), (o[n] = r);
}
}
function g() {
const e = h.newAttributes,
n = h.enabledAttributes;
for (let i = 0, r = n.length; i < r; i++) n[i] !== e[i] && (t.disableVertexAttribArray(i), (n[i] = 0));
}
function v(e, n, r, s, a, o) {
!0 !== i.isWebGL2 || (5124 !== r && 5125 !== r) ? t.vertexAttribPointer(e, n, r, s, a, o) : t.vertexAttribIPointer(e, n, r, a, o);
}
function x() {
y(), h !== l && ((h = l), c(h.object));
}
function y() {
(l.geometry = null), (l.program = null), (l.wireframe = !1);
}
return {
setup: function (r, l, u, x, y) {
let _ = !1;
if (a) {
const e = (function (e, n, r) {
const a = !0 === r.wireframe;
let l = o[e.id];
void 0 === l && ((l = {}), (o[e.id] = l));
let h = l[n.id];
void 0 === h && ((h = {}), (l[n.id] = h));
let c = h[a];
void 0 === c && ((c = d(i.isWebGL2 ? t.createVertexArray() : s.createVertexArrayOES())), (h[a] = c));
return c;
})(x, u, l);
h !== e && ((h = e), c(h.object)),
(_ = (function (t, e) {
const n = h.attributes,
i = t.attributes;
let r = 0;
for (const t in i) {
const e = n[t],
s = i[t];
if (void 0 === e) return !0;
if (e.attribute !== s) return !0;
if (e.data !== s.data) return !0;
r++;
}
return h.attributesNum !== r || h.index !== e;
})(x, y)),
_ &&
(function (t, e) {
const n = {},
i = t.attributes;
let r = 0;
for (const t in i) {
const e = i[t],
s = {};
(s.attribute = e), e.data && (s.data = e.data), (n[t] = s), r++;
}
(h.attributes = n), (h.attributesNum = r), (h.index = e);
})(x, y);
} else {
const t = !0 === l.wireframe;
(h.geometry === x.id && h.program === u.id && h.wireframe === t) || ((h.geometry = x.id), (h.program = u.id), (h.wireframe = t), (_ = !0));
}
!0 === r.isInstancedMesh && (_ = !0),
null !== y && n.update(y, 34963),
_ &&
(!(function (r, s, a, o) {
if (!1 === i.isWebGL2 && (r.isInstancedMesh || o.isInstancedBufferGeometry) && null === e.get("ANGLE_instanced_arrays")) return;
p();
const l = o.attributes,
h = a.getAttributes(),
c = s.defaultAttributeValues;
for (const e in h) {
const i = h[e];
if (i.location >= 0) {
let s = l[e];
if ((void 0 === s && ("instanceMatrix" === e && r.instanceMatrix && (s = r.instanceMatrix), "instanceColor" === e && r.instanceColor && (s = r.instanceColor)), void 0 !== s)) {
const e = s.normalized,
a = s.itemSize,
l = n.get(s);
if (void 0 === l) continue;
const h = l.buffer,
c = l.type,
u = l.bytesPerElement;
if (s.isInterleavedBufferAttribute) {
const n = s.data,
l = n.stride,
d = s.offset;
if (n && n.isInstancedInterleavedBuffer) {
for (let t = 0; t < i.locationSize; t++) f(i.location + t, n.meshPerAttribute);
!0 !== r.isInstancedMesh && void 0 === o._maxInstanceCount && (o._maxInstanceCount = n.meshPerAttribute * n.count);
} else for (let t = 0; t < i.locationSize; t++) m(i.location + t);
t.bindBuffer(34962, h);
for (let t = 0; t < i.locationSize; t++) v(i.location + t, a / i.locationSize, c, e, l * u, (d + (a / i.locationSize) * t) * u);
} else {
if (s.isInstancedBufferAttribute) {
for (let t = 0; t < i.locationSize; t++) f(i.location + t, s.meshPerAttribute);
!0 !== r.isInstancedMesh && void 0 === o._maxInstanceCount && (o._maxInstanceCount = s.meshPerAttribute * s.count);
} else for (let t = 0; t < i.locationSize; t++) m(i.location + t);
t.bindBuffer(34962, h);
for (let t = 0; t < i.locationSize; t++) v(i.location + t, a / i.locationSize, c, e, a * u, (a / i.locationSize) * t * u);
}
} else if (void 0 !== c) {
const n = c[e];
if (void 0 !== n)
switch (n.length) {
case 2:
t.vertexAttrib2fv(i.location, n);
break;
case 3:
t.vertexAttrib3fv(i.location, n);
break;
case 4:
t.vertexAttrib4fv(i.location, n);
break;
default:
t.vertexAttrib1fv(i.location, n);
}
}
}
}
g();
})(r, l, u, x),
null !== y && t.bindBuffer(34963, n.get(y).buffer));
},
reset: x,
resetDefaultState: y,
dispose: function () {
x();
for (const t in o) {
const e = o[t];
for (const t in e) {
const n = e[t];
for (const t in n) u(n[t].object), delete n[t];
delete e[t];
}
delete o[t];
}
},
releaseStatesOfGeometry: function (t) {
if (void 0 === o[t.id]) return;
const e = o[t.id];
for (const t in e) {
const n = e[t];
for (const t in n) u(n[t].object), delete n[t];
delete e[t];
}
delete o[t.id];
},
releaseStatesOfProgram: function (t) {
for (const e in o) {
const n = o[e];
if (void 0 === n[t.id]) continue;
const i = n[t.id];
for (const t in i) u(i[t].object), delete i[t];
delete n[t.id];
}
},
initAttributes: p,
enableAttribute: m,
disableUnusedAttributes: g,
};
}
function Un(t, e, n, i) {
const r = i.isWebGL2;
let s;
(this.setMode = function (t) {
s = t;
}),
(this.render = function (e, i) {
t.drawArrays(s, e, i), n.update(i, s, 1);
}),
(this.renderInstances = function (i, a, o) {
if (0 === o) return;
let l, h;
if (r) (l = t), (h = "drawArraysInstanced");
else if (((l = e.get("ANGLE_instanced_arrays")), (h = "drawArraysInstancedANGLE"), null === l)) return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
l[h](s, i, a, o), n.update(a, s, o);
});
}
function Hn(t, e, n) {
let i;
function r(e) {
if ("highp" === e) {
if (t.getShaderPrecisionFormat(35633, 36338).precision > 0 && t.getShaderPrecisionFormat(35632, 36338).precision > 0) return "highp";
e = "mediump";
}
return "mediump" === e && t.getShaderPrecisionFormat(35633, 36337).precision > 0 && t.getShaderPrecisionFormat(35632, 36337).precision > 0 ? "mediump" : "lowp";
}
const s = ("undefined" != typeof WebGL2RenderingContext && t instanceof WebGL2RenderingContext) || ("undefined" != typeof WebGL2ComputeRenderingContext && t instanceof WebGL2ComputeRenderingContext);
let a = void 0 !== n.precision ? n.precision : "highp";
const o = r(a);
o !== a && (console.warn("THREE.WebGLRenderer:", a, "not supported, using", o, "instead."), (a = o));
const l = s || e.has("WEBGL_draw_buffers"),
h = !0 === n.logarithmicDepthBuffer,
c = t.getParameter(34930),
u = t.getParameter(35660),
d = t.getParameter(3379),
p = t.getParameter(34076),
m = t.getParameter(34921),
f = t.getParameter(36347),
g = t.getParameter(36348),
v = t.getParameter(36349),
x = u > 0,
y = s || e.has("OES_texture_float");
return {
isWebGL2: s,
drawBuffers: l,
getMaxAnisotropy: function () {
if (void 0 !== i) return i;
if (!0 === e.has("EXT_texture_filter_anisotropic")) {
const n = e.get("EXT_texture_filter_anisotropic");
i = t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
} else i = 0;
return i;
},
getMaxPrecision: r,
precision: a,
logarithmicDepthBuffer: h,
maxTextures: c,
maxVertexTextures: u,
maxTextureSize: d,
maxCubemapSize: p,
maxAttributes: m,
maxVertexUniforms: f,
maxVaryings: g,
maxFragmentUniforms: v,
vertexTextures: x,
floatFragmentTextures: y,
floatVertexTextures: x && y,
maxSamples: s ? t.getParameter(36183) : 0,
};
}
function Vn(t) {
const e = this;
let n = null,
i = 0,
r = !1,
s = !1;
const a = new An(),
o = new Z(),
l = { value: null, needsUpdate: !1 };
function h() {
l.value !== n && ((l.value = n), (l.needsUpdate = i > 0)), (e.numPlanes = i), (e.numIntersection = 0);
}
function c(t, n, i, r) {
const s = null !== t ? t.length : 0;
let h = null;
if (0 !== s) {
if (((h = l.value), !0 !== r || null === h)) {
const e = i + 4 * s,
r = n.matrixWorldInverse;
o.getNormalMatrix(r), (null === h || h.length < e) && (h = new Float32Array(e));
for (let e = 0, n = i; e !== s; ++e, n += 4) a.copy(t[e]).applyMatrix4(r, o), a.normal.toArray(h, n), (h[n + 3] = a.constant);
}
(l.value = h), (l.needsUpdate = !0);
}
return (e.numPlanes = s), (e.numIntersection = 0), h;
}
(this.uniform = l),
(this.numPlanes = 0),
(this.numIntersection = 0),
(this.init = function (t, e, s) {
const a = 0 !== t.length || e || 0 !== i || r;
return (r = e), (n = c(t, s, 0)), (i = t.length), a;
}),
(this.beginShadows = function () {
(s = !0), c(null);
}),
(this.endShadows = function () {
(s = !1), h();
}),
(this.setState = function (e, a, o) {
const u = e.clippingPlanes,
d = e.clipIntersection,
p = e.clipShadows,
m = t.get(e);
if (!r || null === u || 0 === u.length || (s && !p)) s ? c(null) : h();
else {
const t = s ? 0 : i,
e = 4 * t;
let r = m.clippingState || null;
(l.value = r), (r = c(u, a, e, o));
for (let t = 0; t !== e; ++t) r[t] = n[t];
(m.clippingState = r), (this.numIntersection = d ? this.numPlanes : 0), (this.numPlanes += t);
}
});
}
function kn(t) {
let e = new WeakMap();
function n(t, e) {
return e === s ? (t.mapping = i) : e === a && (t.mapping = r), t;
}
function o(t) {
const n = t.target;
n.removeEventListener("dispose", o);
const i = e.get(n);
void 0 !== i && (e.delete(n), i.dispose());
}
return {
get: function (i) {
if (i && i.isTexture && !1 === i.isRenderTargetTexture) {
const r = i.mapping;
if (r === s || r === a) {
if (e.has(i)) {
return n(e.get(i).texture, i.mapping);
}
{
const r = i.image;
if (r && r.height > 0) {
const s = t.getRenderTarget(),
a = new Mn(r.height / 2);
return a.fromEquirectangularTexture(t, i), e.set(i, a), t.setRenderTarget(s), i.addEventListener("dispose", o), n(a.texture, i.mapping);
}
return null;
}
}
}
return i;
},
dispose: function () {
e = new WeakMap();
},
};
}
On.physical = { uniforms: fn([On.standard.uniforms, { clearcoat: { value: 0 }, clearcoatMap: { value: null }, clearcoatRoughness: { value: 0 }, clearcoatRoughnessMap: { value: null }, clearcoatNormalScale: { value: new $(1, 1) }, clearcoatNormalMap: { value: null }, sheen: { value: 0 }, sheenColor: { value: new Pe(0) }, sheenColorMap: { value: null }, sheenRoughness: { value: 0 }, sheenRoughnessMap: { value: null }, transmission: { value: 0 }, transmissionMap: { value: null }, transmissionSamplerSize: { value: new $() }, transmissionSamplerMap: { value: null }, thickness: { value: 0 }, thicknessMap: { value: null }, attenuationDistance: { value: 0 }, attenuationColor: { value: new Pe(0) }, specularIntensity: { value: 0 }, specularIntensityMap: { value: null }, specularColor: { value: new Pe(1, 1, 1) }, specularColorMap: { value: null } }]), vertexShader: Nn.meshphysical_vert, fragmentShader: Nn.meshphysical_frag };
class Gn extends xn {
constructor(t = -1, e = 1, n = 1, i = -1, r = 0.1, s = 2e3) {
super(), (this.type = "OrthographicCamera"), (this.zoom = 1), (this.view = null), (this.left = t), (this.right = e), (this.top = n), (this.bottom = i), (this.near = r), (this.far = s), this.updateProjectionMatrix();
}
copy(t, e) {
return super.copy(t, e), (this.left = t.left), (this.right = t.right), (this.top = t.top), (this.bottom = t.bottom), (this.near = t.near), (this.far = t.far), (this.zoom = t.zoom), (this.view = null === t.view ? null : Object.assign({}, t.view)), this;
}
setViewOffset(t, e, n, i, r, s) {
null === this.view && (this.view = { enabled: !0, fullWidth: 1, fullHeight: 1, offsetX: 0, offsetY: 0, width: 1, height: 1 }), (this.view.enabled = !0), (this.view.fullWidth = t), (this.view.fullHeight = e), (this.view.offsetX = n), (this.view.offsetY = i), (this.view.width = r), (this.view.height = s), this.updateProjectionMatrix();
}
clearViewOffset() {
null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix();
}
updateProjectionMatrix() {
const t = (this.right - this.left) / (2 * this.zoom),
e = (this.top - this.bottom) / (2 * this.zoom),
n = (this.right + this.left) / 2,
i = (this.top + this.bottom) / 2;
let r = n - t,
s = n + t,
a = i + e,
o = i - e;
if (null !== this.view && this.view.enabled) {
const t = (this.right - this.left) / this.view.fullWidth / this.zoom,
e = (this.top - this.bottom) / this.view.fullHeight / this.zoom;
(r += t * this.view.offsetX), (s = r + t * this.view.width), (a -= e * this.view.offsetY), (o = a - e * this.view.height);
}
this.projectionMatrix.makeOrthographic(r, s, a, o, this.near, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert();
}
toJSON(t) {
const e = super.toJSON(t);
return (e.object.zoom = this.zoom), (e.object.left = this.left), (e.object.right = this.right), (e.object.top = this.top), (e.object.bottom = this.bottom), (e.object.near = this.near), (e.object.far = this.far), null !== this.view && (e.object.view = Object.assign({}, this.view)), e;
}
}
Gn.prototype.isOrthographicCamera = !0;
class Wn extends vn {
constructor(t) {
super(t), (this.type = "RawShaderMaterial");
}
}
Wn.prototype.isRawShaderMaterial = !0;
const jn = Math.pow(2, 8),
qn = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582],
Xn = 5 + qn.length,
Yn = 20,
Jn = { [N]: 0, [z]: 1 },
$n = new Gn(),
{ _lodPlanes: Zn, _sizeLods: Qn, _sigmas: Kn } = ai(),
ti = new Pe();
let ei = null;
const ni = (1 + Math.sqrt(5)) / 2,
ii = 1 / ni,
ri = [new ht(1, 1, 1), new ht(-1, 1, 1), new ht(1, 1, -1), new ht(-1, 1, -1), new ht(0, ni, ii), new ht(0, ni, -ii), new ht(ii, 0, ni), new ht(-ii, 0, ni), new ht(ni, ii, 0), new ht(-ni, ii, 0)];
class si {
constructor(t) {
(this._renderer = t),
(this._pingPongRenderTarget = null),
(this._blurMaterial = (function (t) {
const e = new Float32Array(t),
n = new ht(0, 1, 0);
return new Wn({ name: "SphericalGaussianBlur", defines: { n: t }, uniforms: { envMap: { value: null }, samples: { value: 1 }, weights: { value: e }, latitudinal: { value: !1 }, dTheta: { value: 0 }, mipInt: { value: 0 }, poleAxis: { value: n } }, vertexShader: ui(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${di()}\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1 });
})(Yn)),
(this._equirectShader = null),
(this._cubemapShader = null),
this._compileMaterial(this._blurMaterial);
}
fromScene(t, e = 0, n = 0.1, i = 100) {
ei = this._renderer.getRenderTarget();
const r = this._allocateTargets();
return this._sceneToCubeUV(t, n, i, r), e > 0 && this._blur(r, 0, 0, e), this._applyPMREM(r), this._cleanup(r), r;
}
fromEquirectangular(t) {
return this._fromTexture(t);
}
fromCubemap(t) {
return this._fromTexture(t);
}
compileCubemapShader() {
null === this._cubemapShader && ((this._cubemapShader = ci()), this._compileMaterial(this._cubemapShader));
}
compileEquirectangularShader() {
null === this._equirectShader && ((this._equirectShader = hi()), this._compileMaterial(this._equirectShader));
}
dispose() {
this._blurMaterial.dispose(), null !== this._cubemapShader && this._cubemapShader.dispose(), null !== this._equirectShader && this._equirectShader.dispose();
for (let t = 0; t < Zn.length; t++) Zn[t].dispose();
}
_cleanup(t) {
this._pingPongRenderTarget.dispose(), this._renderer.setRenderTarget(ei), (t.scissorTest = !1), li(t, 0, 0, t.width, t.height);
}
_fromTexture(t) {
ei = this._renderer.getRenderTarget();
const e = this._allocateTargets(t);
return this._textureToCubeUV(t, e), this._applyPMREM(e), this._cleanup(e), e;
}
_allocateTargets(t) {
const e = { magFilter: f, minFilter: f, generateMipmaps: !1, type: b, format: S, encoding: N, depthBuffer: !1 },
n = oi(e);
return (n.depthBuffer = !t), (this._pingPongRenderTarget = oi(e)), n;
}
_compileMaterial(t) {
const e = new un(Zn[0], t);
this._renderer.compile(e, $n);
}
_sceneToCubeUV(t, e, n, i) {
const r = new yn(90, 1, e, n),
s = [1, -1, 1, 1, 1, 1],
a = [1, 1, 1, -1, -1, -1],
o = this._renderer,
l = o.autoClear,
h = o.toneMapping;
o.getClearColor(ti), (o.toneMapping = 0), (o.autoClear = !1);
const c = new De({ name: "PMREM.Background", side: 1, depthWrite: !1, depthTest: !1 }),
u = new un(new pn(), c);
let d = !1;
const p = t.background;
p ? p.isColor && (c.color.copy(p), (t.background = null), (d = !0)) : (c.color.copy(ti), (d = !0));
for (let e = 0; e < 6; e++) {
const n = e % 3;
0 == n ? (r.up.set(0, s[e], 0), r.lookAt(a[e], 0, 0)) : 1 == n ? (r.up.set(0, 0, s[e]), r.lookAt(0, a[e], 0)) : (r.up.set(0, s[e], 0), r.lookAt(0, 0, a[e])), li(i, n * jn, e > 2 ? jn : 0, jn, jn), o.setRenderTarget(i), d && o.render(u, r), o.render(t, r);
}
u.geometry.dispose(), u.material.dispose(), (o.toneMapping = h), (o.autoClear = l), (t.background = p);
}
_setEncoding(t, e) {
!0 === this._renderer.capabilities.isWebGL2 && e.format === S && e.type === v && e.encoding === z ? (t.value = Jn[3e3]) : (t.value = Jn[e.encoding]);
}
_textureToCubeUV(t, e) {
const n = this._renderer,
s = t.mapping === i || t.mapping === r;
s ? null == this._cubemapShader && (this._cubemapShader = ci()) : null == this._equirectShader && (this._equirectShader = hi());
const a = s ? this._cubemapShader : this._equirectShader,
o = new un(Zn[0], a),
l = a.uniforms;
(l.envMap.value = t), s || l.texelSize.value.set(1 / t.image.width, 1 / t.image.height), this._setEncoding(l.inputEncoding, t), li(e, 0, 0, 3 * jn, 2 * jn), n.setRenderTarget(e), n.render(o, $n);
}
_applyPMREM(t) {
const e = this._renderer,
n = e.autoClear;
e.autoClear = !1;
for (let e = 1; e < Xn; e++) {
const n = Math.sqrt(Kn[e] * Kn[e] - Kn[e - 1] * Kn[e - 1]),
i = ri[(e - 1) % ri.length];
this._blur(t, e - 1, e, n, i);
}
e.autoClear = n;
}
_blur(t, e, n, i, r) {
const s = this._pingPongRenderTarget;
this._halfBlur(t, s, e, n, i, "latitudinal", r), this._halfBlur(s, t, n, n, i, "longitudinal", r);
}
_halfBlur(t, e, n, i, r, s, a) {
const o = this._renderer,
l = this._blurMaterial;
"latitudinal" !== s && "longitudinal" !== s && console.error("blur direction must be either latitudinal or longitudinal!");
const h = new un(Zn[i], l),
c = l.uniforms,
u = Qn[n] - 1,
d = isFinite(r) ? Math.PI / (2 * u) : (2 * Math.PI) / 39,
p = r / d,
m = isFinite(r) ? 1 + Math.floor(3 * p) : Yn;
m > Yn && console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);
const f = [];
let g = 0;
for (let t = 0; t < Yn; ++t) {
const e = t / p,
n = Math.exp((-e * e) / 2);
f.push(n), 0 == t ? (g += n) : t < m && (g += 2 * n);
}
for (let t = 0; t < f.length; t++) f[t] = f[t] / g;
(c.envMap.value = t.texture), (c.samples.value = m), (c.weights.value = f), (c.latitudinal.value = "latitudinal" === s), a && (c.poleAxis.value = a), (c.dTheta.value = d), (c.mipInt.value = 8 - n);
const v = Qn[i];
li(e, 3 * Math.max(0, jn - 2 * v), (0 === i ? 0 : 2 * jn) + 2 * v * (i > 4 ? i - 8 + 4 : 0), 3 * v, 2 * v), o.setRenderTarget(e), o.render(h, $n);
}
}
function ai() {
const t = [],
e = [],
n = [];
let i = 8;
for (let r = 0; r < Xn; r++) {
const s = Math.pow(2, i);
e.push(s);
let a = 1 / s;
r > 4 ? (a = qn[r - 8 + 4 - 1]) : 0 == r && (a = 0), n.push(a);
const o = 1 / (s - 1),
l = -o / 2,
h = 1 + o / 2,
c = [l, l, h, l, h, h, l, l, h, h, l, h],
u = 6,
d = 6,
p = 3,
m = 2,
f = 1,
g = new Float32Array(p * d * u),
v = new Float32Array(m * d * u),
x = new Float32Array(f * d * u);
for (let t = 0; t < u; t++) {
const e = ((t % 3) * 2) / 3 - 1,
n = t > 2 ? 0 : -1,
i = [e, n, 0, e + 2 / 3, n, 0, e + 2 / 3, n + 1, 0, e, n, 0, e + 2 / 3, n + 1, 0, e, n + 1, 0];
g.set(i, p * d * t), v.set(c, m * d * t);
const r = [t, t, t, t, t, t];
x.set(r, f * d * t);
}
const y = new qe();
y.setAttribute("position", new ze(g, p)), y.setAttribute("uv", new ze(v, m)), y.setAttribute("faceIndex", new ze(x, f)), t.push(y), i > 4 && i--;
}
return { _lodPlanes: t, _sizeLods: e, _sigmas: n };
}
function oi(t) {
const e = new at(3 * jn, 3 * jn, t);
return (e.texture.mapping = o), (e.texture.name = "PMREM.cubeUv"), (e.scissorTest = !0), e;
}
function li(t, e, n, i, r) {
t.viewport.set(e, n, i, r), t.scissor.set(e, n, i, r);
}
function hi() {
const t = new $(1, 1);
return new Wn({ name: "EquirectangularToCubeUV", uniforms: { envMap: { value: null }, texelSize: { value: t }, inputEncoding: { value: Jn[3e3] } }, vertexShader: ui(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${di()}\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1 });
}
function ci() {
return new Wn({ name: "CubemapToCubeUV", uniforms: { envMap: { value: null }, inputEncoding: { value: Jn[3e3] } }, vertexShader: ui(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${di()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) );\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1 });
}
function ui() {
return "\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t";
}
function di() {
return "\n\n\t\tuniform int inputEncoding;\n\n\t\t#include <encodings_pars_fragment>\n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t";
}
function pi(t) {
let e = new WeakMap(),
n = null;
function o(t) {
const n = t.target;
n.removeEventListener("dispose", o);
const i = e.get(n);
void 0 !== i && (e.delete(n), i.dispose());
}
return {
get: function (l) {
if (l && l.isTexture && !1 === l.isRenderTargetTexture) {
const h = l.mapping,
c = h === s || h === a,
u = h === i || h === r;
if (c || u) {
if (e.has(l)) return e.get(l).texture;
{
const i = l.image;
if (
(c && i && i.height > 0) ||
(u &&
i &&
(function (t) {
let e = 0;
const n = 6;
for (let i = 0; i < n; i++) void 0 !== t[i] && e++;
return e === n;
})(i))
) {
const i = t.getRenderTarget();
null === n && (n = new si(t));
const r = c ? n.fromEquirectangular(l) : n.fromCubemap(l);
return e.set(l, r), t.setRenderTarget(i), l.addEventListener("dispose", o), r.texture;
}
return null;
}
}
}
return l;
},
dispose: function () {
(e = new WeakMap()), null !== n && (n.dispose(), (n = null));
},
};
}
function mi(t) {
const e = {};
function n(n) {
if (void 0 !== e[n]) return e[n];
let i;
switch (n) {
case "WEBGL_depth_texture":
i = t.getExtension("WEBGL_depth_texture") || t.getExtension("MOZ_WEBGL_depth_texture") || t.getExtension("WEBKIT_WEBGL_depth_texture");
break;
case "EXT_texture_filter_anisotropic":
i = t.getExtension("EXT_texture_filter_anisotropic") || t.getExtension("MOZ_EXT_texture_filter_anisotropic") || t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
break;
case "WEBGL_compressed_texture_s3tc":
i = t.getExtension("WEBGL_compressed_texture_s3tc") || t.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
break;
case "WEBGL_compressed_texture_pvrtc":
i = t.getExtension("WEBGL_compressed_texture_pvrtc") || t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
break;
default:
i = t.getExtension(n);
}
return (e[n] = i), i;
}
return {
has: function (t) {
return null !== n(t);
},
init: function (t) {
t.isWebGL2 ? n("EXT_color_buffer_float") : (n("WEBGL_depth_texture"), n("OES_texture_float"), n("OES_texture_half_float"), n("OES_texture_half_float_linear"), n("OES_standard_derivatives"), n("OES_element_index_uint"), n("OES_vertex_array_object"), n("ANGLE_instanced_arrays")), n("OES_texture_float_linear"), n("EXT_color_buffer_half_float"), n("WEBGL_multisampled_render_to_texture");
},
get: function (t) {
const e = n(t);
return null === e && console.warn("THREE.WebGLRenderer: " + t + " extension not supported."), e;
},
};
}
function fi(t, e, n, i) {
const r = {},
s = new WeakMap();
function a(t) {
const o = t.target;
null !== o.index && e.remove(o.index);
for (const t in o.attributes) e.remove(o.attributes[t]);
o.removeEventListener("dispose", a), delete r[o.id];
const l = s.get(o);
l && (e.remove(l), s.delete(o)), i.releaseStatesOfGeometry(o), !0 === o.isInstancedBufferGeometry && delete o._maxInstanceCount, n.memory.geometries--;
}
function o(t) {
const n = [],
i = t.index,
r = t.attributes.position;
let a = 0;
if (null !== i) {
const t = i.array;
a = i.version;
for (let e = 0, i = t.length; e < i; e += 3) {
const i = t[e + 0],
r = t[e + 1],
s = t[e + 2];
n.push(i, r, r, s, s, i);
}
} else {
const t = r.array;
a = r.version;
for (let e = 0, i = t.length / 3 - 1; e < i; e += 3) {
const t = e + 0,
i = e + 1,
r = e + 2;
n.push(t, i, i, r, r, t);
}
}
const o = new (Q(n) > 65535 ? Fe : Oe)(n, 1);
o.version = a;
const l = s.get(t);
l && e.remove(l), s.set(t, o);
}
return {
get: function (t, e) {
return !0 === r[e.id] || (e.addEventListener("dispose", a), (r[e.id] = !0), n.memory.geometries++), e;
},
update: function (t) {
const n = t.attributes;
for (const t in n) e.update(n[t], 34962);
const i = t.morphAttributes;
for (const t in i) {
const n = i[t];
for (let t = 0, i = n.length; t < i; t++) e.update(n[t], 34962);
}
},
getWireframeAttribute: function (t) {
const e = s.get(t);
if (e) {
const n = t.index;
null !== n && e.version < n.version && o(t);
} else o(t);
return s.get(t);
},
};
}
function gi(t, e, n, i) {
const r = i.isWebGL2;
let s, a, o;
(this.setMode = function (t) {
s = t;
}),
(this.setIndex = function (t) {
(a = t.type), (o = t.bytesPerElement);
}),
(this.render = function (e, i) {
t.drawElements(s, i, a, e * o), n.update(i, s, 1);
}),
(this.renderInstances = function (i, l, h) {
if (0 === h) return;
let c, u;
if (r) (c = t), (u = "drawElementsInstanced");
else if (((c = e.get("ANGLE_instanced_arrays")), (u = "drawElementsInstancedANGLE"), null === c)) return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
c[u](s, l, a, i * o, h), n.update(l, s, h);
});
}
function vi(t) {
const e = { frame: 0, calls: 0, triangles: 0, points: 0, lines: 0 };
return {
memory: { geometries: 0, textures: 0 },
render: e,
programs: null,
autoReset: !0,
reset: function () {
e.frame++, (e.calls = 0), (e.triangles = 0), (e.points = 0), (e.lines = 0);
},
update: function (t, n, i) {
switch ((e.calls++, n)) {
case 4:
e.triangles += i * (t / 3);
break;
case 1:
e.lines += i * (t / 2);
break;
case 3:
e.lines += i * (t - 1);
break;
case 2:
e.lines += i * t;
break;
case 0:
e.points += i * t;
break;
default:
console.error("THREE.WebGLInfo: Unknown draw mode:", n);
}
},
};
}
class xi extends it {
constructor(t = null, e = 1, n = 1, i = 1) {
super(null), (this.image = { data: t, width: e, height: n, depth: i }), (this.magFilter = d), (this.minFilter = d), (this.wrapR = c), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1);
}
}
function yi(t, e) {
return t[0] - e[0];
}
function _i(t, e) {
return Math.abs(e[1]) - Math.abs(t[1]);
}
function bi(t, e) {
let n = 1;
const i = e.isInterleavedBufferAttribute ? e.data.array : e.array;
i instanceof Int8Array ? (n = 127) : i instanceof Int16Array ? (n = 32767) : i instanceof Int32Array ? (n = 2147483647) : console.error("THREE.WebGLMorphtargets: Unsupported morph attribute data type: ", i), t.divideScalar(n);
}
function wi(t, e, n) {
const i = {},
r = new Float32Array(8),
s = new WeakMap(),
a = new ht(),
o = [];
for (let t = 0; t < 8; t++) o[t] = [t, 0];
return {
update: function (l, h, c, u) {
const d = l.morphTargetInfluences;
if (!0 === e.isWebGL2) {
const i = h.morphAttributes.position.length;
let r = s.get(h);
if (void 0 === r || r.count !== i) {
void 0 !== r && r.texture.dispose();
const t = void 0 !== h.morphAttributes.normal,
n = h.morphAttributes.position,
o = h.morphAttributes.normal || [],
l = !0 === t ? 2 : 1;
let c = h.attributes.position.count * l,
u = 1;
c > e.maxTextureSize && ((u = Math.ceil(c / e.maxTextureSize)), (c = e.maxTextureSize));
const d = new Float32Array(c * u * 4 * i),
p = new xi(d, c, u, i);
(p.format = S), (p.type = _), (p.needsUpdate = !0);
const m = 4 * l;
for (let e = 0; e < i; e++) {
const i = n[e],
r = o[e],
s = c * u * 4 * e;
for (let e = 0; e < i.count; e++) {
a.fromBufferAttribute(i, e), !0 === i.normalized && bi(a, i);
const n = e * m;
(d[s + n + 0] = a.x), (d[s + n + 1] = a.y), (d[s + n + 2] = a.z), (d[s + n + 3] = 0), !0 === t && (a.fromBufferAttribute(r, e), !0 === r.normalized && bi(a, r), (d[s + n + 4] = a.x), (d[s + n + 5] = a.y), (d[s + n + 6] = a.z), (d[s + n + 7] = 0));
}
}
(r = { count: i, texture: p, size: new $(c, u) }), s.set(h, r);
}
let o = 0;
for (let t = 0; t < d.length; t++) o += d[t];
const l = h.morphTargetsRelative ? 1 : 1 - o;
u.getUniforms().setValue(t, "morphTargetBaseInfluence", l), u.getUniforms().setValue(t, "morphTargetInfluences", d), u.getUniforms().setValue(t, "morphTargetsTexture", r.texture, n), u.getUniforms().setValue(t, "morphTargetsTextureSize", r.size);
} else {
const e = void 0 === d ? 0 : d.length;
let n = i[h.id];
if (void 0 === n || n.length !== e) {
n = [];
for (let t = 0; t < e; t++) n[t] = [t, 0];
i[h.id] = n;
}
for (let t = 0; t < e; t++) {
const e = n[t];
(e[0] = t), (e[1] = d[t]);
}
n.sort(_i);
for (let t = 0; t < 8; t++) t < e && n[t][1] ? ((o[t][0] = n[t][0]), (o[t][1] = n[t][1])) : ((o[t][0] = Number.MAX_SAFE_INTEGER), (o[t][1] = 0));
o.sort(yi);
const s = h.morphAttributes.position,
a = h.morphAttributes.normal;
let l = 0;
for (let t = 0; t < 8; t++) {
const e = o[t],
n = e[0],
i = e[1];
n !== Number.MAX_SAFE_INTEGER && i ? (s && h.getAttribute("morphTarget" + t) !== s[n] && h.setAttribute("morphTarget" + t, s[n]), a && h.getAttribute("morphNormal" + t) !== a[n] && h.setAttribute("morphNormal" + t, a[n]), (r[t] = i), (l += i)) : (s && !0 === h.hasAttribute("morphTarget" + t) && h.deleteAttribute("morphTarget" + t), a && !0 === h.hasAttribute("morphNormal" + t) && h.deleteAttribute("morphNormal" + t), (r[t] = 0));
}
const c = h.morphTargetsRelative ? 1 : 1 - l;
u.getUniforms().setValue(t, "morphTargetBaseInfluence", c), u.getUniforms().setValue(t, "morphTargetInfluences", r);
}
},
};
}
function Mi(t, e, n, i) {
let r = new WeakMap();
function s(t) {
const e = t.target;
e.removeEventListener("dispose", s), n.remove(e.instanceMatrix), null !== e.instanceColor && n.remove(e.instanceColor);
}
return {
update: function (t) {
const a = i.render.frame,
o = t.geometry,
l = e.get(t, o);
return r.get(l) !== a && (e.update(l), r.set(l, a)), t.isInstancedMesh && (!1 === t.hasEventListener("dispose", s) && t.addEventListener("dispose", s), n.update(t.instanceMatrix, 34962), null !== t.instanceColor && n.update(t.instanceColor, 34962)), l;
},
dispose: function () {
r = new WeakMap();
},
};
}
xi.prototype.isDataTexture2DArray = !0;
class Si extends it {
constructor(t = null, e = 1, n = 1, i = 1) {
super(null), (this.image = { data: t, width: e, height: n, depth: i }), (this.magFilter = d), (this.minFilter = d), (this.wrapR = c), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1);
}
}
Si.prototype.isDataTexture3D = !0;
const Ei = new it(),
Ti = new xi(),
Ai = new Si(),
Li = new wn(),
Ci = [],
Ri = [],
Pi = new Float32Array(16),
Di = new Float32Array(9),
Ii = new Float32Array(4);
function Ni(t, e, n) {
const i = t[0];
if (i <= 0 || i > 0) return t;
const r = e * n;
let s = Ci[r];
if ((void 0 === s && ((s = new Float32Array(r)), (Ci[r] = s)), 0 !== e)) {
i.toArray(s, 0);
for (let i = 1, r = 0; i !== e; ++i) (r += n), t[i].toArray(s, r);
}
return s;
}
function zi(t, e) {
if (t.length !== e.length) return !1;
for (let n = 0, i = t.length; n < i; n++) if (t[n] !== e[n]) return !1;
return !0;
}
function Oi(t, e) {
for (let n = 0, i = e.length; n < i; n++) t[n] = e[n];
}
function Fi(t, e) {
let n = Ri[e];
void 0 === n && ((n = new Int32Array(e)), (Ri[e] = n));
for (let i = 0; i !== e; ++i) n[i] = t.allocateTextureUnit();
return n;
}
function Bi(t, e) {
const n = this.cache;
n[0] !== e && (t.uniform1f(this.addr, e), (n[0] = e));
}
function Ui(t, e) {
const n = this.cache;
if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y) || (t.uniform2f(this.addr, e.x, e.y), (n[0] = e.x), (n[1] = e.y));
else {
if (zi(n, e)) return;
t.uniform2fv(this.addr, e), Oi(n, e);
}
}
function Hi(t, e) {
const n = this.cache;
if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y && n[2] === e.z) || (t.uniform3f(this.addr, e.x, e.y, e.z), (n[0] = e.x), (n[1] = e.y), (n[2] = e.z));
else if (void 0 !== e.r) (n[0] === e.r && n[1] === e.g && n[2] === e.b) || (t.uniform3f(this.addr, e.r, e.g, e.b), (n[0] = e.r), (n[1] = e.g), (n[2] = e.b));
else {
if (zi(n, e)) return;
t.uniform3fv(this.addr, e), Oi(n, e);
}
}
function Vi(t, e) {
const n = this.cache;
if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y && n[2] === e.z && n[3] === e.w) || (t.uniform4f(this.addr, e.x, e.y, e.z, e.w), (n[0] = e.x), (n[1] = e.y), (n[2] = e.z), (n[3] = e.w));
else {
if (zi(n, e)) return;
t.uniform4fv(this.addr, e), Oi(n, e);
}
}
function ki(t, e) {
const n = this.cache,
i = e.elements;
if (void 0 === i) {
if (zi(n, e)) return;
t.uniformMatrix2fv(this.addr, !1, e), Oi(n, e);
} else {
if (zi(n, i)) return;
Ii.set(i), t.uniformMatrix2fv(this.addr, !1, Ii), Oi(n, i);
}
}
function Gi(t, e) {
const n = this.cache,
i = e.elements;
if (void 0 === i) {
if (zi(n, e)) return;
t.uniformMatrix3fv(this.addr, !1, e), Oi(n, e);
} else {
if (zi(n, i)) return;
Di.set(i), t.uniformMatrix3fv(this.addr, !1, Di), Oi(n, i);
}
}
function Wi(t, e) {
const n = this.cache,
i = e.elements;
if (void 0 === i) {
if (zi(n, e)) return;
t.uniformMatrix4fv(this.addr, !1, e), Oi(n, e);
} else {
if (zi(n, i)) return;
Pi.set(i), t.uniformMatrix4fv(this.addr, !1, Pi), Oi(n, i);
}
}
function ji(t, e) {
const n = this.cache;
n[0] !== e && (t.uniform1i(this.addr, e), (n[0] = e));
}
function qi(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform2iv(this.addr, e), Oi(n, e));
}
function Xi(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform3iv(this.addr, e), Oi(n, e));
}
function Yi(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform4iv(this.addr, e), Oi(n, e));
}
function Ji(t, e) {
const n = this.cache;
n[0] !== e && (t.uniform1ui(this.addr, e), (n[0] = e));
}
function $i(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform2uiv(this.addr, e), Oi(n, e));
}
function Zi(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform3uiv(this.addr, e), Oi(n, e));
}
function Qi(t, e) {
const n = this.cache;
zi(n, e) || (t.uniform4uiv(this.addr, e), Oi(n, e));
}
function Ki(t, e, n) {
const i = this.cache,
r = n.allocateTextureUnit();
i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.safeSetTexture2D(e || Ei, r);
}
function tr(t, e, n) {
const i = this.cache,
r = n.allocateTextureUnit();
i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.setTexture3D(e || Ai, r);
}
function er(t, e, n) {
const i = this.cache,
r = n.allocateTextureUnit();
i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.safeSetTextureCube(e || Li, r);
}
function nr(t, e, n) {
const i = this.cache,
r = n.allocateTextureUnit();
i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.setTexture2DArray(e || Ti, r);
}
function ir(t, e) {
t.uniform1fv(this.addr, e);
}
function rr(t, e) {
const n = Ni(e, this.size, 2);
t.uniform2fv(this.addr, n);
}
function sr(t, e) {
const n = Ni(e, this.size, 3);
t.uniform3fv(this.addr, n);
}
function ar(t, e) {
const n = Ni(e, this.size, 4);
t.uniform4fv(this.addr, n);
}
function or(t, e) {
const n = Ni(e, this.size, 4);
t.uniformMatrix2fv(this.addr, !1, n);
}
function lr(t, e) {
const n = Ni(e, this.size, 9);
t.uniformMatrix3fv(this.addr, !1, n);
}
function hr(t, e) {
const n = Ni(e, this.size, 16);
t.uniformMatrix4fv(this.addr, !1, n);
}
function cr(t, e) {
t.uniform1iv(this.addr, e);
}
function ur(t, e) {
t.uniform2iv(this.addr, e);
}
function dr(t, e) {
t.uniform3iv(this.addr, e);
}
function pr(t, e) {
t.uniform4iv(this.addr, e);
}
function mr(t, e) {
t.uniform1uiv(this.addr, e);
}
function fr(t, e) {
t.uniform2uiv(this.addr, e);
}
function gr(t, e) {
t.uniform3uiv(this.addr, e);
}
function vr(t, e) {
t.uniform4uiv(this.addr, e);
}
function xr(t, e, n) {
const i = e.length,
r = Fi(n, i);
t.uniform1iv(this.addr, r);
for (let t = 0; t !== i; ++t) n.safeSetTexture2D(e[t] || Ei, r[t]);
}
function yr(t, e, n) {
const i = e.length,
r = Fi(n, i);
t.uniform1iv(this.addr, r);
for (let t = 0; t !== i; ++t) n.setTexture3D(e[t] || Ai, r[t]);
}
function _r(t, e, n) {
const i = e.length,
r = Fi(n, i);
t.uniform1iv(this.addr, r);
for (let t = 0; t !== i; ++t) n.safeSetTextureCube(e[t] || Li, r[t]);
}
function br(t, e, n) {
const i = e.length,
r = Fi(n, i);
t.uniform1iv(this.addr, r);
for (let t = 0; t !== i; ++t) n.setTexture2DArray(e[t] || Ti, r[t]);
}
function wr(t, e, n) {
(this.id = t),
(this.addr = n),
(this.cache = []),
(this.setValue = (function (t) {
switch (t) {
case 5126:
return Bi;
case 35664:
return Ui;
case 35665:
return Hi;
case 35666:
return Vi;
case 35674:
return ki;
case 35675:
return Gi;
case 35676:
return Wi;
case 5124:
case 35670:
return ji;
case 35667:
case 35671:
return qi;
case 35668:
case 35672:
return Xi;
case 35669:
case 35673:
return Yi;
case 5125:
return Ji;
case 36294:
return $i;
case 36295:
return Zi;
case 36296:
return Qi;
case 35678:
case 36198:
case 36298:
case 36306:
case 35682:
return Ki;
case 35679:
case 36299:
case 36307:
return tr;
case 35680:
case 36300:
case 36308:
case 36293:
return er;
case 36289:
case 36303:
case 36311:
case 36292:
return nr;
}
})(e.type));
}
function Mr(t, e, n) {
(this.id = t),
(this.addr = n),
(this.cache = []),
(this.size = e.size),
(this.setValue = (function (t) {
switch (t) {
case 5126:
return ir;
case 35664:
return rr;
case 35665:
return sr;
case 35666:
return ar;
case 35674:
return or;
case 35675:
return lr;
case 35676:
return hr;
case 5124:
case 35670:
return cr;
case 35667:
case 35671:
return ur;
case 35668:
case 35672:
return dr;
case 35669:
case 35673:
return pr;
case 5125:
return mr;
case 36294:
return fr;
case 36295:
return gr;
case 36296:
return vr;
case 35678:
case 36198:
case 36298:
case 36306:
case 35682:
return xr;
case 35679:
case 36299:
case 36307:
return yr;
case 35680:
case 36300:
case 36308:
case 36293:
return _r;
case 36289:
case 36303:
case 36311:
case 36292:
return br;
}
})(e.type));
}
function Sr(t) {
(this.id = t), (this.seq = []), (this.map = {});
}
(Mr.prototype.updateCache = function (t) {
const e = this.cache;
t instanceof Float32Array && e.length !== t.length && (this.cache = new Float32Array(t.length)), Oi(e, t);
}),
(Sr.prototype.setValue = function (t, e, n) {
const i = this.seq;
for (let r = 0, s = i.length; r !== s; ++r) {
const s = i[r];
s.setValue(t, e[s.id], n);
}
});
const Er = /(\w+)(\])?(\[|\.)?/g;
function Tr(t, e) {
t.seq.push(e), (t.map[e.id] = e);
}
function Ar(t, e, n) {
const i = t.name,
r = i.length;
for (Er.lastIndex = 0; ; ) {
const s = Er.exec(i),
a = Er.lastIndex;
let o = s[1];
const l = "]" === s[2],
h = s[3];
if ((l && (o |= 0), void 0 === h || ("[" === h && a + 2 === r))) {
Tr(n, void 0 === h ? new wr(o, t, e) : new Mr(o, t, e));
break;
}
{
let t = n.map[o];
void 0 === t && ((t = new Sr(o)), Tr(n, t)), (n = t);
}
}
}
function Lr(t, e) {
(this.seq = []), (this.map = {});
const n = t.getProgramParameter(e, 35718);
for (let i = 0; i < n; ++i) {
const n = t.getActiveUniform(e, i);
Ar(n, t.getUniformLocation(e, n.name), this);
}
}
function Cr(t, e, n) {
const i = t.createShader(e);
return t.shaderSource(i, n), t.compileShader(i), i;
}
(Lr.prototype.setValue = function (t, e, n, i) {
const r = this.map[e];
void 0 !== r && r.setValue(t, n, i);
}),
(Lr.prototype.setOptional = function (t, e, n) {
const i = e[n];
void 0 !== i && this.setValue(t, n, i);
}),
(Lr.upload = function (t, e, n, i) {
for (let r = 0, s = e.length; r !== s; ++r) {
const s = e[r],
a = n[s.id];
!1 !== a.needsUpdate && s.setValue(t, a.value, i);
}
}),
(Lr.seqWithValue = function (t, e) {
const n = [];
for (let i = 0, r = t.length; i !== r; ++i) {
const r = t[i];
r.id in e && n.push(r);
}
return n;
});
let Rr = 0;
function Pr(t) {
switch (t) {
case N:
return ["Linear", "( value )"];
case z:
return ["sRGB", "( value )"];
default:
return console.warn("THREE.WebGLProgram: Unsupported encoding:", t), ["Linear", "( value )"];
}
}
function Dr(t, e, n) {
const i = t.getShaderParameter(e, 35713),
r = t.getShaderInfoLog(e).trim();
return i && "" === r
? ""
: n.toUpperCase() +
"\n\n" +
r +
"\n\n" +
(function (t) {
const e = t.split("\n");
for (let t = 0; t < e.length; t++) e[t] = t + 1 + ": " + e[t];
return e.join("\n");
})(t.getShaderSource(e));
}
function Ir(t, e) {
const n = Pr(e);
return "vec4 " + t + "( vec4 value ) { return " + n[0] + "ToLinear" + n[1] + "; }";
}
function Nr(t, e) {
const n = Pr(e);
return "vec4 " + t + "( vec4 value ) { return LinearTo" + n[0] + n[1] + "; }";
}
function zr(t, e) {
let n;
switch (e) {
case 1:
n = "Linear";
break;
case 2:
n = "Reinhard";
break;
case 3:
n = "OptimizedCineon";
break;
case 4:
n = "ACESFilmic";
break;
case 5:
n = "Custom";
break;
default:
console.warn("THREE.WebGLProgram: Unsupported toneMapping:", e), (n = "Linear");
}
return "vec3 " + t + "( vec3 color ) { return " + n + "ToneMapping( color ); }";
}
function Or(t) {
return "" !== t;
}
function Fr(t, e) {
return t
.replace(/NUM_DIR_LIGHTS/g, e.numDirLights)
.replace(/NUM_SPOT_LIGHTS/g, e.numSpotLights)
.replace(/NUM_RECT_AREA_LIGHTS/g, e.numRectAreaLights)
.replace(/NUM_POINT_LIGHTS/g, e.numPointLights)
.replace(/NUM_HEMI_LIGHTS/g, e.numHemiLights)
.replace(/NUM_DIR_LIGHT_SHADOWS/g, e.numDirLightShadows)
.replace(/NUM_SPOT_LIGHT_SHADOWS/g, e.numSpotLightShadows)
.replace(/NUM_POINT_LIGHT_SHADOWS/g, e.numPointLightShadows);
}
function Br(t, e) {
return t.replace(/NUM_CLIPPING_PLANES/g, e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, e.numClippingPlanes - e.numClipIntersection);
}
const Ur = /^[ \t]*#include +<([\w\d./]+)>/gm;
function Hr(t) {
return t.replace(Ur, Vr);
}
function Vr(t, e) {
const n = Nn[e];
if (void 0 === n) throw new Error("Can not resolve #include <" + e + ">");
return Hr(n);
}
const kr = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,
Gr = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;
function Wr(t) {
return t.replace(Gr, qr).replace(kr, jr);
}
function jr(t, e, n, i) {
return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."), qr(t, e, n, i);
}
function qr(t, e, n, i) {
let r = "";
for (let t = parseInt(e); t < parseInt(n); t++) r += i.replace(/\[\s*i\s*\]/g, "[ " + t + " ]").replace(/UNROLLED_LOOP_INDEX/g, t);
return r;
}
function Xr(t) {
let e = "precision " + t.precision + " float;\nprecision " + t.precision + " int;";
return "highp" === t.precision ? (e += "\n#define HIGH_PRECISION") : "mediump" === t.precision ? (e += "\n#define MEDIUM_PRECISION") : "lowp" === t.precision && (e += "\n#define LOW_PRECISION"), e;
}
function Yr(t, e, n, s) {
const a = t.getContext(),
h = n.defines;
let c = n.vertexShader,
u = n.fragmentShader;
const d = (function (t) {
let e = "SHADOWMAP_TYPE_BASIC";
return 1 === t.shadowMapType ? (e = "SHADOWMAP_TYPE_PCF") : 2 === t.shadowMapType ? (e = "SHADOWMAP_TYPE_PCF_SOFT") : 3 === t.shadowMapType && (e = "SHADOWMAP_TYPE_VSM"), e;
})(n),
p = (function (t) {
let e = "ENVMAP_TYPE_CUBE";
if (t.envMap)
switch (t.envMapMode) {
case i:
case r:
e = "ENVMAP_TYPE_CUBE";
break;
case o:
case l:
e = "ENVMAP_TYPE_CUBE_UV";
}
return e;
})(n),
m = (function (t) {
let e = "ENVMAP_MODE_REFLECTION";
if (t.envMap)
switch (t.envMapMode) {
case r:
case l:
e = "ENVMAP_MODE_REFRACTION";
}
return e;
})(n),
f = (function (t) {
let e = "ENVMAP_BLENDING_NONE";
if (t.envMap)
switch (t.combine) {
case 0:
e = "ENVMAP_BLENDING_MULTIPLY";
break;
case 1:
e = "ENVMAP_BLENDING_MIX";
break;
case 2:
e = "ENVMAP_BLENDING_ADD";
}
return e;
})(n),
g = n.isWebGL2
? ""
: (function (t) {
return [t.extensionDerivatives || t.envMapCubeUV || t.bumpMap || t.tangentSpaceNormalMap || t.clearcoatNormalMap || t.flatShading || "physical" === t.shaderID ? "#extension GL_OES_standard_derivatives : enable" : "", (t.extensionFragDepth || t.logarithmicDepthBuffer) && t.rendererExtensionFragDepth ? "#extension GL_EXT_frag_depth : enable" : "", t.extensionDrawBuffers && t.rendererExtensionDrawBuffers ? "#extension GL_EXT_draw_buffers : require" : "", (t.extensionShaderTextureLOD || t.envMap || t.transmission) && t.rendererExtensionShaderTextureLod ? "#extension GL_EXT_shader_texture_lod : enable" : ""].filter(Or).join("\n");
})(n),
v = (function (t) {
const e = [];
for (const n in t) {
const i = t[n];
!1 !== i && e.push("#define " + n + " " + i);
}
return e.join("\n");
})(h),
x = a.createProgram();
let y,
_,
b = n.glslVersion ? "#version " + n.glslVersion + "\n" : "";
n.isRawShaderMaterial ? ((y = [v].filter(Or).join("\n")), y.length > 0 && (y += "\n"), (_ = [g, v].filter(Or).join("\n")), _.length > 0 && (_ += "\n")) : ((y = [Xr(n), "#define SHADER_NAME " + n.shaderName, v, n.instancing ? "#define USE_INSTANCING" : "", n.instancingColor ? "#define USE_INSTANCING_COLOR" : "", n.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", "#define MAX_BONES " + n.maxBones, n.useFog && n.fog ? "#define USE_FOG" : "", n.useFog && n.fogExp2 ? "#define FOG_EXP2" : "", n.map ? "#define USE_MAP" : "", n.envMap ? "#define USE_ENVMAP" : "", n.envMap ? "#define " + m : "", n.lightMap ? "#define USE_LIGHTMAP" : "", n.aoMap ? "#define USE_AOMAP" : "", n.emissiveMap ? "#define USE_EMISSIVEMAP" : "", n.bumpMap ? "#define USE_BUMPMAP" : "", n.normalMap ? "#define USE_NORMALMAP" : "", n.normalMap && n.objectSpaceNormalMap ? "#define OBJECTSPACE_NORMALMAP" : "", n.normalMap && n.tangentSpaceNormalMap ? "#define TANGENTSPACE_NORMALMAP" : "", n.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", n.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", n.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", n.displacementMap && n.supportsVertexTextures ? "#define USE_DISPLACEMENTMAP" : "", n.specularMap ? "#define USE_SPECULARMAP" : "", n.specularIntensityMap ? "#define USE_SPECULARINTENSITYMAP" : "", n.specularColorMap ? "#define USE_SPECULARCOLORMAP" : "", n.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", n.metalnessMap ? "#define USE_METALNESSMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.transmission ? "#define USE_TRANSMISSION" : "", n.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", n.thicknessMap ? "#define USE_THICKNESSMAP" : "", n.sheenColorMap ? "#define USE_SHEENCOLORMAP" : "", n.sheenRoughnessMap ? "#define USE_SHEENROUGHNESSMAP" : "", n.vertexTangents ? "#define USE_TANGENT" : "", n.vertexColors ? "#define USE_COLOR" : "", n.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", n.vertexUvs ? "#define USE_UV" : "", n.uvsVertexOnly ? "#define UVS_VERTEX_ONLY" : "", n.flatShading ? "#define FLAT_SHADED" : "", n.skinning ? "#define USE_SKINNING" : "", n.useVertexTexture ? "#define BONE_TEXTURE" : "", n.morphTargets ? "#define USE_MORPHTARGETS" : "", n.morphNormals && !1 === n.flatShading ? "#define USE_MORPHNORMALS" : "", n.morphTargets && n.isWebGL2 ? "#define MORPHTARGETS_TEXTURE" : "", n.morphTargets && n.isWebGL2 ? "#define MORPHTARGETS_COUNT " + n.morphTargetsCount : "", n.doubleSided ? "#define DOUBLE_SIDED" : "", n.flipSided ? "#define FLIP_SIDED" : "", n.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", n.shadowMapEnabled ? "#define " + d : "", n.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", n.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", n.logarithmicDepthBuffer && n.rendererExtensionFragDepth ? "#define USE_LOGDEPTHBUF_EXT" : "", "uniform mat4 modelMatrix;", "uniform mat4 modelViewMatrix;", "uniform mat4 projectionMatrix;", "uniform mat4 viewMatrix;", "uniform mat3 normalMatrix;", "uniform vec3 cameraPosition;", "uniform bool isOrthographic;", "#ifdef USE_INSTANCING", "\tattribute mat4 instanceMatrix;", "#endif", "#ifdef USE_INSTANCING_COLOR", "\tattribute vec3 instanceColor;", "#endif", "attribute vec3 position;", "attribute vec3 normal;", "attribute vec2 uv;", "#ifdef USE_TANGENT", "\tattribute vec4 tangent;", "#endif", "#if defined( USE_COLOR_ALPHA )", "\tattribute vec4 color;", "#elif defined( USE_COLOR )", "\tattribute vec3 color;", "#endif", "#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )", "\tattribute vec3 morphTarget0;", "\tattribute vec3 morphTarget1;", "\tattribute vec3 morphTarget2;", "\tattribute vec3 morphTarget3;", "\t#ifdef USE_MORPHNORMALS", "\t\tattribute vec3 morphNormal0;", "\t\tattribute vec3 morphNormal1;", "\t\tattribute vec3 morphNormal2;", "\t\tattribute vec3 morphNormal3;", "\t#else", "\t\tattribute vec3 morphTarget4;", "\t\tattribute vec3 morphTarget5;", "\t\tattribute vec3 morphTarget6;", "\t\tattribute vec3 morphTarget7;", "\t#endif", "#endif", "#ifdef USE_SKINNING", "\tattribute vec4 skinIndex;", "\tattribute vec4 skinWeight;", "#endif", "\n"].filter(Or).join("\n")), (_ = [g, Xr(n), "#define SHADER_NAME " + n.shaderName, v, n.useFog && n.fog ? "#define USE_FOG" : "", n.useFog && n.fogExp2 ? "#define FOG_EXP2" : "", n.map ? "#define USE_MAP" : "", n.matcap ? "#define USE_MATCAP" : "", n.envMap ? "#define USE_ENVMAP" : "", n.envMap ? "#define " + p : "", n.envMap ? "#define " + m : "", n.envMap ? "#define " + f : "", n.lightMap ? "#define USE_LIGHTMAP" : "", n.aoMap ? "#define USE_AOMAP" : "", n.emissiveMap ? "#define USE_EMISSIVEMAP" : "", n.bumpMap ? "#define USE_BUMPMAP" : "", n.normalMap ? "#define USE_NORMALMAP" : "", n.normalMap && n.objectSpaceNormalMap ? "#define OBJECTSPACE_NORMALMAP" : "", n.normalMap && n.tangentSpaceNormalMap ? "#define TANGENTSPACE_NORMALMAP" : "", n.clearcoat ? "#define USE_CLEARCOAT" : "", n.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", n.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", n.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", n.specularMap ? "#define USE_SPECULARMAP" : "", n.specularIntensityMap ? "#define USE_SPECULARINTENSITYMAP" : "", n.specularColorMap ? "#define USE_SPECULARCOLORMAP" : "", n.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", n.metalnessMap ? "#define USE_METALNESSMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.alphaTest ? "#define USE_ALPHATEST" : "", n.sheen ? "#define USE_SHEEN" : "", n.sheenColorMap ? "#define USE_SHEENCOLORMAP" : "", n.sheenRoughnessMap ? "#define USE_SHEENROUGHNESSMAP" : "", n.transmission ? "#define USE_TRANSMISSION" : "", n.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", n.thicknessMap ? "#define USE_THICKNESSMAP" : "", n.vertexTangents ? "#define USE_TANGENT" : "", n.vertexColors || n.instancingColor ? "#define USE_COLOR" : "", n.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", n.vertexUvs ? "#define USE_UV" : "", n.uvsVertexOnly ? "#define UVS_VERTEX_ONLY" : "", n.gradientMap ? "#define USE_GRADIENTMAP" : "", n.flatShading ? "#define FLAT_SHADED" : "", n.doubleSided ? "#define DOUBLE_SIDED" : "", n.flipSided ? "#define FLIP_SIDED" : "", n.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", n.shadowMapEnabled ? "#define " + d : "", n.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", n.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : "", n.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", n.logarithmicDepthBuffer && n.rendererExtensionFragDepth ? "#define USE_LOGDEPTHBUF_EXT" : "", (n.extensionShaderTextureLOD || n.envMap) && n.rendererExtensionShaderTextureLod ? "#define TEXTURE_LOD_EXT" : "", "uniform mat4 viewMatrix;", "uniform vec3 cameraPosition;", "uniform bool isOrthographic;", 0 !== n.toneMapping ? "#define TONE_MAPPING" : "", 0 !== n.toneMapping ? Nn.tonemapping_pars_fragment : "", 0 !== n.toneMapping ? zr("toneMapping", n.toneMapping) : "", n.dithering ? "#define DITHERING" : "", n.format === M ? "#define OPAQUE" : "", Nn.encodings_pars_fragment, n.map ? Ir("mapTexelToLinear", n.mapEncoding) : "", n.matcap ? Ir("matcapTexelToLinear", n.matcapEncoding) : "", n.envMap ? Ir("envMapTexelToLinear", n.envMapEncoding) : "", n.emissiveMap ? Ir("emissiveMapTexelToLinear", n.emissiveMapEncoding) : "", n.specularColorMap ? Ir("specularColorMapTexelToLinear", n.specularColorMapEncoding) : "", n.sheenColorMap ? Ir("sheenColorMapTexelToLinear", n.sheenColorMapEncoding) : "", n.lightMap ? Ir("lightMapTexelToLinear", n.lightMapEncoding) : "", Nr("linearToOutputTexel", n.outputEncoding), n.depthPacking ? "#define DEPTH_PACKING " + n.depthPacking : "", "\n"].filter(Or).join("\n"))),
(c = Hr(c)),
(c = Fr(c, n)),
(c = Br(c, n)),
(u = Hr(u)),
(u = Fr(u, n)),
(u = Br(u, n)),
(c = Wr(c)),
(u = Wr(u)),
n.isWebGL2 && !0 !== n.isRawShaderMaterial && ((b = "#version 300 es\n"), (y = ["precision mediump sampler2DArray;", "#define attribute in", "#define varying out", "#define texture2D texture"].join("\n") + "\n" + y), (_ = ["#define varying in", n.glslVersion === U ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", n.glslVersion === U ? "" : "#define gl_FragColor pc_fragColor", "#define gl_FragDepthEXT gl_FragDepth", "#define texture2D texture", "#define textureCube texture", "#define texture2DProj textureProj", "#define texture2DLodEXT textureLod", "#define texture2DProjLodEXT textureProjLod", "#define textureCubeLodEXT textureLod", "#define texture2DGradEXT textureGrad", "#define texture2DProjGradEXT textureProjGrad", "#define textureCubeGradEXT textureGrad"].join("\n") + "\n" + _));
const w = b + _ + u,
S = Cr(a, 35633, b + y + c),
E = Cr(a, 35632, w);
if ((a.attachShader(x, S), a.attachShader(x, E), void 0 !== n.index0AttributeName ? a.bindAttribLocation(x, 0, n.index0AttributeName) : !0 === n.morphTargets && a.bindAttribLocation(x, 0, "position"), a.linkProgram(x), t.debug.checkShaderErrors)) {
const t = a.getProgramInfoLog(x).trim(),
e = a.getShaderInfoLog(S).trim(),
n = a.getShaderInfoLog(E).trim();
let i = !0,
r = !0;
if (!1 === a.getProgramParameter(x, 35714)) {
i = !1;
const e = Dr(a, S, "vertex"),
n = Dr(a, E, "fragment");
console.error("THREE.WebGLProgram: Shader Error " + a.getError() + " - VALIDATE_STATUS " + a.getProgramParameter(x, 35715) + "\n\nProgram Info Log: " + t + "\n" + e + "\n" + n);
} else "" !== t ? console.warn("THREE.WebGLProgram: Program Info Log:", t) : ("" !== e && "" !== n) || (r = !1);
r && (this.diagnostics = { runnable: i, programLog: t, vertexShader: { log: e, prefix: y }, fragmentShader: { log: n, prefix: _ } });
}
let T, A;
return (
a.deleteShader(S),
a.deleteShader(E),
(this.getUniforms = function () {
return void 0 === T && (T = new Lr(a, x)), T;
}),
(this.getAttributes = function () {
return (
void 0 === A &&
(A = (function (t, e) {
const n = {},
i = t.getProgramParameter(e, 35721);
for (let r = 0; r < i; r++) {
const i = t.getActiveAttrib(e, r),
s = i.name;
let a = 1;
35674 === i.type && (a = 2), 35675 === i.type && (a = 3), 35676 === i.type && (a = 4), (n[s] = { type: i.type, location: t.getAttribLocation(e, s), locationSize: a });
}
return n;
})(a, x)),
A
);
}),
(this.destroy = function () {
s.releaseStatesOfProgram(this), a.deleteProgram(x), (this.program = void 0);
}),
(this.name = n.shaderName),
(this.id = Rr++),
(this.cacheKey = e),
(this.usedTimes = 1),
(this.program = x),
(this.vertexShader = S),
(this.fragmentShader = E),
this
);
}
let Jr = 0;
class $r {
constructor() {
(this.shaderCache = new Map()), (this.materialCache = new Map());
}
update(t) {
const e = t.vertexShader,
n = t.fragmentShader,
i = this._getShaderStage(e),
r = this._getShaderStage(n),
s = this._getShaderCacheForMaterial(t);
return !1 === s.has(i) && (s.add(i), i.usedTimes++), !1 === s.has(r) && (s.add(r), r.usedTimes++), this;
}
remove(t) {
const e = this.materialCache.get(t);
for (const t of e) t.usedTimes--, 0 === t.usedTimes && this.shaderCache.delete(t);
return this.materialCache.delete(t), this;
}
getVertexShaderID(t) {
return this._getShaderStage(t.vertexShader).id;
}
getFragmentShaderID(t) {
return this._getShaderStage(t.fragmentShader).id;
}
dispose() {
this.shaderCache.clear(), this.materialCache.clear();
}
_getShaderCacheForMaterial(t) {
const e = this.materialCache;
return !1 === e.has(t) && e.set(t, new Set()), e.get(t);
}
_getShaderStage(t) {
const e = this.shaderCache;
if (!1 === e.has(t)) {
const n = new Zr();
e.set(t, n);
}
return e.get(t);
}
}
class Zr {
constructor() {
(this.id = Jr++), (this.usedTimes = 0);
}
}
function Qr(t, e, n, i, r, s, a) {
const h = new Zt(),
c = new $r(),
u = [],
d = r.isWebGL2,
p = r.logarithmicDepthBuffer,
m = r.floatVertexTextures,
f = r.maxVertexUniforms,
g = r.vertexTextures;
let x = r.precision;
const y = { MeshDepthMaterial: "depth", MeshDistanceMaterial: "distanceRGBA", MeshNormalMaterial: "normal", MeshBasicMaterial: "basic", MeshLambertMaterial: "lambert", MeshPhongMaterial: "phong", MeshToonMaterial: "toon", MeshStandardMaterial: "physical", MeshPhysicalMaterial: "physical", MeshMatcapMaterial: "matcap", LineBasicMaterial: "basic", LineDashedMaterial: "dashed", PointsMaterial: "points", ShadowMaterial: "shadow", SpriteMaterial: "sprite" };
function _(t) {
let e;
return t && t.isTexture ? (e = t.encoding) : t && t.isWebGLRenderTarget ? (console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), (e = t.texture.encoding)) : (e = N), d && t && t.isTexture && t.format === S && t.type === v && t.encoding === z && (e = N), e;
}
return {
getParameters: function (s, h, u, v, b) {
const w = v.fog,
M = s.isMeshStandardMaterial ? v.environment : null,
S = (s.isMeshStandardMaterial ? n : e).get(s.envMap || M),
E = y[s.type],
T = b.isSkinnedMesh
? (function (t) {
const e = t.skeleton.bones;
if (m) return 1024;
{
const t = f,
n = Math.floor((t - 20) / 4),
i = Math.min(n, e.length);
return i < e.length ? (console.warn("THREE.WebGLRenderer: Skeleton has " + e.length + " bones. This GPU supports " + i + "."), 0) : i;
}
})(b)
: 0;
let A, L, C, R;
if ((null !== s.precision && ((x = r.getMaxPrecision(s.precision)), x !== s.precision && console.warn("THREE.WebGLProgram.getParameters:", s.precision, "not supported, using", x, "instead.")), E)) {
const t = On[E];
(A = t.vertexShader), (L = t.fragmentShader);
} else (A = s.vertexShader), (L = s.fragmentShader), c.update(s), (C = c.getVertexShaderID(s)), (R = c.getFragmentShaderID(s));
const P = t.getRenderTarget(),
D = s.alphaTest > 0,
I = s.clearcoat > 0;
return { isWebGL2: d, shaderID: E, shaderName: s.type, vertexShader: A, fragmentShader: L, defines: s.defines, customVertexShaderID: C, customFragmentShaderID: R, isRawShaderMaterial: !0 === s.isRawShaderMaterial, glslVersion: s.glslVersion, precision: x, instancing: !0 === b.isInstancedMesh, instancingColor: !0 === b.isInstancedMesh && null !== b.instanceColor, supportsVertexTextures: g, outputEncoding: null !== P ? _(P.texture) : t.outputEncoding, map: !!s.map, mapEncoding: _(s.map), matcap: !!s.matcap, matcapEncoding: _(s.matcap), envMap: !!S, envMapMode: S && S.mapping, envMapEncoding: _(S), envMapCubeUV: !!S && (S.mapping === o || S.mapping === l), lightMap: !!s.lightMap, lightMapEncoding: _(s.lightMap), aoMap: !!s.aoMap, emissiveMap: !!s.emissiveMap, emissiveMapEncoding: _(s.emissiveMap), bumpMap: !!s.bumpMap, normalMap: !!s.normalMap, objectSpaceNormalMap: 1 === s.normalMapType, tangentSpaceNormalMap: 0 === s.normalMapType, clearcoat: I, clearcoatMap: I && !!s.clearcoatMap, clearcoatRoughnessMap: I && !!s.clearcoatRoughnessMap, clearcoatNormalMap: I && !!s.clearcoatNormalMap, displacementMap: !!s.displacementMap, roughnessMap: !!s.roughnessMap, metalnessMap: !!s.metalnessMap, specularMap: !!s.specularMap, specularIntensityMap: !!s.specularIntensityMap, specularColorMap: !!s.specularColorMap, specularColorMapEncoding: _(s.specularColorMap), alphaMap: !!s.alphaMap, alphaTest: D, gradientMap: !!s.gradientMap, sheen: s.sheen > 0, sheenColorMap: !!s.sheenColorMap, sheenColorMapEncoding: _(s.sheenColorMap), sheenRoughnessMap: !!s.sheenRoughnessMap, transmission: s.transmission > 0, transmissionMap: !!s.transmissionMap, thicknessMap: !!s.thicknessMap, combine: s.combine, vertexTangents: !!s.normalMap && !!b.geometry && !!b.geometry.attributes.tangent, vertexColors: s.vertexColors, vertexAlphas: !0 === s.vertexColors && !!b.geometry && !!b.geometry.attributes.color && 4 === b.geometry.attributes.color.itemSize, vertexUvs: !!(s.map || s.bumpMap || s.normalMap || s.specularMap || s.alphaMap || s.emissiveMap || s.roughnessMap || s.metalnessMap || s.clearcoatMap || s.clearcoatRoughnessMap || s.clearcoatNormalMap || s.displacementMap || s.transmissionMap || s.thicknessMap || s.specularIntensityMap || s.specularColorMap || s.sheenColorMap || s.sheenRoughnessMap), uvsVertexOnly: !(s.map || s.bumpMap || s.normalMap || s.specularMap || s.alphaMap || s.emissiveMap || s.roughnessMap || s.metalnessMap || s.clearcoatNormalMap || s.transmission > 0 || s.transmissionMap || s.thicknessMap || s.specularIntensityMap || s.specularColorMap || s.sheen > 0 || s.sheenColorMap || s.sheenRoughnessMap || !s.displacementMap), fog: !!w, useFog: s.fog, fogExp2: w && w.isFogExp2, flatShading: !!s.flatShading, sizeAttenuation: s.sizeAttenuation, logarithmicDepthBuffer: p, skinning: !0 === b.isSkinnedMesh && T > 0, maxBones: T, useVertexTexture: m, morphTargets: !!b.geometry && !!b.geometry.morphAttributes.position, morphNormals: !!b.geometry && !!b.geometry.morphAttributes.normal, morphTargetsCount: b.geometry && b.geometry.morphAttributes.position ? b.geometry.morphAttributes.position.length : 0, numDirLights: h.directional.length, numPointLights: h.point.length, numSpotLights: h.spot.length, numRectAreaLights: h.rectArea.length, numHemiLights: h.hemi.length, numDirLightShadows: h.directionalShadowMap.length, numPointLightShadows: h.pointShadowMap.length, numSpotLightShadows: h.spotShadowMap.length, numClippingPlanes: a.numPlanes, numClipIntersection: a.numIntersection, format: s.format, dithering: s.dithering, shadowMapEnabled: t.shadowMap.enabled && u.length > 0, shadowMapType: t.shadowMap.type, toneMapping: s.toneMapped ? t.toneMapping : 0, physicallyCorrectLights: t.physicallyCorrectLights, premultipliedAlpha: s.premultipliedAlpha, doubleSided: 2 === s.side, flipSided: 1 === s.side, depthPacking: void 0 !== s.depthPacking && s.depthPacking, index0AttributeName: s.index0AttributeName, extensionDerivatives: s.extensions && s.extensions.derivatives, extensionFragDepth: s.extensions && s.extensions.fragDepth, extensionDrawBuffers: s.extensions && s.extensions.drawBuffers, extensionShaderTextureLOD: s.extensions && s.extensions.shaderTextureLOD, rendererExtensionFragDepth: d || i.has("EXT_frag_depth"), rendererExtensionDrawBuffers: d || i.has("WEBGL_draw_buffers"), rendererExtensionShaderTextureLod: d || i.has("EXT_shader_texture_lod"), customProgramCacheKey: s.customProgramCacheKey() };
},
getProgramCacheKey: function (e) {
const n = [];
if ((e.shaderID ? n.push(e.shaderID) : (n.push(e.customVertexShaderID), n.push(e.customFragmentShaderID)), void 0 !== e.defines)) for (const t in e.defines) n.push(t), n.push(e.defines[t]);
return (
!1 === e.isRawShaderMaterial &&
(!(function (t, e) {
t.push(e.precision), t.push(e.outputEncoding), t.push(e.mapEncoding), t.push(e.matcapEncoding), t.push(e.envMapMode), t.push(e.envMapEncoding), t.push(e.lightMapEncoding), t.push(e.emissiveMapEncoding), t.push(e.combine), t.push(e.vertexUvs), t.push(e.fogExp2), t.push(e.sizeAttenuation), t.push(e.maxBones), t.push(e.morphTargetsCount), t.push(e.numDirLights), t.push(e.numPointLights), t.push(e.numSpotLights), t.push(e.numHemiLights), t.push(e.numRectAreaLights), t.push(e.numDirLightShadows), t.push(e.numPointLightShadows), t.push(e.numSpotLightShadows), t.push(e.shadowMapType), t.push(e.toneMapping), t.push(e.numClippingPlanes), t.push(e.numClipIntersection), t.push(e.format), t.push(e.specularColorMapEncoding), t.push(e.sheenColorMapEncoding);
})(n, e),
(function (t, e) {
h.disableAll(), e.isWebGL2 && h.enable(0);
e.supportsVertexTextures && h.enable(1);
e.instancing && h.enable(2);
e.instancingColor && h.enable(3);
e.map && h.enable(4);
e.matcap && h.enable(5);
e.envMap && h.enable(6);
e.envMapCubeUV && h.enable(7);
e.lightMap && h.enable(8);
e.aoMap && h.enable(9);
e.emissiveMap && h.enable(10);
e.bumpMap && h.enable(11);
e.normalMap && h.enable(12);
e.objectSpaceNormalMap && h.enable(13);
e.tangentSpaceNormalMap && h.enable(14);
e.clearcoat && h.enable(15);
e.clearcoatMap && h.enable(16);
e.clearcoatRoughnessMap && h.enable(17);
e.clearcoatNormalMap && h.enable(18);
e.displacementMap && h.enable(19);
e.specularMap && h.enable(20);
e.roughnessMap && h.enable(21);
e.metalnessMap && h.enable(22);
e.gradientMap && h.enable(23);
e.alphaMap && h.enable(24);
e.alphaTest && h.enable(25);
e.vertexColors && h.enable(26);
e.vertexAlphas && h.enable(27);
e.vertexUvs && h.enable(28);
e.vertexTangents && h.enable(29);
e.uvsVertexOnly && h.enable(30);
e.fog && h.enable(31);
t.push(h.mask), h.disableAll(), e.useFog && h.enable(0);
e.flatShading && h.enable(1);
e.logarithmicDepthBuffer && h.enable(2);
e.skinning && h.enable(3);
e.useVertexTexture && h.enable(4);
e.morphTargets && h.enable(5);
e.morphNormals && h.enable(6);
e.premultipliedAlpha && h.enable(7);
e.shadowMapEnabled && h.enable(8);
e.physicallyCorrectLights && h.enable(9);
e.doubleSided && h.enable(10);
e.flipSided && h.enable(11);
e.depthPacking && h.enable(12);
e.dithering && h.enable(13);
e.specularIntensityMap && h.enable(14);
e.specularColorMap && h.enable(15);
e.transmission && h.enable(16);
e.transmissionMap && h.enable(17);
e.thicknessMap && h.enable(18);
e.sheen && h.enable(19);
e.sheenColorMap && h.enable(20);
e.sheenRoughnessMap && h.enable(21);
t.push(h.mask);
})(n, e),
n.push(t.outputEncoding)),
n.push(e.customProgramCacheKey),
n.join()
);
},
getUniforms: function (t) {
const e = y[t.type];
let n;
if (e) {
const t = On[e];
n = gn.clone(t.uniforms);
} else n = t.uniforms;
return n;
},
acquireProgram: function (e, n) {
let i;
for (let t = 0, e = u.length; t < e; t++) {
const e = u[t];
if (e.cacheKey === n) {
(i = e), ++i.usedTimes;
break;
}
}
return void 0 === i && ((i = new Yr(t, n, e, s)), u.push(i)), i;
},
releaseProgram: function (t) {
if (0 == --t.usedTimes) {
const e = u.indexOf(t);
(u[e] = u[u.length - 1]), u.pop(), t.destroy();
}
},
releaseShaderCache: function (t) {
c.remove(t);
},
programs: u,
dispose: function () {
c.dispose();
},
};
}
function Kr() {
let t = new WeakMap();
return {
get: function (e) {
let n = t.get(e);
return void 0 === n && ((n = {}), t.set(e, n)), n;
},
remove: function (e) {
t.delete(e);
},
update: function (e, n, i) {
t.get(e)[n] = i;
},
dispose: function () {
t = new WeakMap();
},
};
}
function ts(t, e) {
return t.groupOrder !== e.groupOrder ? t.groupOrder - e.groupOrder : t.renderOrder !== e.renderOrder ? t.renderOrder - e.renderOrder : t.material.id !== e.material.id ? t.material.id - e.material.id : t.z !== e.z ? t.z - e.z : t.id - e.id;
}
function es(t, e) {
return t.groupOrder !== e.groupOrder ? t.groupOrder - e.groupOrder : t.renderOrder !== e.renderOrder ? t.renderOrder - e.renderOrder : t.z !== e.z ? e.z - t.z : t.id - e.id;
}
function ns() {
const t = [];
let e = 0;
const n = [],
i = [],
r = [];
function s(n, i, r, s, a, o) {
let l = t[e];
return void 0 === l ? ((l = { id: n.id, object: n, geometry: i, material: r, groupOrder: s, renderOrder: n.renderOrder, z: a, group: o }), (t[e] = l)) : ((l.id = n.id), (l.object = n), (l.geometry = i), (l.material = r), (l.groupOrder = s), (l.renderOrder = n.renderOrder), (l.z = a), (l.group = o)), e++, l;
}
return {
opaque: n,
transmissive: i,
transparent: r,
init: function () {
(e = 0), (n.length = 0), (i.length = 0), (r.length = 0);
},
push: function (t, e, a, o, l, h) {
const c = s(t, e, a, o, l, h);
a.transmission > 0 ? i.push(c) : !0 === a.transparent ? r.push(c) : n.push(c);
},
unshift: function (t, e, a, o, l, h) {
const c = s(t, e, a, o, l, h);
a.transmission > 0 ? i.unshift(c) : !0 === a.transparent ? r.unshift(c) : n.unshift(c);
},
finish: function () {
for (let n = e, i = t.length; n < i; n++) {
const e = t[n];
if (null === e.id) break;
(e.id = null), (e.object = null), (e.geometry = null), (e.material = null), (e.group = null);
}
},
sort: function (t, e) {
n.length > 1 && n.sort(t || ts), i.length > 1 && i.sort(e || es), r.length > 1 && r.sort(e || es);
},
};
}
function is() {
let t = new WeakMap();
return {
get: function (e, n) {
let i;
return !1 === t.has(e) ? ((i = new ns()), t.set(e, [i])) : n >= t.get(e).length ? ((i = new ns()), t.get(e).push(i)) : (i = t.get(e)[n]), i;
},
dispose: function () {
t = new WeakMap();
},
};
}
function rs() {
const t = {};
return {
get: function (e) {
if (void 0 !== t[e.id]) return t[e.id];
let n;
switch (e.type) {
case "DirectionalLight":
n = { direction: new ht(), color: new Pe() };
break;
case "SpotLight":
n = { position: new ht(), direction: new ht(), color: new Pe(), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0 };
break;
case "PointLight":
n = { position: new ht(), color: new Pe(), distance: 0, decay: 0 };
break;
case "HemisphereLight":
n = { direction: new ht(), skyColor: new Pe(), groundColor: new Pe() };
break;
case "RectAreaLight":
n = { color: new Pe(), position: new ht(), halfWidth: new ht(), halfHeight: new ht() };
}
return (t[e.id] = n), n;
},
};
}
let ss = 0;
function as(t, e) {
return (e.castShadow ? 1 : 0) - (t.castShadow ? 1 : 0);
}
function os(t, e) {
const n = new rs(),
i = (function () {
const t = {};
return {
get: function (e) {
if (void 0 !== t[e.id]) return t[e.id];
let n;
switch (e.type) {
case "DirectionalLight":
case "SpotLight":
n = { shadowBias: 0, shadowNormalBias: 0, shadowRadius: 1, shadowMapSize: new $() };
break;
case "PointLight":
n = { shadowBias: 0, shadowNormalBias: 0, shadowRadius: 1, shadowMapSize: new $(), shadowCameraNear: 1, shadowCameraFar: 1e3 };
}
return (t[e.id] = n), n;
},
};
})(),
r = { version: 0, hash: { directionalLength: -1, pointLength: -1, spotLength: -1, rectAreaLength: -1, hemiLength: -1, numDirectionalShadows: -1, numPointShadows: -1, numSpotShadows: -1 }, ambient: [0, 0, 0], probe: [], directional: [], directionalShadow: [], directionalShadowMap: [], directionalShadowMatrix: [], spot: [], spotShadow: [], spotShadowMap: [], spotShadowMatrix: [], rectArea: [], rectAreaLTC1: null, rectAreaLTC2: null, point: [], pointShadow: [], pointShadowMap: [], pointShadowMatrix: [], hemi: [] };
for (let t = 0; t < 9; t++) r.probe.push(new ht());
const s = new ht(),
a = new Ht(),
o = new Ht();
return {
setup: function (s, a) {
let o = 0,
l = 0,
h = 0;
for (let t = 0; t < 9; t++) r.probe[t].set(0, 0, 0);
let c = 0,
u = 0,
d = 0,
p = 0,
m = 0,
f = 0,
g = 0,
v = 0;
s.sort(as);
const x = !0 !== a ? Math.PI : 1;
for (let t = 0, e = s.length; t < e; t++) {
const e = s[t],
a = e.color,
y = e.intensity,
_ = e.distance,
b = e.shadow && e.shadow.map ? e.shadow.map.texture : null;
if (e.isAmbientLight) (o += a.r * y * x), (l += a.g * y * x), (h += a.b * y * x);
else if (e.isLightProbe) for (let t = 0; t < 9; t++) r.probe[t].addScaledVector(e.sh.coefficients[t], y);
else if (e.isDirectionalLight) {
const t = n.get(e);
if ((t.color.copy(e.color).multiplyScalar(e.intensity * x), e.castShadow)) {
const t = e.shadow,
n = i.get(e);
(n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (r.directionalShadow[c] = n), (r.directionalShadowMap[c] = b), (r.directionalShadowMatrix[c] = e.shadow.matrix), f++;
}
(r.directional[c] = t), c++;
} else if (e.isSpotLight) {
const t = n.get(e);
if ((t.position.setFromMatrixPosition(e.matrixWorld), t.color.copy(a).multiplyScalar(y * x), (t.distance = _), (t.coneCos = Math.cos(e.angle)), (t.penumbraCos = Math.cos(e.angle * (1 - e.penumbra))), (t.decay = e.decay), e.castShadow)) {
const t = e.shadow,
n = i.get(e);
(n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (r.spotShadow[d] = n), (r.spotShadowMap[d] = b), (r.spotShadowMatrix[d] = e.shadow.matrix), v++;
}
(r.spot[d] = t), d++;
} else if (e.isRectAreaLight) {
const t = n.get(e);
t.color.copy(a).multiplyScalar(y), t.halfWidth.set(0.5 * e.width, 0, 0), t.halfHeight.set(0, 0.5 * e.height, 0), (r.rectArea[p] = t), p++;
} else if (e.isPointLight) {
const t = n.get(e);
if ((t.color.copy(e.color).multiplyScalar(e.intensity * x), (t.distance = e.distance), (t.decay = e.decay), e.castShadow)) {
const t = e.shadow,
n = i.get(e);
(n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (n.shadowCameraNear = t.camera.near), (n.shadowCameraFar = t.camera.far), (r.pointShadow[u] = n), (r.pointShadowMap[u] = b), (r.pointShadowMatrix[u] = e.shadow.matrix), g++;
}
(r.point[u] = t), u++;
} else if (e.isHemisphereLight) {
const t = n.get(e);
t.skyColor.copy(e.color).multiplyScalar(y * x), t.groundColor.copy(e.groundColor).multiplyScalar(y * x), (r.hemi[m] = t), m++;
}
}
p > 0 && (e.isWebGL2 || !0 === t.has("OES_texture_float_linear") ? ((r.rectAreaLTC1 = zn.LTC_FLOAT_1), (r.rectAreaLTC2 = zn.LTC_FLOAT_2)) : !0 === t.has("OES_texture_half_float_linear") ? ((r.rectAreaLTC1 = zn.LTC_HALF_1), (r.rectAreaLTC2 = zn.LTC_HALF_2)) : console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")), (r.ambient[0] = o), (r.ambient[1] = l), (r.ambient[2] = h);
const y = r.hash;
(y.directionalLength === c && y.pointLength === u && y.spotLength === d && y.rectAreaLength === p && y.hemiLength === m && y.numDirectionalShadows === f && y.numPointShadows === g && y.numSpotShadows === v) || ((r.directional.length = c), (r.spot.length = d), (r.rectArea.length = p), (r.point.length = u), (r.hemi.length = m), (r.directionalShadow.length = f), (r.directionalShadowMap.length = f), (r.pointShadow.length = g), (r.pointShadowMap.length = g), (r.spotShadow.length = v), (r.spotShadowMap.length = v), (r.directionalShadowMatrix.length = f), (r.pointShadowMatrix.length = g), (r.spotShadowMatrix.length = v), (y.directionalLength = c), (y.pointLength = u), (y.spotLength = d), (y.rectAreaLength = p), (y.hemiLength = m), (y.numDirectionalShadows = f), (y.numPointShadows = g), (y.numSpotShadows = v), (r.version = ss++));
},
setupView: function (t, e) {
let n = 0,
i = 0,
l = 0,
h = 0,
c = 0;
const u = e.matrixWorldInverse;
for (let e = 0, d = t.length; e < d; e++) {
const d = t[e];
if (d.isDirectionalLight) {
const t = r.directional[n];
t.direction.setFromMatrixPosition(d.matrixWorld), s.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(s), t.direction.transformDirection(u), n++;
} else if (d.isSpotLight) {
const t = r.spot[l];
t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), t.direction.setFromMatrixPosition(d.matrixWorld), s.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(s), t.direction.transformDirection(u), l++;
} else if (d.isRectAreaLight) {
const t = r.rectArea[h];
t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), o.identity(), a.copy(d.matrixWorld), a.premultiply(u), o.extractRotation(a), t.halfWidth.set(0.5 * d.width, 0, 0), t.halfHeight.set(0, 0.5 * d.height, 0), t.halfWidth.applyMatrix4(o), t.halfHeight.applyMatrix4(o), h++;
} else if (d.isPointLight) {
const t = r.point[i];
t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), i++;
} else if (d.isHemisphereLight) {
const t = r.hemi[c];
t.direction.setFromMatrixPosition(d.matrixWorld), t.direction.transformDirection(u), t.direction.normalize(), c++;
}
}
},
state: r,
};
}
function ls(t, e) {
const n = new os(t, e),
i = [],
r = [];
return {
init: function () {
(i.length = 0), (r.length = 0);
},
state: { lightsArray: i, shadowsArray: r, lights: n },
setupLights: function (t) {
n.setup(i, t);
},
setupLightsView: function (t) {
n.setupView(i, t);
},
pushLight: function (t) {
i.push(t);
},
pushShadow: function (t) {
r.push(t);
},
};
}
function hs(t, e) {
let n = new WeakMap();
return {
get: function (i, r = 0) {
let s;
return !1 === n.has(i) ? ((s = new ls(t, e)), n.set(i, [s])) : r >= n.get(i).length ? ((s = new ls(t, e)), n.get(i).push(s)) : (s = n.get(i)[r]), s;
},
dispose: function () {
n = new WeakMap();
},
};
}
class cs extends Se {
constructor(t) {
super(), (this.type = "MeshDepthMaterial"), (this.depthPacking = 3200), (this.map = null), (this.alphaMap = null), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.fog = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), (this.depthPacking = t.depthPacking), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), this;
}
}
cs.prototype.isMeshDepthMaterial = !0;
class us extends Se {
constructor(t) {
super(), (this.type = "MeshDistanceMaterial"), (this.referencePosition = new ht()), (this.nearDistance = 1), (this.farDistance = 1e3), (this.map = null), (this.alphaMap = null), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.fog = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), this.referencePosition.copy(t.referencePosition), (this.nearDistance = t.nearDistance), (this.farDistance = t.farDistance), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), this;
}
}
us.prototype.isMeshDistanceMaterial = !0;
function ds(t, e, n) {
let i = new Rn();
const r = new $(),
s = new $(),
a = new st(),
o = new cs({ depthPacking: 3201 }),
l = new us(),
h = {},
c = n.maxTextureSize,
u = { 0: 1, 1: 0, 2: 2 },
p = new vn({ defines: { VSM_SAMPLES: 8 }, uniforms: { shadow_pass: { value: null }, resolution: { value: new $() }, radius: { value: 4 } }, vertexShader: "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}", fragmentShader: "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}" }),
m = p.clone();
m.defines.HORIZONTAL_PASS = 1;
const g = new qe();
g.setAttribute("position", new ze(new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), 3));
const v = new un(g, p),
x = this;
function y(n, i) {
const r = e.update(v);
p.defines.VSM_SAMPLES !== n.blurSamples && ((p.defines.VSM_SAMPLES = n.blurSamples), (m.defines.VSM_SAMPLES = n.blurSamples), (p.needsUpdate = !0), (m.needsUpdate = !0)), (p.uniforms.shadow_pass.value = n.map.texture), (p.uniforms.resolution.value = n.mapSize), (p.uniforms.radius.value = n.radius), t.setRenderTarget(n.mapPass), t.clear(), t.renderBufferDirect(i, null, r, p, v, null), (m.uniforms.shadow_pass.value = n.mapPass.texture), (m.uniforms.resolution.value = n.mapSize), (m.uniforms.radius.value = n.radius), t.setRenderTarget(n.map), t.clear(), t.renderBufferDirect(i, null, r, m, v, null);
}
function _(e, n, i, r, s, a, c) {
let d = null;
const p = !0 === r.isPointLight ? e.customDistanceMaterial : e.customDepthMaterial;
if (((d = void 0 !== p ? p : !0 === r.isPointLight ? l : o), (t.localClippingEnabled && !0 === i.clipShadows && 0 !== i.clippingPlanes.length) || (i.displacementMap && 0 !== i.displacementScale) || (i.alphaMap && i.alphaTest > 0))) {
const t = d.uuid,
e = i.uuid;
let n = h[t];
void 0 === n && ((n = {}), (h[t] = n));
let r = n[e];
void 0 === r && ((r = d.clone()), (n[e] = r)), (d = r);
}
return (d.visible = i.visible), (d.wireframe = i.wireframe), (d.side = 3 === c ? (null !== i.shadowSide ? i.shadowSide : i.side) : null !== i.shadowSide ? i.shadowSide : u[i.side]), (d.alphaMap = i.alphaMap), (d.alphaTest = i.alphaTest), (d.clipShadows = i.clipShadows), (d.clippingPlanes = i.clippingPlanes), (d.clipIntersection = i.clipIntersection), (d.displacementMap = i.displacementMap), (d.displacementScale = i.displacementScale), (d.displacementBias = i.displacementBias), (d.wireframeLinewidth = i.wireframeLinewidth), (d.linewidth = i.linewidth), !0 === r.isPointLight && !0 === d.isMeshDistanceMaterial && (d.referencePosition.setFromMatrixPosition(r.matrixWorld), (d.nearDistance = s), (d.farDistance = a)), d;
}
function b(n, r, s, a, o) {
if (!1 === n.visible) return;
if (n.layers.test(r.layers) && (n.isMesh || n.isLine || n.isPoints) && (n.castShadow || (n.receiveShadow && 3 === o)) && (!n.frustumCulled || i.intersectsObject(n))) {
n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse, n.matrixWorld);
const i = e.update(n),
r = n.material;
if (Array.isArray(r)) {
const e = i.groups;
for (let l = 0, h = e.length; l < h; l++) {
const h = e[l],
c = r[h.materialIndex];
if (c && c.visible) {
const e = _(n, 0, c, a, s.near, s.far, o);
t.renderBufferDirect(s, null, i, e, n, h);
}
}
} else if (r.visible) {
const e = _(n, 0, r, a, s.near, s.far, o);
t.renderBufferDirect(s, null, i, e, n, null);
}
}
const l = n.children;
for (let t = 0, e = l.length; t < e; t++) b(l[t], r, s, a, o);
}
(this.enabled = !1),
(this.autoUpdate = !0),
(this.needsUpdate = !1),
(this.type = 1),
(this.render = function (e, n, o) {
if (!1 === x.enabled) return;
if (!1 === x.autoUpdate && !1 === x.needsUpdate) return;
if (0 === e.length) return;
const l = t.getRenderTarget(),
h = t.getActiveCubeFace(),
u = t.getActiveMipmapLevel(),
p = t.state;
p.setBlending(0), p.buffers.color.setClear(1, 1, 1, 1), p.buffers.depth.setTest(!0), p.setScissorTest(!1);
for (let l = 0, h = e.length; l < h; l++) {
const h = e[l],
u = h.shadow;
if (void 0 === u) {
console.warn("THREE.WebGLShadowMap:", h, "has no shadow.");
continue;
}
if (!1 === u.autoUpdate && !1 === u.needsUpdate) continue;
r.copy(u.mapSize);
const m = u.getFrameExtents();
if ((r.multiply(m), s.copy(u.mapSize), (r.x > c || r.y > c) && (r.x > c && ((s.x = Math.floor(c / m.x)), (r.x = s.x * m.x), (u.mapSize.x = s.x)), r.y > c && ((s.y = Math.floor(c / m.y)), (r.y = s.y * m.y), (u.mapSize.y = s.y))), null === u.map && !u.isPointLightShadow && 3 === this.type)) {
const t = { minFilter: f, magFilter: f, format: S };
(u.map = new at(r.x, r.y, t)), (u.map.texture.name = h.name + ".shadowMap"), (u.mapPass = new at(r.x, r.y, t)), u.camera.updateProjectionMatrix();
}
if (null === u.map) {
const t = { minFilter: d, magFilter: d, format: S };
(u.map = new at(r.x, r.y, t)), (u.map.texture.name = h.name + ".shadowMap"), u.camera.updateProjectionMatrix();
}
t.setRenderTarget(u.map), t.clear();
const g = u.getViewportCount();
for (let t = 0; t < g; t++) {
const e = u.getViewport(t);
a.set(s.x * e.x, s.y * e.y, s.x * e.z, s.y * e.w), p.viewport(a), u.updateMatrices(h, t), (i = u.getFrustum()), b(n, o, u.camera, h, this.type);
}
u.isPointLightShadow || 3 !== this.type || y(u, o), (u.needsUpdate = !1);
}
(x.needsUpdate = !1), t.setRenderTarget(l, h, u);
});
}
function ps(t, e, i) {
const r = i.isWebGL2;
const s = new (function () {
let e = !1;
const n = new st();
let i = null;
const r = new st(0, 0, 0, 0);
return {
setMask: function (n) {
i === n || e || (t.colorMask(n, n, n, n), (i = n));
},
setLocked: function (t) {
e = t;
},
setClear: function (e, i, s, a, o) {
!0 === o && ((e *= a), (i *= a), (s *= a)), n.set(e, i, s, a), !1 === r.equals(n) && (t.clearColor(e, i, s, a), r.copy(n));
},
reset: function () {
(e = !1), (i = null), r.set(-1, 0, 0, 0);
},
};
})(),
a = new (function () {
let e = !1,
n = null,
i = null,
r = null;
return {
setTest: function (t) {
t ? F(2929) : B(2929);
},
setMask: function (i) {
n === i || e || (t.depthMask(i), (n = i));
},
setFunc: function (e) {
if (i !== e) {
if (e)
switch (e) {
case 0:
t.depthFunc(512);
break;
case 1:
t.depthFunc(519);
break;
case 2:
t.depthFunc(513);
break;
case 3:
default:
t.depthFunc(515);
break;
case 4:
t.depthFunc(514);
break;
case 5:
t.depthFunc(518);
break;
case 6:
t.depthFunc(516);
break;
case 7:
t.depthFunc(517);
}
else t.depthFunc(515);
i = e;
}
},
setLocked: function (t) {
e = t;
},
setClear: function (e) {
r !== e && (t.clearDepth(e), (r = e));
},
reset: function () {
(e = !1), (n = null), (i = null), (r = null);
},
};
})(),
o = new (function () {
let e = !1,
n = null,
i = null,
r = null,
s = null,
a = null,
o = null,
l = null,
h = null;
return {
setTest: function (t) {
e || (t ? F(2960) : B(2960));
},
setMask: function (i) {
n === i || e || (t.stencilMask(i), (n = i));
},
setFunc: function (e, n, a) {
(i === e && r === n && s === a) || (t.stencilFunc(e, n, a), (i = e), (r = n), (s = a));
},
setOp: function (e, n, i) {
(a === e && o === n && l === i) || (t.stencilOp(e, n, i), (a = e), (o = n), (l = i));
},
setLocked: function (t) {
e = t;
},
setClear: function (e) {
h !== e && (t.clearStencil(e), (h = e));
},
reset: function () {
(e = !1), (n = null), (i = null), (r = null), (s = null), (a = null), (o = null), (l = null), (h = null);
},
};
})();
let l = {},
h = {},
c = null,
u = !1,
d = null,
p = null,
m = null,
f = null,
g = null,
v = null,
x = null,
y = !1,
_ = null,
b = null,
w = null,
M = null,
S = null;
const E = t.getParameter(35661);
let T = !1,
A = 0;
const L = t.getParameter(7938);
-1 !== L.indexOf("WebGL") ? ((A = parseFloat(/^WebGL (\d)/.exec(L)[1])), (T = A >= 1)) : -1 !== L.indexOf("OpenGL ES") && ((A = parseFloat(/^OpenGL ES (\d)/.exec(L)[1])), (T = A >= 2));
let C = null,
R = {};
const P = t.getParameter(3088),
D = t.getParameter(2978),
I = new st().fromArray(P),
N = new st().fromArray(D);
function z(e, n, i) {
const r = new Uint8Array(4),
s = t.createTexture();
t.bindTexture(e, s), t.texParameteri(e, 10241, 9728), t.texParameteri(e, 10240, 9728);
for (let e = 0; e < i; e++) t.texImage2D(n + e, 0, 6408, 1, 1, 0, 6408, 5121, r);
return s;
}
const O = {};
function F(e) {
!0 !== l[e] && (t.enable(e), (l[e] = !0));
}
function B(e) {
!1 !== l[e] && (t.disable(e), (l[e] = !1));
}
(O[3553] = z(3553, 3553, 1)), (O[34067] = z(34067, 34069, 6)), s.setClear(0, 0, 0, 1), a.setClear(1), o.setClear(0), F(2929), a.setFunc(3), k(!1), G(1), F(2884), V(0);
const U = { [n]: 32774, 101: 32778, 102: 32779 };
if (r) (U[103] = 32775), (U[104] = 32776);
else {
const t = e.get("EXT_blend_minmax");
null !== t && ((U[103] = t.MIN_EXT), (U[104] = t.MAX_EXT));
}
const H = { 200: 0, 201: 1, 202: 768, 204: 770, 210: 776, 208: 774, 206: 772, 203: 769, 205: 771, 209: 775, 207: 773 };
function V(e, i, r, s, a, o, l, h) {
if (0 !== e) {
if ((!1 === u && (F(3042), (u = !0)), 5 === e)) (a = a || i), (o = o || r), (l = l || s), (i === p && a === g) || (t.blendEquationSeparate(U[i], U[a]), (p = i), (g = a)), (r === m && s === f && o === v && l === x) || (t.blendFuncSeparate(H[r], H[s], H[o], H[l]), (m = r), (f = s), (v = o), (x = l)), (d = e), (y = null);
else if (e !== d || h !== y) {
if (((p === n && g === n) || (t.blendEquation(32774), (p = n), (g = n)), h))
switch (e) {
case 1:
t.blendFuncSeparate(1, 771, 1, 771);
break;
case 2:
t.blendFunc(1, 1);
break;
case 3:
t.blendFuncSeparate(0, 0, 769, 771);
break;
case 4:
t.blendFuncSeparate(0, 768, 0, 770);
break;
default:
console.error("THREE.WebGLState: Invalid blending: ", e);
}
else
switch (e) {
case 1:
t.blendFuncSeparate(770, 771, 1, 771);
break;
case 2:
t.blendFunc(770, 1);
break;
case 3:
t.blendFunc(0, 769);
break;
case 4:
t.blendFunc(0, 768);
break;
default:
console.error("THREE.WebGLState: Invalid blending: ", e);
}
(m = null), (f = null), (v = null), (x = null), (d = e), (y = h);
}
} else !0 === u && (B(3042), (u = !1));
}
function k(e) {
_ !== e && (e ? t.frontFace(2304) : t.frontFace(2305), (_ = e));
}
function G(e) {
0 !== e ? (F(2884), e !== b && (1 === e ? t.cullFace(1029) : 2 === e ? t.cullFace(1028) : t.cullFace(1032))) : B(2884), (b = e);
}
function W(e, n, i) {
e ? (F(32823), (M === n && S === i) || (t.polygonOffset(n, i), (M = n), (S = i))) : B(32823);
}
function j(e) {
void 0 === e && (e = 33984 + E - 1), C !== e && (t.activeTexture(e), (C = e));
}
return {
buffers: { color: s, depth: a, stencil: o },
enable: F,
disable: B,
bindFramebuffer: function (e, n) {
return h[e] !== n && (t.bindFramebuffer(e, n), (h[e] = n), r && (36009 === e && (h[36160] = n), 36160 === e && (h[36009] = n)), !0);
},
useProgram: function (e) {
return c !== e && (t.useProgram(e), (c = e), !0);
},
setBlending: V,
setMaterial: function (t, e) {
2 === t.side ? B(2884) : F(2884);
let n = 1 === t.side;
e && (n = !n), k(n), 1 === t.blending && !1 === t.transparent ? V(0) : V(t.blending, t.blendEquation, t.blendSrc, t.blendDst, t.blendEquationAlpha, t.blendSrcAlpha, t.blendDstAlpha, t.premultipliedAlpha), a.setFunc(t.depthFunc), a.setTest(t.depthTest), a.setMask(t.depthWrite), s.setMask(t.colorWrite);
const i = t.stencilWrite;
o.setTest(i), i && (o.setMask(t.stencilWriteMask), o.setFunc(t.stencilFunc, t.stencilRef, t.stencilFuncMask), o.setOp(t.stencilFail, t.stencilZFail, t.stencilZPass)), W(t.polygonOffset, t.polygonOffsetFactor, t.polygonOffsetUnits), !0 === t.alphaToCoverage ? F(32926) : B(32926);
},
setFlipSided: k,
setCullFace: G,
setLineWidth: function (e) {
e !== w && (T && t.lineWidth(e), (w = e));
},
setPolygonOffset: W,
setScissorTest: function (t) {
t ? F(3089) : B(3089);
},
activeTexture: j,
bindTexture: function (e, n) {
null === C && j();
let i = R[C];
void 0 === i && ((i = { type: void 0, texture: void 0 }), (R[C] = i)), (i.type === e && i.texture === n) || (t.bindTexture(e, n || O[e]), (i.type = e), (i.texture = n));
},
unbindTexture: function () {
const e = R[C];
void 0 !== e && void 0 !== e.type && (t.bindTexture(e.type, null), (e.type = void 0), (e.texture = void 0));
},
compressedTexImage2D: function () {
try {
t.compressedTexImage2D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texImage2D: function () {
try {
t.texImage2D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texImage3D: function () {
try {
t.texImage3D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texStorage2D: function () {
try {
t.texStorage2D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texStorage3D: function () {
try {
t.texStorage3D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texSubImage2D: function () {
try {
t.texSubImage2D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
texSubImage3D: function () {
try {
t.texSubImage3D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
compressedTexSubImage2D: function () {
try {
t.compressedTexSubImage2D.apply(t, arguments);
} catch (t) {
console.error("THREE.WebGLState:", t);
}
},
scissor: function (e) {
!1 === I.equals(e) && (t.scissor(e.x, e.y, e.z, e.w), I.copy(e));
},
viewport: function (e) {
!1 === N.equals(e) && (t.viewport(e.x, e.y, e.z, e.w), N.copy(e));
},
reset: function () {
t.disable(3042), t.disable(2884), t.disable(2929), t.disable(32823), t.disable(3089), t.disable(2960), t.disable(32926), t.blendEquation(32774), t.blendFunc(1, 0), t.blendFuncSeparate(1, 0, 1, 0), t.colorMask(!0, !0, !0, !0), t.clearColor(0, 0, 0, 0), t.depthMask(!0), t.depthFunc(513), t.clearDepth(1), t.stencilMask(4294967295), t.stencilFunc(519, 0, 4294967295), t.stencilOp(7680, 7680, 7680), t.clearStencil(0), t.cullFace(1029), t.frontFace(2305), t.polygonOffset(0, 0), t.activeTexture(33984), t.bindFramebuffer(36160, null), !0 === r && (t.bindFramebuffer(36009, null), t.bindFramebuffer(36008, null)), t.useProgram(null), t.lineWidth(1), t.scissor(0, 0, t.canvas.width, t.canvas.height), t.viewport(0, 0, t.canvas.width, t.canvas.height), (l = {}), (C = null), (R = {}), (h = {}), (c = null), (u = !1), (d = null), (p = null), (m = null), (f = null), (g = null), (v = null), (x = null), (y = !1), (_ = null), (b = null), (w = null), (M = null), (S = null), I.set(0, 0, t.canvas.width, t.canvas.height), N.set(0, 0, t.canvas.width, t.canvas.height), s.reset(), a.reset(), o.reset();
},
};
}
function ms(t, e, n, i, r, s, a) {
const o = r.isWebGL2,
l = r.maxTextures,
v = r.maxCubemapSize,
A = r.maxTextureSize,
L = r.maxSamples,
C = e.has("WEBGL_multisampled_render_to_texture") ? e.get("WEBGL_multisampled_render_to_texture") : void 0,
R = new WeakMap();
let P,
D = !1;
try {
D = "undefined" != typeof OffscreenCanvas && null !== new OffscreenCanvas(1, 1).getContext("2d");
} catch (t) {}
function I(t, e) {
return D ? new OffscreenCanvas(t, e) : K("canvas");
}
function N(t, e, n, i) {
let r = 1;
if (((t.width > i || t.height > i) && (r = i / Math.max(t.width, t.height)), r < 1 || !0 === e)) {
if (("undefined" != typeof HTMLImageElement && t instanceof HTMLImageElement) || ("undefined" != typeof HTMLCanvasElement && t instanceof HTMLCanvasElement) || ("undefined" != typeof ImageBitmap && t instanceof ImageBitmap)) {
const i = e ? J : Math.floor,
s = i(r * t.width),
a = i(r * t.height);
void 0 === P && (P = I(s, a));
const o = n ? I(s, a) : P;
(o.width = s), (o.height = a);
return o.getContext("2d").drawImage(t, 0, 0, s, a), console.warn("THREE.WebGLRenderer: Texture has been resized from (" + t.width + "x" + t.height + ") to (" + s + "x" + a + ")."), o;
}
return "data" in t && console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + t.width + "x" + t.height + ")."), t;
}
return t;
}
function O(t) {
return Y(t.width) && Y(t.height);
}
function F(t, e) {
return t.generateMipmaps && e && t.minFilter !== d && t.minFilter !== f;
}
function B(e) {
t.generateMipmap(e);
}
function U(n, i, r, s) {
if (!1 === o) return i;
if (null !== n) {
if (void 0 !== t[n]) return t[n];
console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '" + n + "'");
}
let a = i;
return 6403 === i && (5126 === r && (a = 33326), 5131 === r && (a = 33325), 5121 === r && (a = 33321)), 6407 === i && (5126 === r && (a = 34837), 5131 === r && (a = 34843), 5121 === r && (a = 32849)), 6408 === i && (5126 === r && (a = 34836), 5131 === r && (a = 34842), 5121 === r && (a = s === z ? 35907 : 32856)), (33325 !== a && 33326 !== a && 34842 !== a && 34836 !== a) || e.get("EXT_color_buffer_float"), a;
}
function H(t, e, n) {
return !0 === F(t, n) || (t.isFramebufferTexture && t.minFilter !== d && t.minFilter !== f) ? Math.log2(Math.max(e.width, e.height)) + 1 : void 0 !== t.mipmaps && t.mipmaps.length > 0 ? t.mipmaps.length : t.isCompressedTexture && Array.isArray(t.image) ? e.mipmaps.length : 1;
}
function V(t) {
return t === d || t === p || t === m ? 9728 : 9729;
}
function k(e) {
const n = e.target;
n.removeEventListener("dispose", k),
(function (e) {
const n = i.get(e);
if (void 0 === n.__webglInit) return;
t.deleteTexture(n.__webglTexture), i.remove(e);
})(n),
n.isVideoTexture && R.delete(n),
a.memory.textures--;
}
function G(e) {
const n = e.target;
n.removeEventListener("dispose", G),
(function (e) {
const n = e.texture,
r = i.get(e),
s = i.get(n);
if (!e) return;
void 0 !== s.__webglTexture && (t.deleteTexture(s.__webglTexture), a.memory.textures--);
e.depthTexture && e.depthTexture.dispose();
if (e.isWebGLCubeRenderTarget) for (let e = 0; e < 6; e++) t.deleteFramebuffer(r.__webglFramebuffer[e]), r.__webglDepthbuffer && t.deleteRenderbuffer(r.__webglDepthbuffer[e]);
else t.deleteFramebuffer(r.__webglFramebuffer), r.__webglDepthbuffer && t.deleteRenderbuffer(r.__webglDepthbuffer), r.__webglMultisampledFramebuffer && t.deleteFramebuffer(r.__webglMultisampledFramebuffer), r.__webglColorRenderbuffer && t.deleteRenderbuffer(r.__webglColorRenderbuffer), r.__webglDepthRenderbuffer && t.deleteRenderbuffer(r.__webglDepthRenderbuffer);
if (e.isWebGLMultipleRenderTargets)
for (let e = 0, r = n.length; e < r; e++) {
const r = i.get(n[e]);
r.__webglTexture && (t.deleteTexture(r.__webglTexture), a.memory.textures--), i.remove(n[e]);
}
i.remove(n), i.remove(e);
})(n);
}
let W = 0;
function j(t, e) {
const r = i.get(t);
if (
(t.isVideoTexture &&
(function (t) {
const e = a.render.frame;
R.get(t) !== e && (R.set(t, e), t.update());
})(t),
t.version > 0 && r.__version !== t.version)
) {
const n = t.image;
if (void 0 === n) console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");
else {
if (!1 !== n.complete) return void tt(r, t, e);
console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");
}
}
n.activeTexture(33984 + e), n.bindTexture(3553, r.__webglTexture);
}
function q(e, r) {
const a = i.get(e);
e.version > 0 && a.__version !== e.version
? (function (e, i, r) {
if (6 !== i.image.length) return;
Q(e, i), n.activeTexture(33984 + r), n.bindTexture(34067, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment), t.pixelStorei(37443, 0);
const a = i && (i.isCompressedTexture || i.image[0].isCompressedTexture),
l = i.image[0] && i.image[0].isDataTexture,
h = [];
for (let t = 0; t < 6; t++) h[t] = a || l ? (l ? i.image[t].image : i.image[t]) : N(i.image[t], !1, !0, v);
const c = h[0],
u = O(c) || o,
d = s.convert(i.format),
p = s.convert(i.type),
m = U(i.internalFormat, d, p, i.encoding),
f = o && !0 !== i.isVideoTexture,
g = void 0 === e.__version;
let x,
y = H(i, c, u);
if ((Z(34067, i, u), a)) {
f && g && n.texStorage2D(34067, y, m, c.width, c.height);
for (let t = 0; t < 6; t++) {
x = h[t].mipmaps;
for (let e = 0; e < x.length; e++) {
const r = x[e];
i.format !== S && i.format !== M ? (null !== d ? (f ? n.compressedTexSubImage2D(34069 + t, e, 0, 0, r.width, r.height, d, r.data) : n.compressedTexImage2D(34069 + t, e, m, r.width, r.height, 0, r.data)) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()")) : f ? n.texSubImage2D(34069 + t, e, 0, 0, r.width, r.height, d, p, r.data) : n.texImage2D(34069 + t, e, m, r.width, r.height, 0, d, p, r.data);
}
}
} else {
(x = i.mipmaps), f && g && (x.length > 0 && y++, n.texStorage2D(34067, y, m, h[0].width, h[0].height));
for (let t = 0; t < 6; t++)
if (l) {
f ? n.texSubImage2D(34069 + t, 0, 0, 0, h[t].width, h[t].height, d, p, h[t].data) : n.texImage2D(34069 + t, 0, m, h[t].width, h[t].height, 0, d, p, h[t].data);
for (let e = 0; e < x.length; e++) {
const i = x[e].image[t].image;
f ? n.texSubImage2D(34069 + t, e + 1, 0, 0, i.width, i.height, d, p, i.data) : n.texImage2D(34069 + t, e + 1, m, i.width, i.height, 0, d, p, i.data);
}
} else {
f ? n.texSubImage2D(34069 + t, 0, 0, 0, d, p, h[t]) : n.texImage2D(34069 + t, 0, m, d, p, h[t]);
for (let e = 0; e < x.length; e++) {
const i = x[e];
f ? n.texSubImage2D(34069 + t, e + 1, 0, 0, d, p, i.image[t]) : n.texImage2D(34069 + t, e + 1, m, d, p, i.image[t]);
}
}
}
F(i, u) && B(34067);
(e.__version = i.version), i.onUpdate && i.onUpdate(i);
})(a, e, r)
: (n.activeTexture(33984 + r), n.bindTexture(34067, a.__webglTexture));
}
const X = { [h]: 10497, [c]: 33071, [u]: 33648 },
$ = { [d]: 9728, [p]: 9984, [m]: 9986, [f]: 9729, 1007: 9985, [g]: 9987 };
function Z(n, s, a) {
if ((a ? (t.texParameteri(n, 10242, X[s.wrapS]), t.texParameteri(n, 10243, X[s.wrapT]), (32879 !== n && 35866 !== n) || t.texParameteri(n, 32882, X[s.wrapR]), t.texParameteri(n, 10240, $[s.magFilter]), t.texParameteri(n, 10241, $[s.minFilter])) : (t.texParameteri(n, 10242, 33071), t.texParameteri(n, 10243, 33071), (32879 !== n && 35866 !== n) || t.texParameteri(n, 32882, 33071), (s.wrapS === c && s.wrapT === c) || console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."), t.texParameteri(n, 10240, V(s.magFilter)), t.texParameteri(n, 10241, V(s.minFilter)), s.minFilter !== d && s.minFilter !== f && console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")), !0 === e.has("EXT_texture_filter_anisotropic"))) {
const a = e.get("EXT_texture_filter_anisotropic");
if (s.type === _ && !1 === e.has("OES_texture_float_linear")) return;
if (!1 === o && s.type === b && !1 === e.has("OES_texture_half_float_linear")) return;
(s.anisotropy > 1 || i.get(s).__currentAnisotropy) && (t.texParameterf(n, a.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(s.anisotropy, r.getMaxAnisotropy())), (i.get(s).__currentAnisotropy = s.anisotropy));
}
}
function Q(e, n) {
void 0 === e.__webglInit && ((e.__webglInit = !0), n.addEventListener("dispose", k), (e.__webglTexture = t.createTexture()), a.memory.textures++);
}
function tt(e, i, r) {
let a = 3553;
i.isDataTexture2DArray && (a = 35866), i.isDataTexture3D && (a = 32879), Q(e, i), n.activeTexture(33984 + r), n.bindTexture(a, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment), t.pixelStorei(37443, 0);
const l =
(function (t) {
return !o && (t.wrapS !== c || t.wrapT !== c || (t.minFilter !== d && t.minFilter !== f));
})(i) && !1 === O(i.image),
h = N(i.image, l, !1, A),
u = O(h) || o,
p = s.convert(i.format);
let m,
g = s.convert(i.type),
v = U(i.internalFormat, p, g, i.encoding);
Z(a, i, u);
const b = i.mipmaps,
L = o && !0 !== i.isVideoTexture,
C = void 0 === e.__version,
R = H(i, h, u);
if (i.isDepthTexture) (v = 6402), o ? (v = i.type === _ ? 36012 : i.type === y ? 33190 : i.type === w ? 35056 : 33189) : i.type === _ && console.error("WebGLRenderer: Floating point depth texture requires WebGL2."), i.format === E && 6402 === v && i.type !== x && i.type !== y && (console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."), (i.type = x), (g = s.convert(i.type))), i.format === T && 6402 === v && ((v = 34041), i.type !== w && (console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."), (i.type = w), (g = s.convert(i.type)))), L && C ? n.texStorage2D(3553, 1, v, h.width, h.height) : n.texImage2D(3553, 0, v, h.width, h.height, 0, p, g, null);
else if (i.isDataTexture)
if (b.length > 0 && u) {
L && C && n.texStorage2D(3553, R, v, b[0].width, b[0].height);
for (let t = 0, e = b.length; t < e; t++) (m = b[t]), L ? n.texSubImage2D(3553, 0, 0, 0, m.width, m.height, p, g, m.data) : n.texImage2D(3553, t, v, m.width, m.height, 0, p, g, m.data);
i.generateMipmaps = !1;
} else L ? (C && n.texStorage2D(3553, R, v, h.width, h.height), n.texSubImage2D(3553, 0, 0, 0, h.width, h.height, p, g, h.data)) : n.texImage2D(3553, 0, v, h.width, h.height, 0, p, g, h.data);
else if (i.isCompressedTexture) {
L && C && n.texStorage2D(3553, R, v, b[0].width, b[0].height);
for (let t = 0, e = b.length; t < e; t++) (m = b[t]), i.format !== S && i.format !== M ? (null !== p ? (L ? n.compressedTexSubImage2D(3553, t, 0, 0, m.width, m.height, p, m.data) : n.compressedTexImage2D(3553, t, v, m.width, m.height, 0, m.data)) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()")) : L ? n.texSubImage2D(3553, t, 0, 0, m.width, m.height, p, g, m.data) : n.texImage2D(3553, t, v, m.width, m.height, 0, p, g, m.data);
} else if (i.isDataTexture2DArray) L ? (C && n.texStorage3D(35866, R, v, h.width, h.height, h.depth), n.texSubImage3D(35866, 0, 0, 0, 0, h.width, h.height, h.depth, p, g, h.data)) : n.texImage3D(35866, 0, v, h.width, h.height, h.depth, 0, p, g, h.data);
else if (i.isDataTexture3D) L ? (C && n.texStorage3D(32879, R, v, h.width, h.height, h.depth), n.texSubImage3D(32879, 0, 0, 0, 0, h.width, h.height, h.depth, p, g, h.data)) : n.texImage3D(32879, 0, v, h.width, h.height, h.depth, 0, p, g, h.data);
else if (i.isFramebufferTexture) L && C ? n.texStorage2D(3553, R, v, h.width, h.height) : n.texImage2D(3553, 0, v, h.width, h.height, 0, p, g, null);
else if (b.length > 0 && u) {
L && C && n.texStorage2D(3553, R, v, b[0].width, b[0].height);
for (let t = 0, e = b.length; t < e; t++) (m = b[t]), L ? n.texSubImage2D(3553, t, 0, 0, p, g, m) : n.texImage2D(3553, t, v, p, g, m);
i.generateMipmaps = !1;
} else L ? (C && n.texStorage2D(3553, R, v, h.width, h.height), n.texSubImage2D(3553, 0, 0, 0, p, g, h)) : n.texImage2D(3553, 0, v, p, g, h);
F(i, u) && B(a), (e.__version = i.version), i.onUpdate && i.onUpdate(i);
}
function et(e, r, a, o, l) {
const h = s.convert(a.format),
c = s.convert(a.type),
u = U(a.internalFormat, h, c, a.encoding);
i.get(r).__hasExternalTextures || (32879 === l || 35866 === l ? n.texImage3D(l, 0, u, r.width, r.height, r.depth, 0, h, c, null) : n.texImage2D(l, 0, u, r.width, r.height, 0, h, c, null)), n.bindFramebuffer(36160, e), r.useRenderToTexture ? C.framebufferTexture2DMultisampleEXT(36160, o, l, i.get(a).__webglTexture, 0, rt(r)) : t.framebufferTexture2D(36160, o, l, i.get(a).__webglTexture, 0), n.bindFramebuffer(36160, null);
}
function nt(e, n, i) {
if ((t.bindRenderbuffer(36161, e), n.depthBuffer && !n.stencilBuffer)) {
let r = 33189;
if (i || n.useRenderToTexture) {
const e = n.depthTexture;
e && e.isDepthTexture && (e.type === _ ? (r = 36012) : e.type === y && (r = 33190));
const i = rt(n);
n.useRenderToTexture ? C.renderbufferStorageMultisampleEXT(36161, i, r, n.width, n.height) : t.renderbufferStorageMultisample(36161, i, r, n.width, n.height);
} else t.renderbufferStorage(36161, r, n.width, n.height);
t.framebufferRenderbuffer(36160, 36096, 36161, e);
} else if (n.depthBuffer && n.stencilBuffer) {
const r = rt(n);
i && n.useRenderbuffer ? t.renderbufferStorageMultisample(36161, r, 35056, n.width, n.height) : n.useRenderToTexture ? C.renderbufferStorageMultisampleEXT(36161, r, 35056, n.width, n.height) : t.renderbufferStorage(36161, 34041, n.width, n.height), t.framebufferRenderbuffer(36160, 33306, 36161, e);
} else {
const e = !0 === n.isWebGLMultipleRenderTargets ? n.texture[0] : n.texture,
r = s.convert(e.format),
a = s.convert(e.type),
o = U(e.internalFormat, r, a, e.encoding),
l = rt(n);
i && n.useRenderbuffer ? t.renderbufferStorageMultisample(36161, l, o, n.width, n.height) : n.useRenderToTexture ? C.renderbufferStorageMultisampleEXT(36161, l, o, n.width, n.height) : t.renderbufferStorage(36161, o, n.width, n.height);
}
t.bindRenderbuffer(36161, null);
}
function it(e) {
const r = i.get(e),
s = !0 === e.isWebGLCubeRenderTarget;
if (e.depthTexture && !r.__autoAllocateDepthBuffer) {
if (s) throw new Error("target.depthTexture not supported in Cube render targets");
!(function (e, r) {
if (r && r.isWebGLCubeRenderTarget) throw new Error("Depth Texture with cube render targets is not supported");
if ((n.bindFramebuffer(36160, e), !r.depthTexture || !r.depthTexture.isDepthTexture)) throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");
(i.get(r.depthTexture).__webglTexture && r.depthTexture.image.width === r.width && r.depthTexture.image.height === r.height) || ((r.depthTexture.image.width = r.width), (r.depthTexture.image.height = r.height), (r.depthTexture.needsUpdate = !0)), j(r.depthTexture, 0);
const s = i.get(r.depthTexture).__webglTexture,
a = rt(r);
if (r.depthTexture.format === E) r.useRenderToTexture ? C.framebufferTexture2DMultisampleEXT(36160, 36096, 3553, s, 0, a) : t.framebufferTexture2D(36160, 36096, 3553, s, 0);
else {
if (r.depthTexture.format !== T) throw new Error("Unknown depthTexture format");
r.useRenderToTexture ? C.framebufferTexture2DMultisampleEXT(36160, 33306, 3553, s, 0, a) : t.framebufferTexture2D(36160, 33306, 3553, s, 0);
}
})(r.__webglFramebuffer, e);
} else if (s) {
r.__webglDepthbuffer = [];
for (let i = 0; i < 6; i++) n.bindFramebuffer(36160, r.__webglFramebuffer[i]), (r.__webglDepthbuffer[i] = t.createRenderbuffer()), nt(r.__webglDepthbuffer[i], e, !1);
} else n.bindFramebuffer(36160, r.__webglFramebuffer), (r.__webglDepthbuffer = t.createRenderbuffer()), nt(r.__webglDepthbuffer, e, !1);
n.bindFramebuffer(36160, null);
}
function rt(t) {
return o && (t.useRenderbuffer || t.useRenderToTexture) ? Math.min(L, t.samples) : 0;
}
let st = !1,
at = !1;
(this.allocateTextureUnit = function () {
const t = W;
return t >= l && console.warn("THREE.WebGLTextures: Trying to use " + t + " texture units while this GPU supports only " + l), (W += 1), t;
}),
(this.resetTextureUnits = function () {
W = 0;
}),
(this.setTexture2D = j),
(this.setTexture2DArray = function (t, e) {
const r = i.get(t);
t.version > 0 && r.__version !== t.version ? tt(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(35866, r.__webglTexture));
}),
(this.setTexture3D = function (t, e) {
const r = i.get(t);
t.version > 0 && r.__version !== t.version ? tt(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(32879, r.__webglTexture));
}),
(this.setTextureCube = q),
(this.rebindTextures = function (t, e, n) {
const r = i.get(t);
void 0 !== e && et(r.__webglFramebuffer, t, t.texture, 36064, 3553), void 0 !== n && it(t);
}),
(this.setupRenderTarget = function (e) {
const l = e.texture,
h = i.get(e),
c = i.get(l);
e.addEventListener("dispose", G), !0 !== e.isWebGLMultipleRenderTargets && (void 0 === c.__webglTexture && (c.__webglTexture = t.createTexture()), (c.__version = l.version), a.memory.textures++);
const u = !0 === e.isWebGLCubeRenderTarget,
d = !0 === e.isWebGLMultipleRenderTargets,
p = l.isDataTexture3D || l.isDataTexture2DArray,
m = O(e) || o;
if ((!o || l.format !== M || (l.type !== _ && l.type !== b) || ((l.format = S), console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")), u)) {
h.__webglFramebuffer = [];
for (let e = 0; e < 6; e++) h.__webglFramebuffer[e] = t.createFramebuffer();
} else if (((h.__webglFramebuffer = t.createFramebuffer()), d))
if (r.drawBuffers) {
const n = e.texture;
for (let e = 0, r = n.length; e < r; e++) {
const r = i.get(n[e]);
void 0 === r.__webglTexture && ((r.__webglTexture = t.createTexture()), a.memory.textures++);
}
} else console.warn("THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.");
else if (e.useRenderbuffer)
if (o) {
(h.__webglMultisampledFramebuffer = t.createFramebuffer()), (h.__webglColorRenderbuffer = t.createRenderbuffer()), t.bindRenderbuffer(36161, h.__webglColorRenderbuffer);
const i = s.convert(l.format),
r = s.convert(l.type),
a = U(l.internalFormat, i, r, l.encoding),
o = rt(e);
t.renderbufferStorageMultisample(36161, o, a, e.width, e.height), n.bindFramebuffer(36160, h.__webglMultisampledFramebuffer), t.framebufferRenderbuffer(36160, 36064, 36161, h.__webglColorRenderbuffer), t.bindRenderbuffer(36161, null), e.depthBuffer && ((h.__webglDepthRenderbuffer = t.createRenderbuffer()), nt(h.__webglDepthRenderbuffer, e, !0)), n.bindFramebuffer(36160, null);
} else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
if (u) {
n.bindTexture(34067, c.__webglTexture), Z(34067, l, m);
for (let t = 0; t < 6; t++) et(h.__webglFramebuffer[t], e, l, 36064, 34069 + t);
F(l, m) && B(34067), n.unbindTexture();
} else if (d) {
const t = e.texture;
for (let r = 0, s = t.length; r < s; r++) {
const s = t[r],
a = i.get(s);
n.bindTexture(3553, a.__webglTexture), Z(3553, s, m), et(h.__webglFramebuffer, e, s, 36064 + r, 3553), F(s, m) && B(3553);
}
n.unbindTexture();
} else {
let t = 3553;
if (p)
if (o) {
t = l.isDataTexture3D ? 32879 : 35866;
} else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");
n.bindTexture(t, c.__webglTexture), Z(t, l, m), et(h.__webglFramebuffer, e, l, 36064, t), F(l, m) && B(t), n.unbindTexture();
}
e.depthBuffer && it(e);
}),
(this.updateRenderTargetMipmap = function (t) {
const e = O(t) || o,
r = !0 === t.isWebGLMultipleRenderTargets ? t.texture : [t.texture];
for (let s = 0, a = r.length; s < a; s++) {
const a = r[s];
if (F(a, e)) {
const e = t.isWebGLCubeRenderTarget ? 34067 : 3553,
r = i.get(a).__webglTexture;
n.bindTexture(e, r), B(e), n.unbindTexture();
}
}
}),
(this.updateMultisampleRenderTarget = function (e) {
if (e.useRenderbuffer)
if (o) {
const r = e.width,
s = e.height;
let a = 16384;
const o = [36064],
l = e.stencilBuffer ? 33306 : 36096;
e.depthBuffer && o.push(l), e.ignoreDepthForMultisampleCopy || (e.depthBuffer && (a |= 256), e.stencilBuffer && (a |= 1024));
const h = i.get(e);
n.bindFramebuffer(36008, h.__webglMultisampledFramebuffer), n.bindFramebuffer(36009, h.__webglFramebuffer), e.ignoreDepthForMultisampleCopy && (t.invalidateFramebuffer(36008, [l]), t.invalidateFramebuffer(36009, [l])), t.blitFramebuffer(0, 0, r, s, 0, 0, r, s, a, 9728), t.invalidateFramebuffer(36008, o), n.bindFramebuffer(36008, null), n.bindFramebuffer(36009, h.__webglMultisampledFramebuffer);
} else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
}),
(this.setupDepthRenderbuffer = it),
(this.setupFrameBufferTexture = et),
(this.safeSetTexture2D = function (t, e) {
t && t.isWebGLRenderTarget && (!1 === st && (console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."), (st = !0)), (t = t.texture)), j(t, e);
}),
(this.safeSetTextureCube = function (t, e) {
t && t.isWebGLCubeRenderTarget && (!1 === at && (console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."), (at = !0)), (t = t.texture)), q(t, e);
});
}
function fs(t, e, n) {
const i = n.isWebGL2;
return {
convert: function (t) {
let n;
if (t === v) return 5121;
if (1017 === t) return 32819;
if (1018 === t) return 32820;
if (1019 === t) return 33635;
if (1010 === t) return 5120;
if (1011 === t) return 5122;
if (t === x) return 5123;
if (1013 === t) return 5124;
if (t === y) return 5125;
if (t === _) return 5126;
if (t === b) return i ? 5131 : ((n = e.get("OES_texture_half_float")), null !== n ? n.HALF_FLOAT_OES : null);
if (1021 === t) return 6406;
if (t === M) return 6407;
if (t === S) return 6408;
if (1024 === t) return 6409;
if (1025 === t) return 6410;
if (t === E) return 6402;
if (t === T) return 34041;
if (1028 === t) return 6403;
if (1029 === t) return 36244;
if (1030 === t) return 33319;
if (1031 === t) return 33320;
if (1032 === t) return 36248;
if (1033 === t) return 36249;
if (33776 === t || 33777 === t || 33778 === t || 33779 === t) {
if (((n = e.get("WEBGL_compressed_texture_s3tc")), null === n)) return null;
if (33776 === t) return n.COMPRESSED_RGB_S3TC_DXT1_EXT;
if (33777 === t) return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;
if (33778 === t) return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;
if (33779 === t) return n.COMPRESSED_RGBA_S3TC_DXT5_EXT;
}
if (35840 === t || 35841 === t || 35842 === t || 35843 === t) {
if (((n = e.get("WEBGL_compressed_texture_pvrtc")), null === n)) return null;
if (35840 === t) return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
if (35841 === t) return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
if (35842 === t) return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
if (35843 === t) return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
}
if (36196 === t) return (n = e.get("WEBGL_compressed_texture_etc1")), null !== n ? n.COMPRESSED_RGB_ETC1_WEBGL : null;
if ((37492 === t || 37496 === t) && ((n = e.get("WEBGL_compressed_texture_etc")), null !== n)) {
if (37492 === t) return n.COMPRESSED_RGB8_ETC2;
if (37496 === t) return n.COMPRESSED_RGBA8_ETC2_EAC;
}
return 37808 === t || 37809 === t || 37810 === t || 37811 === t || 37812 === t || 37813 === t || 37814 === t || 37815 === t || 37816 === t || 37817 === t || 37818 === t || 37819 === t || 37820 === t || 37821 === t || 37840 === t || 37841 === t || 37842 === t || 37843 === t || 37844 === t || 37845 === t || 37846 === t || 37847 === t || 37848 === t || 37849 === t || 37850 === t || 37851 === t || 37852 === t || 37853 === t ? ((n = e.get("WEBGL_compressed_texture_astc")), null !== n ? t : null) : 36492 === t ? ((n = e.get("EXT_texture_compression_bptc")), null !== n ? t : null) : t === w ? (i ? 34042 : ((n = e.get("WEBGL_depth_texture")), null !== n ? n.UNSIGNED_INT_24_8_WEBGL : null)) : void 0;
},
};
}
class gs extends yn {
constructor(t = []) {
super(), (this.cameras = t);
}
}
gs.prototype.isArrayCamera = !0;
class vs extends ue {
constructor() {
super(), (this.type = "Group");
}
}
vs.prototype.isGroup = !0;
const xs = { type: "move" };
class ys {
constructor() {
(this._targetRay = null), (this._grip = null), (this._hand = null);
}
getHandSpace() {
return null === this._hand && ((this._hand = new vs()), (this._hand.matrixAutoUpdate = !1), (this._hand.visible = !1), (this._hand.joints = {}), (this._hand.inputState = { pinching: !1 })), this._hand;
}
getTargetRaySpace() {
return null === this._targetRay && ((this._targetRay = new vs()), (this._targetRay.matrixAutoUpdate = !1), (this._targetRay.visible = !1), (this._targetRay.hasLinearVelocity = !1), (this._targetRay.linearVelocity = new ht()), (this._targetRay.hasAngularVelocity = !1), (this._targetRay.angularVelocity = new ht())), this._targetRay;
}
getGripSpace() {
return null === this._grip && ((this._grip = new vs()), (this._grip.matrixAutoUpdate = !1), (this._grip.visible = !1), (this._grip.hasLinearVelocity = !1), (this._grip.linearVelocity = new ht()), (this._grip.hasAngularVelocity = !1), (this._grip.angularVelocity = new ht())), this._grip;
}
dispatchEvent(t) {
return null !== this._targetRay && this._targetRay.dispatchEvent(t), null !== this._grip && this._grip.dispatchEvent(t), null !== this._hand && this._hand.dispatchEvent(t), this;
}
disconnect(t) {
return this.dispatchEvent({ type: "disconnected", data: t }), null !== this._targetRay && (this._targetRay.visible = !1), null !== this._grip && (this._grip.visible = !1), null !== this._hand && (this._hand.visible = !1), this;
}
update(t, e, n) {
let i = null,
r = null,
s = null;
const a = this._targetRay,
o = this._grip,
l = this._hand;
if (t && "visible-blurred" !== e.session.visibilityState)
if ((null !== a && ((i = e.getPose(t.targetRaySpace, n)), null !== i && (a.matrix.fromArray(i.transform.matrix), a.matrix.decompose(a.position, a.rotation, a.scale), i.linearVelocity ? ((a.hasLinearVelocity = !0), a.linearVelocity.copy(i.linearVelocity)) : (a.hasLinearVelocity = !1), i.angularVelocity ? ((a.hasAngularVelocity = !0), a.angularVelocity.copy(i.angularVelocity)) : (a.hasAngularVelocity = !1), this.dispatchEvent(xs))), l && t.hand)) {
s = !0;
for (const i of t.hand.values()) {
const t = e.getJointPose(i, n);
if (void 0 === l.joints[i.jointName]) {
const t = new vs();
(t.matrixAutoUpdate = !1), (t.visible = !1), (l.joints[i.jointName] = t), l.add(t);
}
const r = l.joints[i.jointName];
null !== t && (r.matrix.fromArray(t.transform.matrix), r.matrix.decompose(r.position, r.rotation, r.scale), (r.jointRadius = t.radius)), (r.visible = null !== t);
}
const i = l.joints["index-finger-tip"],
r = l.joints["thumb-tip"],
a = i.position.distanceTo(r.position),
o = 0.02,
h = 0.005;
l.inputState.pinching && a > o + h ? ((l.inputState.pinching = !1), this.dispatchEvent({ type: "pinchend", handedness: t.handedness, target: this })) : !l.inputState.pinching && a <= o - h && ((l.inputState.pinching = !0), this.dispatchEvent({ type: "pinchstart", handedness: t.handedness, target: this }));
} else null !== o && t.gripSpace && ((r = e.getPose(t.gripSpace, n)), null !== r && (o.matrix.fromArray(r.transform.matrix), o.matrix.decompose(o.position, o.rotation, o.scale), r.linearVelocity ? ((o.hasLinearVelocity = !0), o.linearVelocity.copy(r.linearVelocity)) : (o.hasLinearVelocity = !1), r.angularVelocity ? ((o.hasAngularVelocity = !0), o.angularVelocity.copy(r.angularVelocity)) : (o.hasAngularVelocity = !1)));
return null !== a && (a.visible = null !== i), null !== o && (o.visible = null !== r), null !== l && (l.visible = null !== s), this;
}
}
class _s extends it {
constructor(t, e, n, i, r, s, a, o, l, h) {
if ((h = void 0 !== h ? h : E) !== E && h !== T) throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");
void 0 === n && h === E && (n = x), void 0 === n && h === T && (n = w), super(null, i, r, s, a, o, h, n, l), (this.image = { width: t, height: e }), (this.magFilter = void 0 !== a ? a : d), (this.minFilter = void 0 !== o ? o : d), (this.flipY = !1), (this.generateMipmaps = !1);
}
}
_s.prototype.isDepthTexture = !0;
class bs extends H {
constructor(t, e) {
super();
const n = this;
let i = null,
r = 1,
s = null,
a = "local-floor";
const o = t.extensions.has("WEBGL_multisampled_render_to_texture");
let l = null,
h = null,
c = null,
u = null,
d = !1,
p = null;
const m = e.getContextAttributes();
let f = null,
g = null;
const y = [],
_ = new Map(),
b = new yn();
b.layers.enable(1), (b.viewport = new st());
const A = new yn();
A.layers.enable(2), (A.viewport = new st());
const L = [b, A],
C = new gs();
C.layers.enable(1), C.layers.enable(2);
let R = null,
P = null;
function D(t) {
const e = _.get(t.inputSource);
e && e.dispatchEvent({ type: t.type, data: t.inputSource });
}
function I() {
_.forEach(function (t, e) {
t.disconnect(e);
}),
_.clear(),
(R = null),
(P = null),
t.setRenderTarget(f),
(u = null),
(c = null),
(h = null),
(i = null),
(g = null),
U.stop(),
(n.isPresenting = !1),
n.dispatchEvent({ type: "sessionend" });
}
function N(t) {
const e = i.inputSources;
for (let t = 0; t < y.length; t++) _.set(e[t], y[t]);
for (let e = 0; e < t.removed.length; e++) {
const n = t.removed[e],
i = _.get(n);
i && (i.dispatchEvent({ type: "disconnected", data: n }), _.delete(n));
}
for (let e = 0; e < t.added.length; e++) {
const n = t.added[e],
i = _.get(n);
i && i.dispatchEvent({ type: "connected", data: n });
}
}
(this.cameraAutoUpdate = !0),
(this.enabled = !1),
(this.isPresenting = !1),
(this.getController = function (t) {
let e = y[t];
return void 0 === e && ((e = new ys()), (y[t] = e)), e.getTargetRaySpace();
}),
(this.getControllerGrip = function (t) {
let e = y[t];
return void 0 === e && ((e = new ys()), (y[t] = e)), e.getGripSpace();
}),
(this.getHand = function (t) {
let e = y[t];
return void 0 === e && ((e = new ys()), (y[t] = e)), e.getHandSpace();
}),
(this.setFramebufferScaleFactor = function (t) {
(r = t), !0 === n.isPresenting && console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.");
}),
(this.setReferenceSpaceType = function (t) {
(a = t), !0 === n.isPresenting && console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.");
}),
(this.getReferenceSpace = function () {
return s;
}),
(this.getBaseLayer = function () {
return null !== c ? c : u;
}),
(this.getBinding = function () {
return h;
}),
(this.getFrame = function () {
return p;
}),
(this.getSession = function () {
return i;
}),
(this.setSession = async function (l) {
if (((i = l), null !== i)) {
if (((f = t.getRenderTarget()), i.addEventListener("select", D), i.addEventListener("selectstart", D), i.addEventListener("selectend", D), i.addEventListener("squeeze", D), i.addEventListener("squeezestart", D), i.addEventListener("squeezeend", D), i.addEventListener("end", I), i.addEventListener("inputsourceschange", N), !0 !== m.xrCompatible && (await e.makeXRCompatible()), void 0 === i.renderState.layers || !1 === t.capabilities.isWebGL2)) {
const n = { antialias: void 0 !== i.renderState.layers || m.antialias, alpha: m.alpha, depth: m.depth, stencil: m.stencil, framebufferScaleFactor: r };
(u = new XRWebGLLayer(i, e, n)), i.updateRenderState({ baseLayer: u }), (g = new at(u.framebufferWidth, u.framebufferHeight, { format: S, type: v, encoding: t.outputEncoding }));
} else {
d = m.antialias;
let n = null,
s = null,
a = null;
m.depth && ((a = m.stencil ? 35056 : 33190), (n = m.stencil ? T : E), (s = m.stencil ? w : x));
const l = { colorFormat: m.alpha || d ? 32856 : 32849, depthFormat: a, scaleFactor: r };
(h = new XRWebGLBinding(i, e)), (c = h.createProjectionLayer(l)), i.updateRenderState({ layers: [c] }), (g = d ? new ot(c.textureWidth, c.textureHeight, { format: S, type: v, depthTexture: new _s(c.textureWidth, c.textureHeight, s, void 0, void 0, void 0, void 0, void 0, void 0, n), stencilBuffer: m.stencil, ignoreDepth: c.ignoreDepthValues, useRenderToTexture: o, encoding: t.outputEncoding }) : new at(c.textureWidth, c.textureHeight, { format: m.alpha ? S : M, type: v, depthTexture: new _s(c.textureWidth, c.textureHeight, s, void 0, void 0, void 0, void 0, void 0, void 0, n), stencilBuffer: m.stencil, ignoreDepth: c.ignoreDepthValues, encoding: t.outputEncoding }));
}
this.setFoveation(1), (s = await i.requestReferenceSpace(a)), U.setContext(i), U.start(), (n.isPresenting = !0), n.dispatchEvent({ type: "sessionstart" });
}
});
const z = new ht(),
O = new ht();
function F(t, e) {
null === e ? t.matrixWorld.copy(t.matrix) : t.matrixWorld.multiplyMatrices(e.matrixWorld, t.matrix), t.matrixWorldInverse.copy(t.matrixWorld).invert();
}
(this.updateCamera = function (t) {
if (null === i) return;
(C.near = A.near = b.near = t.near), (C.far = A.far = b.far = t.far), (R === C.near && P === C.far) || (i.updateRenderState({ depthNear: C.near, depthFar: C.far }), (R = C.near), (P = C.far));
const e = t.parent,
n = C.cameras;
F(C, e);
for (let t = 0; t < n.length; t++) F(n[t], e);
C.matrixWorld.decompose(C.position, C.quaternion, C.scale), t.position.copy(C.position), t.quaternion.copy(C.quaternion), t.scale.copy(C.scale), t.matrix.copy(C.matrix), t.matrixWorld.copy(C.matrixWorld);
const r = t.children;
for (let t = 0, e = r.length; t < e; t++) r[t].updateMatrixWorld(!0);
2 === n.length
? (function (t, e, n) {
z.setFromMatrixPosition(e.matrixWorld), O.setFromMatrixPosition(n.matrixWorld);
const i = z.distanceTo(O),
r = e.projectionMatrix.elements,
s = n.projectionMatrix.elements,
a = r[14] / (r[10] - 1),
o = r[14] / (r[10] + 1),
l = (r[9] + 1) / r[5],
h = (r[9] - 1) / r[5],
c = (r[8] - 1) / r[0],
u = (s[8] + 1) / s[0],
d = a * c,
p = a * u,
m = i / (-c + u),
f = m * -c;
e.matrixWorld.decompose(t.position, t.quaternion, t.scale), t.translateX(f), t.translateZ(m), t.matrixWorld.compose(t.position, t.quaternion, t.scale), t.matrixWorldInverse.copy(t.matrixWorld).invert();
const g = a + m,
v = o + m,
x = d - f,
y = p + (i - f),
_ = ((l * o) / v) * g,
b = ((h * o) / v) * g;
t.projectionMatrix.makePerspective(x, y, _, b, g, v);
})(C, b, A)
: C.projectionMatrix.copy(b.projectionMatrix);
}),
(this.getCamera = function () {
return C;
}),
(this.getFoveation = function () {
return null !== c ? c.fixedFoveation : null !== u ? u.fixedFoveation : void 0;
}),
(this.setFoveation = function (t) {
null !== c && (c.fixedFoveation = t), null !== u && void 0 !== u.fixedFoveation && (u.fixedFoveation = t);
});
let B = null;
const U = new Pn();
U.setAnimationLoop(function (e, n) {
if (((l = n.getViewerPose(s)), (p = n), null !== l)) {
const e = l.views;
null !== u && (t.setRenderTargetFramebuffer(g, u.framebuffer), t.setRenderTarget(g));
let n = !1;
e.length !== C.cameras.length && ((C.cameras.length = 0), (n = !0));
for (let i = 0; i < e.length; i++) {
const r = e[i];
let s = null;
if (null !== u) s = u.getViewport(r);
else {
const e = h.getViewSubImage(c, r);
(s = e.viewport), 0 === i && (t.setRenderTargetTextures(g, e.colorTexture, c.ignoreDepthValues ? void 0 : e.depthStencilTexture), t.setRenderTarget(g));
}
const a = L[i];
a.matrix.fromArray(r.transform.matrix), a.projectionMatrix.fromArray(r.projectionMatrix), a.viewport.set(s.x, s.y, s.width, s.height), 0 === i && C.matrix.copy(a.matrix), !0 === n && C.cameras.push(a);
}
}
const r = i.inputSources;
for (let t = 0; t < y.length; t++) {
const e = y[t],
i = r[t];
e.update(i, n, s);
}
B && B(e, n), (p = null);
}),
(this.setAnimationLoop = function (t) {
B = t;
}),
(this.dispose = function () {});
}
}
function ws(t) {
function e(e, n) {
(e.opacity.value = n.opacity), n.color && e.diffuse.value.copy(n.color), n.emissive && e.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity), n.map && (e.map.value = n.map), n.alphaMap && (e.alphaMap.value = n.alphaMap), n.specularMap && (e.specularMap.value = n.specularMap), n.alphaTest > 0 && (e.alphaTest.value = n.alphaTest);
const i = t.get(n).envMap;
let r, s;
i && ((e.envMap.value = i), (e.flipEnvMap.value = i.isCubeTexture && !1 === i.isRenderTargetTexture ? -1 : 1), (e.reflectivity.value = n.reflectivity), (e.ior.value = n.ior), (e.refractionRatio.value = n.refractionRatio)), n.lightMap && ((e.lightMap.value = n.lightMap), (e.lightMapIntensity.value = n.lightMapIntensity)), n.aoMap && ((e.aoMap.value = n.aoMap), (e.aoMapIntensity.value = n.aoMapIntensity)), n.map ? (r = n.map) : n.specularMap ? (r = n.specularMap) : n.displacementMap ? (r = n.displacementMap) : n.normalMap ? (r = n.normalMap) : n.bumpMap ? (r = n.bumpMap) : n.roughnessMap ? (r = n.roughnessMap) : n.metalnessMap ? (r = n.metalnessMap) : n.alphaMap ? (r = n.alphaMap) : n.emissiveMap ? (r = n.emissiveMap) : n.clearcoatMap ? (r = n.clearcoatMap) : n.clearcoatNormalMap ? (r = n.clearcoatNormalMap) : n.clearcoatRoughnessMap ? (r = n.clearcoatRoughnessMap) : n.specularIntensityMap ? (r = n.specularIntensityMap) : n.specularColorMap ? (r = n.specularColorMap) : n.transmissionMap ? (r = n.transmissionMap) : n.thicknessMap ? (r = n.thicknessMap) : n.sheenColorMap ? (r = n.sheenColorMap) : n.sheenRoughnessMap && (r = n.sheenRoughnessMap), void 0 !== r && (r.isWebGLRenderTarget && (r = r.texture), !0 === r.matrixAutoUpdate && r.updateMatrix(), e.uvTransform.value.copy(r.matrix)), n.aoMap ? (s = n.aoMap) : n.lightMap && (s = n.lightMap), void 0 !== s && (s.isWebGLRenderTarget && (s = s.texture), !0 === s.matrixAutoUpdate && s.updateMatrix(), e.uv2Transform.value.copy(s.matrix));
}
function n(e, n) {
(e.roughness.value = n.roughness), (e.metalness.value = n.metalness), n.roughnessMap && (e.roughnessMap.value = n.roughnessMap), n.metalnessMap && (e.metalnessMap.value = n.metalnessMap), n.emissiveMap && (e.emissiveMap.value = n.emissiveMap), n.bumpMap && ((e.bumpMap.value = n.bumpMap), (e.bumpScale.value = n.bumpScale), 1 === n.side && (e.bumpScale.value *= -1)), n.normalMap && ((e.normalMap.value = n.normalMap), e.normalScale.value.copy(n.normalScale), 1 === n.side && e.normalScale.value.negate()), n.displacementMap && ((e.displacementMap.value = n.displacementMap), (e.displacementScale.value = n.displacementScale), (e.displacementBias.value = n.displacementBias));
t.get(n).envMap && (e.envMapIntensity.value = n.envMapIntensity);
}
return {
refreshFogUniforms: function (t, e) {
t.fogColor.value.copy(e.color), e.isFog ? ((t.fogNear.value = e.near), (t.fogFar.value = e.far)) : e.isFogExp2 && (t.fogDensity.value = e.density);
},
refreshMaterialUniforms: function (t, i, r, s, a) {
i.isMeshBasicMaterial
? e(t, i)
: i.isMeshLambertMaterial
? (e(t, i),
(function (t, e) {
e.emissiveMap && (t.emissiveMap.value = e.emissiveMap);
})(t, i))
: i.isMeshToonMaterial
? (e(t, i),
(function (t, e) {
e.gradientMap && (t.gradientMap.value = e.gradientMap);
e.emissiveMap && (t.emissiveMap.value = e.emissiveMap);
e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1));
e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate());
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
})(t, i))
: i.isMeshPhongMaterial
? (e(t, i),
(function (t, e) {
t.specular.value.copy(e.specular), (t.shininess.value = Math.max(e.shininess, 1e-4)), e.emissiveMap && (t.emissiveMap.value = e.emissiveMap);
e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1));
e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate());
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
})(t, i))
: i.isMeshStandardMaterial
? (e(t, i),
i.isMeshPhysicalMaterial
? (function (t, e, i) {
n(t, e), (t.ior.value = e.ior), e.sheen > 0 && (t.sheenColor.value.copy(e.sheenColor).multiplyScalar(e.sheen), (t.sheenRoughness.value = e.sheenRoughness), e.sheenColorMap && (t.sheenColorMap.value = e.sheenColorMap), e.sheenRoughnessMap && (t.sheenRoughnessMap.value = e.sheenRoughnessMap));
e.clearcoat > 0 && ((t.clearcoat.value = e.clearcoat), (t.clearcoatRoughness.value = e.clearcoatRoughness), e.clearcoatMap && (t.clearcoatMap.value = e.clearcoatMap), e.clearcoatRoughnessMap && (t.clearcoatRoughnessMap.value = e.clearcoatRoughnessMap), e.clearcoatNormalMap && (t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale), (t.clearcoatNormalMap.value = e.clearcoatNormalMap), 1 === e.side && t.clearcoatNormalScale.value.negate()));
e.transmission > 0 && ((t.transmission.value = e.transmission), (t.transmissionSamplerMap.value = i.texture), t.transmissionSamplerSize.value.set(i.width, i.height), e.transmissionMap && (t.transmissionMap.value = e.transmissionMap), (t.thickness.value = e.thickness), e.thicknessMap && (t.thicknessMap.value = e.thicknessMap), (t.attenuationDistance.value = e.attenuationDistance), t.attenuationColor.value.copy(e.attenuationColor));
(t.specularIntensity.value = e.specularIntensity), t.specularColor.value.copy(e.specularColor), e.specularIntensityMap && (t.specularIntensityMap.value = e.specularIntensityMap);
e.specularColorMap && (t.specularColorMap.value = e.specularColorMap);
})(t, i, a)
: n(t, i))
: i.isMeshMatcapMaterial
? (e(t, i),
(function (t, e) {
e.matcap && (t.matcap.value = e.matcap);
e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1));
e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate());
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
})(t, i))
: i.isMeshDepthMaterial
? (e(t, i),
(function (t, e) {
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
})(t, i))
: i.isMeshDistanceMaterial
? (e(t, i),
(function (t, e) {
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
t.referencePosition.value.copy(e.referencePosition), (t.nearDistance.value = e.nearDistance), (t.farDistance.value = e.farDistance);
})(t, i))
: i.isMeshNormalMaterial
? (e(t, i),
(function (t, e) {
e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1));
e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate());
e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias));
})(t, i))
: i.isLineBasicMaterial
? ((function (t, e) {
t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity);
})(t, i),
i.isLineDashedMaterial &&
(function (t, e) {
(t.dashSize.value = e.dashSize), (t.totalSize.value = e.dashSize + e.gapSize), (t.scale.value = e.scale);
})(t, i))
: i.isPointsMaterial
? (function (t, e, n, i) {
t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity), (t.size.value = e.size * n), (t.scale.value = 0.5 * i), e.map && (t.map.value = e.map);
e.alphaMap && (t.alphaMap.value = e.alphaMap);
e.alphaTest > 0 && (t.alphaTest.value = e.alphaTest);
let r;
e.map ? (r = e.map) : e.alphaMap && (r = e.alphaMap);
void 0 !== r && (!0 === r.matrixAutoUpdate && r.updateMatrix(), t.uvTransform.value.copy(r.matrix));
})(t, i, r, s)
: i.isSpriteMaterial
? (function (t, e) {
t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity), (t.rotation.value = e.rotation), e.map && (t.map.value = e.map);
e.alphaMap && (t.alphaMap.value = e.alphaMap);
e.alphaTest > 0 && (t.alphaTest.value = e.alphaTest);
let n;
e.map ? (n = e.map) : e.alphaMap && (n = e.alphaMap);
void 0 !== n && (!0 === n.matrixAutoUpdate && n.updateMatrix(), t.uvTransform.value.copy(n.matrix));
})(t, i)
: i.isShadowMaterial
? (t.color.value.copy(i.color), (t.opacity.value = i.opacity))
: i.isShaderMaterial && (i.uniformsNeedUpdate = !1);
},
};
}
function Ms(t = {}) {
const n =
void 0 !== t.canvas
? t.canvas
: (function () {
const t = K("canvas");
return (t.style.display = "block"), t;
})(),
i = void 0 !== t.context ? t.context : null,
r = void 0 !== t.alpha && t.alpha,
s = void 0 === t.depth || t.depth,
a = void 0 === t.stencil || t.stencil,
o = void 0 !== t.antialias && t.antialias,
l = void 0 === t.premultipliedAlpha || t.premultipliedAlpha,
h = void 0 !== t.preserveDrawingBuffer && t.preserveDrawingBuffer,
u = void 0 !== t.powerPreference ? t.powerPreference : "default",
p = void 0 !== t.failIfMajorPerformanceCaveat && t.failIfMajorPerformanceCaveat;
let m = null,
f = null;
const x = [],
y = [];
(this.domElement = n), (this.debug = { checkShaderErrors: !0 }), (this.autoClear = !0), (this.autoClearColor = !0), (this.autoClearDepth = !0), (this.autoClearStencil = !0), (this.sortObjects = !0), (this.clippingPlanes = []), (this.localClippingEnabled = !1), (this.outputEncoding = N), (this.physicallyCorrectLights = !1), (this.toneMapping = 0), (this.toneMappingExposure = 1);
const w = this;
let M = !1,
E = 0,
T = 0,
A = null,
L = -1,
C = null;
const R = new st(),
P = new st();
let D = null,
I = n.width,
z = n.height,
O = 1,
F = null,
B = null;
const U = new st(0, 0, I, z),
H = new st(0, 0, I, z);
let V = !1;
const k = [],
G = new Rn();
let W = !1,
j = !1,
q = null;
const X = new Ht(),
Y = new ht(),
J = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0 };
function $() {
return null === A ? O : 1;
}
let Z,
Q,
tt,
et,
nt,
it,
rt,
lt,
ct,
ut,
dt,
pt,
mt,
ft,
gt,
vt,
xt,
yt,
_t,
bt,
wt,
Mt,
St,
Et = i;
function Tt(t, e) {
for (let i = 0; i < t.length; i++) {
const r = t[i],
s = n.getContext(r, e);
if (null !== s) return s;
}
return null;
}
try {
const t = { alpha: r, depth: s, stencil: a, antialias: o, premultipliedAlpha: l, preserveDrawingBuffer: h, powerPreference: u, failIfMajorPerformanceCaveat: p };
if (("setAttribute" in n && n.setAttribute("data-engine", `three.js r${e}`), n.addEventListener("webglcontextlost", Ct, !1), n.addEventListener("webglcontextrestored", Rt, !1), null === Et)) {
const e = ["webgl2", "webgl", "experimental-webgl"];
if ((!0 === w.isWebGL1Renderer && e.shift(), (Et = Tt(e, t)), null === Et)) throw Tt(e) ? new Error("Error creating WebGL context with your selected attributes.") : new Error("Error creating WebGL context.");
}
void 0 === Et.getShaderPrecisionFormat &&
(Et.getShaderPrecisionFormat = function () {
return { rangeMin: 1, rangeMax: 1, precision: 1 };
});
} catch (t) {
throw (console.error("THREE.WebGLRenderer: " + t.message), t);
}
function At() {
(Z = new mi(Et)), (Q = new Hn(Et, Z, t)), Z.init(Q), (Mt = new fs(Et, Z, Q)), (tt = new ps(Et, Z, Q)), (k[0] = 1029), (et = new vi(Et)), (nt = new Kr()), (it = new ms(Et, Z, tt, nt, Q, Mt, et)), (rt = new kn(w)), (lt = new pi(w)), (ct = new Dn(Et, Q)), (St = new Bn(Et, Z, ct, Q)), (ut = new fi(Et, ct, et, St)), (dt = new Mi(Et, ut, ct, et)), (_t = new wi(Et, Q, it)), (vt = new Vn(nt)), (pt = new Qr(w, rt, lt, Z, Q, St, vt)), (mt = new ws(nt)), (ft = new is()), (gt = new hs(Z, Q)), (yt = new Fn(w, rt, tt, dt, l)), (xt = new ds(w, dt, Q)), (bt = new Un(Et, Z, et, Q)), (wt = new gi(Et, Z, et, Q)), (et.programs = pt.programs), (w.capabilities = Q), (w.extensions = Z), (w.properties = nt), (w.renderLists = ft), (w.shadowMap = xt), (w.state = tt), (w.info = et);
}
At();
const Lt = new bs(w, Et);
function Ct(t) {
t.preventDefault(), console.log("THREE.WebGLRenderer: Context Lost."), (M = !0);
}
function Rt() {
console.log("THREE.WebGLRenderer: Context Restored."), (M = !1);
const t = et.autoReset,
e = xt.enabled,
n = xt.autoUpdate,
i = xt.needsUpdate,
r = xt.type;
At(), (et.autoReset = t), (xt.enabled = e), (xt.autoUpdate = n), (xt.needsUpdate = i), (xt.type = r);
}
function Pt(t) {
const e = t.target;
e.removeEventListener("dispose", Pt),
(function (t) {
(function (t) {
const e = nt.get(t).programs;
void 0 !== e &&
(e.forEach(function (t) {
pt.releaseProgram(t);
}),
t.isShaderMaterial && pt.releaseShaderCache(t));
})(t),
nt.remove(t);
})(e);
}
(this.xr = Lt),
(this.getContext = function () {
return Et;
}),
(this.getContextAttributes = function () {
return Et.getContextAttributes();
}),
(this.forceContextLoss = function () {
const t = Z.get("WEBGL_lose_context");
t && t.loseContext();
}),
(this.forceContextRestore = function () {
const t = Z.get("WEBGL_lose_context");
t && t.restoreContext();
}),
(this.getPixelRatio = function () {
return O;
}),
(this.setPixelRatio = function (t) {
void 0 !== t && ((O = t), this.setSize(I, z, !1));
}),
(this.getSize = function (t) {
return t.set(I, z);
}),
(this.setSize = function (t, e, i) {
Lt.isPresenting ? console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.") : ((I = t), (z = e), (n.width = Math.floor(t * O)), (n.height = Math.floor(e * O)), !1 !== i && ((n.style.width = t + "px"), (n.style.height = e + "px")), this.setViewport(0, 0, t, e));
}),
(this.getDrawingBufferSize = function (t) {
return t.set(I * O, z * O).floor();
}),
(this.setDrawingBufferSize = function (t, e, i) {
(I = t), (z = e), (O = i), (n.width = Math.floor(t * i)), (n.height = Math.floor(e * i)), this.setViewport(0, 0, t, e);
}),
(this.getCurrentViewport = function (t) {
return t.copy(R);
}),
(this.getViewport = function (t) {
return t.copy(U);
}),
(this.setViewport = function (t, e, n, i) {
t.isVector4 ? U.set(t.x, t.y, t.z, t.w) : U.set(t, e, n, i), tt.viewport(R.copy(U).multiplyScalar(O).floor());
}),
(this.getScissor = function (t) {
return t.copy(H);
}),
(this.setScissor = function (t, e, n, i) {
t.isVector4 ? H.set(t.x, t.y, t.z, t.w) : H.set(t, e, n, i), tt.scissor(P.copy(H).multiplyScalar(O).floor());
}),
(this.getScissorTest = function () {
return V;
}),
(this.setScissorTest = function (t) {
tt.setScissorTest((V = t));
}),
(this.setOpaqueSort = function (t) {
F = t;
}),
(this.setTransparentSort = function (t) {
B = t;
}),
(this.getClearColor = function (t) {
return t.copy(yt.getClearColor());
}),
(this.setClearColor = function () {
yt.setClearColor.apply(yt, arguments);
}),
(this.getClearAlpha = function () {
return yt.getClearAlpha();
}),
(this.setClearAlpha = function () {
yt.setClearAlpha.apply(yt, arguments);
}),
(this.clear = function (t, e, n) {
let i = 0;
(void 0 === t || t) && (i |= 16384), (void 0 === e || e) && (i |= 256), (void 0 === n || n) && (i |= 1024), Et.clear(i);
}),
(this.clearColor = function () {
this.clear(!0, !1, !1);
}),
(this.clearDepth = function () {
this.clear(!1, !0, !1);
}),
(this.clearStencil = function () {
this.clear(!1, !1, !0);
}),
(this.dispose = function () {
n.removeEventListener("webglcontextlost", Ct, !1), n.removeEventListener("webglcontextrestored", Rt, !1), ft.dispose(), gt.dispose(), nt.dispose(), rt.dispose(), lt.dispose(), dt.dispose(), St.dispose(), pt.dispose(), Lt.dispose(), Lt.removeEventListener("sessionstart", It), Lt.removeEventListener("sessionend", Nt), q && (q.dispose(), (q = null)), zt.stop();
}),
(this.renderBufferDirect = function (t, e, n, i, r, s) {
null === e && (e = J);
const a = r.isMesh && r.matrixWorld.determinant() < 0,
o = (function (t, e, n, i, r) {
!0 !== e.isScene && (e = J);
it.resetTextureUnits();
const s = e.fog,
a = i.isMeshStandardMaterial ? e.environment : null,
o = null === A ? w.outputEncoding : A.texture.encoding,
l = (i.isMeshStandardMaterial ? lt : rt).get(i.envMap || a),
h = !0 === i.vertexColors && !!n.attributes.color && 4 === n.attributes.color.itemSize,
c = !!i.normalMap && !!n.attributes.tangent,
u = !!n.morphAttributes.position,
d = !!n.morphAttributes.normal,
p = n.morphAttributes.position ? n.morphAttributes.position.length : 0,
m = i.toneMapped ? w.toneMapping : 0,
g = nt.get(i),
v = f.state.lights;
if (!0 === W && (!0 === j || t !== C)) {
const e = t === C && i.id === L;
vt.setState(i, t, e);
}
let x = !1;
i.version === g.__version ? ((g.needsLights && g.lightsStateVersion !== v.state.version) || g.outputEncoding !== o || (r.isInstancedMesh && !1 === g.instancing) ? (x = !0) : r.isInstancedMesh || !0 !== g.instancing ? (r.isSkinnedMesh && !1 === g.skinning ? (x = !0) : r.isSkinnedMesh || !0 !== g.skinning ? (g.envMap !== l || (i.fog && g.fog !== s) ? (x = !0) : void 0 === g.numClippingPlanes || (g.numClippingPlanes === vt.numPlanes && g.numIntersection === vt.numIntersection) ? (g.vertexAlphas !== h || g.vertexTangents !== c || g.morphTargets !== u || g.morphNormals !== d || g.toneMapping !== m || (!0 === Q.isWebGL2 && g.morphTargetsCount !== p)) && (x = !0) : (x = !0)) : (x = !0)) : (x = !0)) : ((x = !0), (g.__version = i.version));
let y = g.currentProgram;
!0 === x && (y = Vt(i, e, r));
let _ = !1,
b = !1,
M = !1;
const S = y.getUniforms(),
E = g.uniforms;
tt.useProgram(y.program) && ((_ = !0), (b = !0), (M = !0));
i.id !== L && ((L = i.id), (b = !0));
if (_ || C !== t) {
if ((S.setValue(Et, "projectionMatrix", t.projectionMatrix), Q.logarithmicDepthBuffer && S.setValue(Et, "logDepthBufFC", 2 / (Math.log(t.far + 1) / Math.LN2)), C !== t && ((C = t), (b = !0), (M = !0)), i.isShaderMaterial || i.isMeshPhongMaterial || i.isMeshToonMaterial || i.isMeshStandardMaterial || i.envMap)) {
const e = S.map.cameraPosition;
void 0 !== e && e.setValue(Et, Y.setFromMatrixPosition(t.matrixWorld));
}
(i.isMeshPhongMaterial || i.isMeshToonMaterial || i.isMeshLambertMaterial || i.isMeshBasicMaterial || i.isMeshStandardMaterial || i.isShaderMaterial) && S.setValue(Et, "isOrthographic", !0 === t.isOrthographicCamera), (i.isMeshPhongMaterial || i.isMeshToonMaterial || i.isMeshLambertMaterial || i.isMeshBasicMaterial || i.isMeshStandardMaterial || i.isShaderMaterial || i.isShadowMaterial || r.isSkinnedMesh) && S.setValue(Et, "viewMatrix", t.matrixWorldInverse);
}
if (r.isSkinnedMesh) {
S.setOptional(Et, r, "bindMatrix"), S.setOptional(Et, r, "bindMatrixInverse");
const t = r.skeleton;
t && (Q.floatVertexTextures ? (null === t.boneTexture && t.computeBoneTexture(), S.setValue(Et, "boneTexture", t.boneTexture, it), S.setValue(Et, "boneTextureSize", t.boneTextureSize)) : S.setOptional(Et, t, "boneMatrices"));
}
!n || (void 0 === n.morphAttributes.position && void 0 === n.morphAttributes.normal) || _t.update(r, n, i, y);
(b || g.receiveShadow !== r.receiveShadow) && ((g.receiveShadow = r.receiveShadow), S.setValue(Et, "receiveShadow", r.receiveShadow));
b && (S.setValue(Et, "toneMappingExposure", w.toneMappingExposure), g.needsLights && ((R = M), ((T = E).ambientLightColor.needsUpdate = R), (T.lightProbe.needsUpdate = R), (T.directionalLights.needsUpdate = R), (T.directionalLightShadows.needsUpdate = R), (T.pointLights.needsUpdate = R), (T.pointLightShadows.needsUpdate = R), (T.spotLights.needsUpdate = R), (T.spotLightShadows.needsUpdate = R), (T.rectAreaLights.needsUpdate = R), (T.hemisphereLights.needsUpdate = R)), s && i.fog && mt.refreshFogUniforms(E, s), mt.refreshMaterialUniforms(E, i, O, z, q), Lr.upload(Et, g.uniformsList, E, it));
var T, R;
i.isShaderMaterial && !0 === i.uniformsNeedUpdate && (Lr.upload(Et, g.uniformsList, E, it), (i.uniformsNeedUpdate = !1));
i.isSpriteMaterial && S.setValue(Et, "center", r.center);
return S.setValue(Et, "modelViewMatrix", r.modelViewMatrix), S.setValue(Et, "normalMatrix", r.normalMatrix), S.setValue(Et, "modelMatrix", r.matrixWorld), y;
})(t, e, n, i, r);
tt.setMaterial(i, a);
let l = n.index;
const h = n.attributes.position;
if (null === l) {
if (void 0 === h || 0 === h.count) return;
} else if (0 === l.count) return;
let c,
u = 1;
!0 === i.wireframe && ((l = ut.getWireframeAttribute(n)), (u = 2)), St.setup(r, i, o, n, l);
let d = bt;
null !== l && ((c = ct.get(l)), (d = wt), d.setIndex(c));
const p = null !== l ? l.count : h.count,
m = n.drawRange.start * u,
g = n.drawRange.count * u,
v = null !== s ? s.start * u : 0,
x = null !== s ? s.count * u : 1 / 0,
y = Math.max(m, v),
_ = Math.min(p, m + g, v + x) - 1,
b = Math.max(0, _ - y + 1);
if (0 !== b) {
if (r.isMesh) !0 === i.wireframe ? (tt.setLineWidth(i.wireframeLinewidth * $()), d.setMode(1)) : d.setMode(4);
else if (r.isLine) {
let t = i.linewidth;
void 0 === t && (t = 1), tt.setLineWidth(t * $()), r.isLineSegments ? d.setMode(1) : r.isLineLoop ? d.setMode(2) : d.setMode(3);
} else r.isPoints ? d.setMode(0) : r.isSprite && d.setMode(4);
if (r.isInstancedMesh) d.renderInstances(y, b, r.count);
else if (n.isInstancedBufferGeometry) {
const t = Math.min(n.instanceCount, n._maxInstanceCount);
d.renderInstances(y, b, t);
} else d.render(y, b);
}
}),
(this.compile = function (t, e) {
(f = gt.get(t)),
f.init(),
y.push(f),
t.traverseVisible(function (t) {
t.isLight && t.layers.test(e.layers) && (f.pushLight(t), t.castShadow && f.pushShadow(t));
}),
f.setupLights(w.physicallyCorrectLights),
t.traverse(function (e) {
const n = e.material;
if (n)
if (Array.isArray(n))
for (let i = 0; i < n.length; i++) {
Vt(n[i], t, e);
}
else Vt(n, t, e);
}),
y.pop(),
(f = null);
});
let Dt = null;
function It() {
zt.stop();
}
function Nt() {
zt.start();
}
const zt = new Pn();
function Ot(t, e, n, i) {
if (!1 === t.visible) return;
if (t.layers.test(e.layers))
if (t.isGroup) n = t.renderOrder;
else if (t.isLOD) !0 === t.autoUpdate && t.update(e);
else if (t.isLight) f.pushLight(t), t.castShadow && f.pushShadow(t);
else if (t.isSprite) {
if (!t.frustumCulled || G.intersectsSprite(t)) {
i && Y.setFromMatrixPosition(t.matrixWorld).applyMatrix4(X);
const e = dt.update(t),
r = t.material;
r.visible && m.push(t, e, r, n, Y.z, null);
}
} else if ((t.isMesh || t.isLine || t.isPoints) && (t.isSkinnedMesh && t.skeleton.frame !== et.render.frame && (t.skeleton.update(), (t.skeleton.frame = et.render.frame)), !t.frustumCulled || G.intersectsObject(t))) {
i && Y.setFromMatrixPosition(t.matrixWorld).applyMatrix4(X);
const e = dt.update(t),
r = t.material;
if (Array.isArray(r)) {
const i = e.groups;
for (let s = 0, a = i.length; s < a; s++) {
const a = i[s],
o = r[a.materialIndex];
o && o.visible && m.push(t, e, o, n, Y.z, a);
}
} else r.visible && m.push(t, e, r, n, Y.z, null);
}
const r = t.children;
for (let t = 0, s = r.length; t < s; t++) Ot(r[t], e, n, i);
}
function Ft(t, e, n, i) {
const r = t.opaque,
s = t.transmissive,
a = t.transparent;
f.setupLightsView(n),
s.length > 0 &&
(function (t, e, n) {
if (null === q) {
const t = !0 === o && !0 === Q.isWebGL2;
q = new (t ? ot : at)(1024, 1024, { generateMipmaps: !0, type: null !== Mt.convert(b) ? b : v, minFilter: g, magFilter: d, wrapS: c, wrapT: c, useRenderToTexture: Z.has("WEBGL_multisampled_render_to_texture") });
}
const i = w.getRenderTarget();
w.setRenderTarget(q), w.clear();
const r = w.toneMapping;
(w.toneMapping = 0), Bt(t, e, n), (w.toneMapping = r), it.updateMultisampleRenderTarget(q), it.updateRenderTargetMipmap(q), w.setRenderTarget(i);
})(r, e, n),
i && tt.viewport(R.copy(i)),
r.length > 0 && Bt(r, e, n),
s.length > 0 && Bt(s, e, n),
a.length > 0 && Bt(a, e, n);
}
function Bt(t, e, n) {
const i = !0 === e.isScene ? e.overrideMaterial : null;
for (let r = 0, s = t.length; r < s; r++) {
const s = t[r],
a = s.object,
o = s.geometry,
l = null === i ? s.material : i,
h = s.group;
a.layers.test(n.layers) && Ut(a, e, n, o, l, h);
}
}
function Ut(t, e, n, i, r, s) {
t.onBeforeRender(w, e, n, i, r, s), t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse, t.matrixWorld), t.normalMatrix.getNormalMatrix(t.modelViewMatrix), r.onBeforeRender(w, e, n, i, t, s), !0 === r.transparent && 2 === r.side ? ((r.side = 1), (r.needsUpdate = !0), w.renderBufferDirect(n, e, i, r, t, s), (r.side = 0), (r.needsUpdate = !0), w.renderBufferDirect(n, e, i, r, t, s), (r.side = 2)) : w.renderBufferDirect(n, e, i, r, t, s), t.onAfterRender(w, e, n, i, r, s);
}
function Vt(t, e, n) {
!0 !== e.isScene && (e = J);
const i = nt.get(t),
r = f.state.lights,
s = f.state.shadowsArray,
a = r.state.version,
o = pt.getParameters(t, r.state, s, e, n),
l = pt.getProgramCacheKey(o);
let h = i.programs;
(i.environment = t.isMeshStandardMaterial ? e.environment : null), (i.fog = e.fog), (i.envMap = (t.isMeshStandardMaterial ? lt : rt).get(t.envMap || i.environment)), void 0 === h && (t.addEventListener("dispose", Pt), (h = new Map()), (i.programs = h));
let c = h.get(l);
if (void 0 !== c) {
if (i.currentProgram === c && i.lightsStateVersion === a) return kt(t, o), c;
} else (o.uniforms = pt.getUniforms(t)), t.onBuild(n, o, w), t.onBeforeCompile(o, w), (c = pt.acquireProgram(o, l)), h.set(l, c), (i.uniforms = o.uniforms);
const u = i.uniforms;
((t.isShaderMaterial || t.isRawShaderMaterial) && !0 !== t.clipping) || (u.clippingPlanes = vt.uniform),
kt(t, o),
(i.needsLights = (function (t) {
return t.isMeshLambertMaterial || t.isMeshToonMaterial || t.isMeshPhongMaterial || t.isMeshStandardMaterial || t.isShadowMaterial || (t.isShaderMaterial && !0 === t.lights);
})(t)),
(i.lightsStateVersion = a),
i.needsLights && ((u.ambientLightColor.value = r.state.ambient), (u.lightProbe.value = r.state.probe), (u.directionalLights.value = r.state.directional), (u.directionalLightShadows.value = r.state.directionalShadow), (u.spotLights.value = r.state.spot), (u.spotLightShadows.value = r.state.spotShadow), (u.rectAreaLights.value = r.state.rectArea), (u.ltc_1.value = r.state.rectAreaLTC1), (u.ltc_2.value = r.state.rectAreaLTC2), (u.pointLights.value = r.state.point), (u.pointLightShadows.value = r.state.pointShadow), (u.hemisphereLights.value = r.state.hemi), (u.directionalShadowMap.value = r.state.directionalShadowMap), (u.directionalShadowMatrix.value = r.state.directionalShadowMatrix), (u.spotShadowMap.value = r.state.spotShadowMap), (u.spotShadowMatrix.value = r.state.spotShadowMatrix), (u.pointShadowMap.value = r.state.pointShadowMap), (u.pointShadowMatrix.value = r.state.pointShadowMatrix));
const d = c.getUniforms(),
p = Lr.seqWithValue(d.seq, u);
return (i.currentProgram = c), (i.uniformsList = p), c;
}
function kt(t, e) {
const n = nt.get(t);
(n.outputEncoding = e.outputEncoding), (n.instancing = e.instancing), (n.skinning = e.skinning), (n.morphTargets = e.morphTargets), (n.morphNormals = e.morphNormals), (n.morphTargetsCount = e.morphTargetsCount), (n.numClippingPlanes = e.numClippingPlanes), (n.numIntersection = e.numClipIntersection), (n.vertexAlphas = e.vertexAlphas), (n.vertexTangents = e.vertexTangents), (n.toneMapping = e.toneMapping);
}
zt.setAnimationLoop(function (t) {
Dt && Dt(t);
}),
"undefined" != typeof window && zt.setContext(window),
(this.setAnimationLoop = function (t) {
(Dt = t), Lt.setAnimationLoop(t), null === t ? zt.stop() : zt.start();
}),
Lt.addEventListener("sessionstart", It),
Lt.addEventListener("sessionend", Nt),
(this.render = function (t, e) {
if (void 0 !== e && !0 !== e.isCamera) return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");
if (!0 === M) return;
!0 === t.autoUpdate && t.updateMatrixWorld(), null === e.parent && e.updateMatrixWorld(), !0 === Lt.enabled && !0 === Lt.isPresenting && (!0 === Lt.cameraAutoUpdate && Lt.updateCamera(e), (e = Lt.getCamera())), !0 === t.isScene && t.onBeforeRender(w, t, e, A), (f = gt.get(t, y.length)), f.init(), y.push(f), X.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), G.setFromProjectionMatrix(X), (j = this.localClippingEnabled), (W = vt.init(this.clippingPlanes, j, e)), (m = ft.get(t, x.length)), m.init(), x.push(m), Ot(t, e, 0, w.sortObjects), m.finish(), !0 === w.sortObjects && m.sort(F, B), !0 === W && vt.beginShadows();
const n = f.state.shadowsArray;
if ((xt.render(n, t, e), !0 === W && vt.endShadows(), !0 === this.info.autoReset && this.info.reset(), yt.render(m, t), f.setupLights(w.physicallyCorrectLights), e.isArrayCamera)) {
const n = e.cameras;
for (let e = 0, i = n.length; e < i; e++) {
const i = n[e];
Ft(m, t, i, i.viewport);
}
} else Ft(m, t, e);
null !== A && (it.updateMultisampleRenderTarget(A), it.updateRenderTargetMipmap(A)), !0 === t.isScene && t.onAfterRender(w, t, e), tt.buffers.depth.setTest(!0), tt.buffers.depth.setMask(!0), tt.buffers.color.setMask(!0), tt.setPolygonOffset(!1), St.resetDefaultState(), (L = -1), (C = null), y.pop(), (f = y.length > 0 ? y[y.length - 1] : null), x.pop(), (m = x.length > 0 ? x[x.length - 1] : null);
}),
(this.getActiveCubeFace = function () {
return E;
}),
(this.getActiveMipmapLevel = function () {
return T;
}),
(this.getRenderTarget = function () {
return A;
}),
(this.setRenderTargetTextures = function (t, e, n) {
(nt.get(t.texture).__webglTexture = e), (nt.get(t.depthTexture).__webglTexture = n);
const i = nt.get(t);
(i.__hasExternalTextures = !0), i.__hasExternalTextures && ((i.__autoAllocateDepthBuffer = void 0 === n), i.__autoAllocateDepthBuffer || (t.useRenderToTexture && (console.warn("render-to-texture extension was disabled because an external texture was provided"), (t.useRenderToTexture = !1), (t.useRenderbuffer = !0))));
}),
(this.setRenderTargetFramebuffer = function (t, e) {
const n = nt.get(t);
(n.__webglFramebuffer = e), (n.__useDefaultFramebuffer = void 0 === e);
}),
(this.setRenderTarget = function (t, e = 0, n = 0) {
(A = t), (E = e), (T = n);
let i = !0;
if (t) {
const e = nt.get(t);
void 0 !== e.__useDefaultFramebuffer ? (tt.bindFramebuffer(36160, null), (i = !1)) : void 0 === e.__webglFramebuffer ? it.setupRenderTarget(t) : e.__hasExternalTextures && it.rebindTextures(t, nt.get(t.texture).__webglTexture, nt.get(t.depthTexture).__webglTexture);
}
let r = null,
s = !1,
a = !1;
if (t) {
const n = t.texture;
(n.isDataTexture3D || n.isDataTexture2DArray) && (a = !0);
const i = nt.get(t).__webglFramebuffer;
t.isWebGLCubeRenderTarget ? ((r = i[e]), (s = !0)) : (r = t.useRenderbuffer ? nt.get(t).__webglMultisampledFramebuffer : i), R.copy(t.viewport), P.copy(t.scissor), (D = t.scissorTest);
} else R.copy(U).multiplyScalar(O).floor(), P.copy(H).multiplyScalar(O).floor(), (D = V);
if (tt.bindFramebuffer(36160, r) && Q.drawBuffers && i) {
let e = !1;
if (t)
if (t.isWebGLMultipleRenderTargets) {
const n = t.texture;
if (k.length !== n.length || 36064 !== k[0]) {
for (let t = 0, e = n.length; t < e; t++) k[t] = 36064 + t;
(k.length = n.length), (e = !0);
}
} else (1 === k.length && 36064 === k[0]) || ((k[0] = 36064), (k.length = 1), (e = !0));
else (1 === k.length && 1029 === k[0]) || ((k[0] = 1029), (k.length = 1), (e = !0));
e && (Q.isWebGL2 ? Et.drawBuffers(k) : Z.get("WEBGL_draw_buffers").drawBuffersWEBGL(k));
}
if ((tt.viewport(R), tt.scissor(P), tt.setScissorTest(D), s)) {
const i = nt.get(t.texture);
Et.framebufferTexture2D(36160, 36064, 34069 + e, i.__webglTexture, n);
} else if (a) {
const i = nt.get(t.texture),
r = e || 0;
Et.framebufferTextureLayer(36160, 36064, i.__webglTexture, n || 0, r);
}
L = -1;
}),
(this.readRenderTargetPixels = function (t, e, n, i, r, s, a) {
if (!t || !t.isWebGLRenderTarget) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");
let o = nt.get(t).__webglFramebuffer;
if ((t.isWebGLCubeRenderTarget && void 0 !== a && (o = o[a]), o)) {
tt.bindFramebuffer(36160, o);
try {
const a = t.texture,
o = a.format,
l = a.type;
if (o !== S && Mt.convert(o) !== Et.getParameter(35739)) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");
const h = l === b && (Z.has("EXT_color_buffer_half_float") || (Q.isWebGL2 && Z.has("EXT_color_buffer_float")));
if (!(l === v || Mt.convert(l) === Et.getParameter(35738) || (l === _ && (Q.isWebGL2 || Z.has("OES_texture_float") || Z.has("WEBGL_color_buffer_float"))) || h)) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");
36053 === Et.checkFramebufferStatus(36160) ? e >= 0 && e <= t.width - i && n >= 0 && n <= t.height - r && Et.readPixels(e, n, i, r, Mt.convert(o), Mt.convert(l), s) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.");
} finally {
const t = null !== A ? nt.get(A).__webglFramebuffer : null;
tt.bindFramebuffer(36160, t);
}
}
}),
(this.copyFramebufferToTexture = function (t, e, n = 0) {
if (!0 !== e.isFramebufferTexture) return void console.error("THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.");
const i = Math.pow(2, -n),
r = Math.floor(e.image.width * i),
s = Math.floor(e.image.height * i);
it.setTexture2D(e, 0), Et.copyTexSubImage2D(3553, n, 0, 0, t.x, t.y, r, s), tt.unbindTexture();
}),
(this.copyTextureToTexture = function (t, e, n, i = 0) {
const r = e.image.width,
s = e.image.height,
a = Mt.convert(n.format),
o = Mt.convert(n.type);
it.setTexture2D(n, 0), Et.pixelStorei(37440, n.flipY), Et.pixelStorei(37441, n.premultiplyAlpha), Et.pixelStorei(3317, n.unpackAlignment), e.isDataTexture ? Et.texSubImage2D(3553, i, t.x, t.y, r, s, a, o, e.image.data) : e.isCompressedTexture ? Et.compressedTexSubImage2D(3553, i, t.x, t.y, e.mipmaps[0].width, e.mipmaps[0].height, a, e.mipmaps[0].data) : Et.texSubImage2D(3553, i, t.x, t.y, a, o, e.image), 0 === i && n.generateMipmaps && Et.generateMipmap(3553), tt.unbindTexture();
}),
(this.copyTextureToTexture3D = function (t, e, n, i, r = 0) {
if (w.isWebGL1Renderer) return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");
const s = t.max.x - t.min.x + 1,
a = t.max.y - t.min.y + 1,
o = t.max.z - t.min.z + 1,
l = Mt.convert(i.format),
h = Mt.convert(i.type);
let c;
if (i.isDataTexture3D) it.setTexture3D(i, 0), (c = 32879);
else {
if (!i.isDataTexture2DArray) return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");
it.setTexture2DArray(i, 0), (c = 35866);
}
Et.pixelStorei(37440, i.flipY), Et.pixelStorei(37441, i.premultiplyAlpha), Et.pixelStorei(3317, i.unpackAlignment);
const u = Et.getParameter(3314),
d = Et.getParameter(32878),
p = Et.getParameter(3316),
m = Et.getParameter(3315),
f = Et.getParameter(32877),
g = n.isCompressedTexture ? n.mipmaps[0] : n.image;
Et.pixelStorei(3314, g.width), Et.pixelStorei(32878, g.height), Et.pixelStorei(3316, t.min.x), Et.pixelStorei(3315, t.min.y), Et.pixelStorei(32877, t.min.z), n.isDataTexture || n.isDataTexture3D ? Et.texSubImage3D(c, r, e.x, e.y, e.z, s, a, o, l, h, g.data) : n.isCompressedTexture ? (console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."), Et.compressedTexSubImage3D(c, r, e.x, e.y, e.z, s, a, o, l, g.data)) : Et.texSubImage3D(c, r, e.x, e.y, e.z, s, a, o, l, h, g), Et.pixelStorei(3314, u), Et.pixelStorei(32878, d), Et.pixelStorei(3316, p), Et.pixelStorei(3315, m), Et.pixelStorei(32877, f), 0 === r && i.generateMipmaps && Et.generateMipmap(c), tt.unbindTexture();
}),
(this.initTexture = function (t) {
it.setTexture2D(t, 0), tt.unbindTexture();
}),
(this.resetState = function () {
(E = 0), (T = 0), (A = null), tt.reset(), St.reset();
}),
"undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this }));
}
Ms.prototype.isWebGLRenderer = !0;
(class extends Ms {}.prototype.isWebGL1Renderer = !0);
class Ss {
constructor(t, e = 25e-5) {
(this.name = ""), (this.color = new Pe(t)), (this.density = e);
}
clone() {
return new Ss(this.color, this.density);
}
toJSON() {
return { type: "FogExp2", color: this.color.getHex(), density: this.density };
}
}
Ss.prototype.isFogExp2 = !0;
class Es {
constructor(t, e = 1, n = 1e3) {
(this.name = ""), (this.color = new Pe(t)), (this.near = e), (this.far = n);
}
clone() {
return new Es(this.color, this.near, this.far);
}
toJSON() {
return { type: "Fog", color: this.color.getHex(), near: this.near, far: this.far };
}
}
Es.prototype.isFog = !0;
class Ts extends ue {
constructor() {
super(), (this.type = "Scene"), (this.background = null), (this.environment = null), (this.fog = null), (this.overrideMaterial = null), (this.autoUpdate = !0), "undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this }));
}
copy(t, e) {
return super.copy(t, e), null !== t.background && (this.background = t.background.clone()), null !== t.environment && (this.environment = t.environment.clone()), null !== t.fog && (this.fog = t.fog.clone()), null !== t.overrideMaterial && (this.overrideMaterial = t.overrideMaterial.clone()), (this.autoUpdate = t.autoUpdate), (this.matrixAutoUpdate = t.matrixAutoUpdate), this;
}
toJSON(t) {
const e = super.toJSON(t);
return null !== this.fog && (e.object.fog = this.fog.toJSON()), e;
}
}
Ts.prototype.isScene = !0;
class As {
constructor(t, e) {
(this.array = t), (this.stride = e), (this.count = void 0 !== t ? t.length / e : 0), (this.usage = F), (this.updateRange = { offset: 0, count: -1 }), (this.version = 0), (this.uuid = W());
}
onUploadCallback() {}
set needsUpdate(t) {
!0 === t && this.version++;
}
setUsage(t) {
return (this.usage = t), this;
}
copy(t) {
return (this.array = new t.array.constructor(t.array)), (this.count = t.count), (this.stride = t.stride), (this.usage = t.usage), this;
}
copyAt(t, e, n) {
(t *= this.stride), (n *= e.stride);
for (let i = 0, r = this.stride; i < r; i++) this.array[t + i] = e.array[n + i];
return this;
}
set(t, e = 0) {
return this.array.set(t, e), this;
}
clone(t) {
void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = W()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer);
const e = new this.array.constructor(t.arrayBuffers[this.array.buffer._uuid]),
n = new this.constructor(e, this.stride);
return n.setUsage(this.usage), n;
}
onUpload(t) {
return (this.onUploadCallback = t), this;
}
toJSON(t) {
return void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = W()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = Array.prototype.slice.call(new Uint32Array(this.array.buffer))), { uuid: this.uuid, buffer: this.array.buffer._uuid, type: this.array.constructor.name, stride: this.stride };
}
}
As.prototype.isInterleavedBuffer = !0;
const Ls = new ht();
class Cs {
constructor(t, e, n, i = !1) {
(this.name = ""), (this.data = t), (this.itemSize = e), (this.offset = n), (this.normalized = !0 === i);
}
get count() {
return this.data.count;
}
get array() {
return this.data.array;
}
set needsUpdate(t) {
this.data.needsUpdate = t;
}
applyMatrix4(t) {
for (let e = 0, n = this.data.count; e < n; e++) (Ls.x = this.getX(e)), (Ls.y = this.getY(e)), (Ls.z = this.getZ(e)), Ls.applyMatrix4(t), this.setXYZ(e, Ls.x, Ls.y, Ls.z);
return this;
}
applyNormalMatrix(t) {
for (let e = 0, n = this.count; e < n; e++) (Ls.x = this.getX(e)), (Ls.y = this.getY(e)), (Ls.z = this.getZ(e)), Ls.applyNormalMatrix(t), this.setXYZ(e, Ls.x, Ls.y, Ls.z);
return this;
}
transformDirection(t) {
for (let e = 0, n = this.count; e < n; e++) (Ls.x = this.getX(e)), (Ls.y = this.getY(e)), (Ls.z = this.getZ(e)), Ls.transformDirection(t), this.setXYZ(e, Ls.x, Ls.y, Ls.z);
return this;
}
setX(t, e) {
return (this.data.array[t * this.data.stride + this.offset] = e), this;
}
setY(t, e) {
return (this.data.array[t * this.data.stride + this.offset + 1] = e), this;
}
setZ(t, e) {
return (this.data.array[t * this.data.stride + this.offset + 2] = e), this;
}
setW(t, e) {
return (this.data.array[t * this.data.stride + this.offset + 3] = e), this;
}
getX(t) {
return this.data.array[t * this.data.stride + this.offset];
}
getY(t) {
return this.data.array[t * this.data.stride + this.offset + 1];
}
getZ(t) {
return this.data.array[t * this.data.stride + this.offset + 2];
}
getW(t) {
return this.data.array[t * this.data.stride + this.offset + 3];
}
setXY(t, e, n) {
return (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), this;
}
setXYZ(t, e, n, i) {
return (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), (this.data.array[t + 2] = i), this;
}
setXYZW(t, e, n, i, r) {
return (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), (this.data.array[t + 2] = i), (this.data.array[t + 3] = r), this;
}
clone(t) {
if (void 0 === t) {
console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");
const t = [];
for (let e = 0; e < this.count; e++) {
const n = e * this.data.stride + this.offset;
for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]);
}
return new ze(new this.array.constructor(t), this.itemSize, this.normalized);
}
return void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.clone(t)), new Cs(t.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized);
}
toJSON(t) {
if (void 0 === t) {
console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");
const t = [];
for (let e = 0; e < this.count; e++) {
const n = e * this.data.stride + this.offset;
for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]);
}
return { itemSize: this.itemSize, type: this.array.constructor.name, array: t, normalized: this.normalized };
}
return void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.toJSON(t)), { isInterleavedBufferAttribute: !0, itemSize: this.itemSize, data: this.data.uuid, offset: this.offset, normalized: this.normalized };
}
}
Cs.prototype.isInterleavedBufferAttribute = !0;
class Rs extends Se {
constructor(t) {
super(), (this.type = "SpriteMaterial"), (this.color = new Pe(16777215)), (this.map = null), (this.alphaMap = null), (this.rotation = 0), (this.sizeAttenuation = !0), (this.transparent = !0), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.rotation = t.rotation), (this.sizeAttenuation = t.sizeAttenuation), this;
}
}
let Ps;
Rs.prototype.isSpriteMaterial = !0;
const Ds = new ht(),
Is = new ht(),
Ns = new ht(),
zs = new $(),
Os = new $(),
Fs = new Ht(),
Bs = new ht(),
Us = new ht(),
Hs = new ht(),
Vs = new $(),
ks = new $(),
Gs = new $();
class Ws extends ue {
constructor(t) {
if ((super(), (this.type = "Sprite"), void 0 === Ps)) {
Ps = new qe();
const t = new Float32Array([-0.5, -0.5, 0, 0, 0, 0.5, -0.5, 0, 1, 0, 0.5, 0.5, 0, 1, 1, -0.5, 0.5, 0, 0, 1]),
e = new As(t, 5);
Ps.setIndex([0, 1, 2, 0, 2, 3]), Ps.setAttribute("position", new Cs(e, 3, 0, !1)), Ps.setAttribute("uv", new Cs(e, 2, 3, !1));
}
(this.geometry = Ps), (this.material = void 0 !== t ? t : new Rs()), (this.center = new $(0.5, 0.5));
}
raycast(t, e) {
null === t.camera && console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'), Is.setFromMatrixScale(this.matrixWorld), Fs.copy(t.camera.matrixWorld), this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse, this.matrixWorld), Ns.setFromMatrixPosition(this.modelViewMatrix), t.camera.isPerspectiveCamera && !1 === this.material.sizeAttenuation && Is.multiplyScalar(-Ns.z);
const n = this.material.rotation;
let i, r;
0 !== n && ((r = Math.cos(n)), (i = Math.sin(n)));
const s = this.center;
js(Bs.set(-0.5, -0.5, 0), Ns, s, Is, i, r), js(Us.set(0.5, -0.5, 0), Ns, s, Is, i, r), js(Hs.set(0.5, 0.5, 0), Ns, s, Is, i, r), Vs.set(0, 0), ks.set(1, 0), Gs.set(1, 1);
let a = t.ray.intersectTriangle(Bs, Us, Hs, !1, Ds);
if (null === a && (js(Us.set(-0.5, 0.5, 0), Ns, s, Is, i, r), ks.set(0, 1), (a = t.ray.intersectTriangle(Bs, Hs, Us, !1, Ds)), null === a)) return;
const o = t.ray.origin.distanceTo(Ds);
o < t.near || o > t.far || e.push({ distance: o, point: Ds.clone(), uv: we.getUV(Ds, Bs, Us, Hs, Vs, ks, Gs, new $()), face: null, object: this });
}
copy(t) {
return super.copy(t), void 0 !== t.center && this.center.copy(t.center), (this.material = t.material), this;
}
}
function js(t, e, n, i, r, s) {
zs.subVectors(t, n).addScalar(0.5).multiply(i), void 0 !== r ? ((Os.x = s * zs.x - r * zs.y), (Os.y = r * zs.x + s * zs.y)) : Os.copy(zs), t.copy(e), (t.x += Os.x), (t.y += Os.y), t.applyMatrix4(Fs);
}
Ws.prototype.isSprite = !0;
const qs = new ht(),
Xs = new st(),
Ys = new st(),
Js = new ht(),
$s = new Ht();
class Zs extends un {
constructor(t, e) {
super(t, e), (this.type = "SkinnedMesh"), (this.bindMode = "attached"), (this.bindMatrix = new Ht()), (this.bindMatrixInverse = new Ht());
}
copy(t) {
return super.copy(t), (this.bindMode = t.bindMode), this.bindMatrix.copy(t.bindMatrix), this.bindMatrixInverse.copy(t.bindMatrixInverse), (this.skeleton = t.skeleton), this;
}
bind(t, e) {
(this.skeleton = t), void 0 === e && (this.updateMatrixWorld(!0), this.skeleton.calculateInverses(), (e = this.matrixWorld)), this.bindMatrix.copy(e), this.bindMatrixInverse.copy(e).invert();
}
pose() {
this.skeleton.pose();
}
normalizeSkinWeights() {
const t = new st(),
e = this.geometry.attributes.skinWeight;
for (let n = 0, i = e.count; n < i; n++) {
(t.x = e.getX(n)), (t.y = e.getY(n)), (t.z = e.getZ(n)), (t.w = e.getW(n));
const i = 1 / t.manhattanLength();
i !== 1 / 0 ? t.multiplyScalar(i) : t.set(1, 0, 0, 0), e.setXYZW(n, t.x, t.y, t.z, t.w);
}
}
updateMatrixWorld(t) {
super.updateMatrixWorld(t), "attached" === this.bindMode ? this.bindMatrixInverse.copy(this.matrixWorld).invert() : "detached" === this.bindMode ? this.bindMatrixInverse.copy(this.bindMatrix).invert() : console.warn("THREE.SkinnedMesh: Unrecognized bindMode: " + this.bindMode);
}
boneTransform(t, e) {
const n = this.skeleton,
i = this.geometry;
Xs.fromBufferAttribute(i.attributes.skinIndex, t), Ys.fromBufferAttribute(i.attributes.skinWeight, t), qs.copy(e).applyMatrix4(this.bindMatrix), e.set(0, 0, 0);
for (let t = 0; t < 4; t++) {
const i = Ys.getComponent(t);
if (0 !== i) {
const r = Xs.getComponent(t);
$s.multiplyMatrices(n.bones[r].matrixWorld, n.boneInverses[r]), e.addScaledVector(Js.copy(qs).applyMatrix4($s), i);
}
}
return e.applyMatrix4(this.bindMatrixInverse);
}
}
Zs.prototype.isSkinnedMesh = !0;
class Qs extends ue {
constructor() {
super(), (this.type = "Bone");
}
}
Qs.prototype.isBone = !0;
class Ks extends it {
constructor(t = null, e = 1, n = 1, i, r, s, a, o, l = 1003, h = 1003, c, u) {
super(null, s, a, o, l, h, i, r, c, u), (this.image = { data: t, width: e, height: n }), (this.magFilter = l), (this.minFilter = h), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1);
}
}
Ks.prototype.isDataTexture = !0;
class ta extends ze {
constructor(t, e, n, i = 1) {
"number" == typeof n && ((i = n), (n = !1), console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")), super(t, e, n), (this.meshPerAttribute = i);
}
copy(t) {
return super.copy(t), (this.meshPerAttribute = t.meshPerAttribute), this;
}
toJSON() {
const t = super.toJSON();
return (t.meshPerAttribute = this.meshPerAttribute), (t.isInstancedBufferAttribute = !0), t;
}
}
ta.prototype.isInstancedBufferAttribute = !0;
const ea = new Ht(),
na = new Ht(),
ia = [],
ra = new un();
class sa extends un {
constructor(t, e, n) {
super(t, e), (this.instanceMatrix = new ta(new Float32Array(16 * n), 16)), (this.instanceColor = null), (this.count = n), (this.frustumCulled = !1);
}
copy(t) {
return super.copy(t), this.instanceMatrix.copy(t.instanceMatrix), null !== t.instanceColor && (this.instanceColor = t.instanceColor.clone()), (this.count = t.count), this;
}
getColorAt(t, e) {
e.fromArray(this.instanceColor.array, 3 * t);
}
getMatrixAt(t, e) {
e.fromArray(this.instanceMatrix.array, 16 * t);
}
raycast(t, e) {
const n = this.matrixWorld,
i = this.count;
if (((ra.geometry = this.geometry), (ra.material = this.material), void 0 !== ra.material))
for (let r = 0; r < i; r++) {
this.getMatrixAt(r, ea), na.multiplyMatrices(n, ea), (ra.matrixWorld = na), ra.raycast(t, ia);
for (let t = 0, n = ia.length; t < n; t++) {
const n = ia[t];
(n.instanceId = r), (n.object = this), e.push(n);
}
ia.length = 0;
}
}
setColorAt(t, e) {
null === this.instanceColor && (this.instanceColor = new ta(new Float32Array(3 * this.instanceMatrix.count), 3)), e.toArray(this.instanceColor.array, 3 * t);
}
setMatrixAt(t, e) {
e.toArray(this.instanceMatrix.array, 16 * t);
}
updateMorphTargets() {}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
}
sa.prototype.isInstancedMesh = !0;
class aa extends Se {
constructor(t) {
super(), (this.type = "LineBasicMaterial"), (this.color = new Pe(16777215)), (this.linewidth = 1), (this.linecap = "round"), (this.linejoin = "round"), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.linewidth = t.linewidth), (this.linecap = t.linecap), (this.linejoin = t.linejoin), this;
}
}
aa.prototype.isLineBasicMaterial = !0;
const oa = new ht(),
la = new ht(),
ha = new Ht(),
ca = new Ut(),
ua = new Pt();
class da extends ue {
constructor(t = new qe(), e = new aa()) {
super(), (this.type = "Line"), (this.geometry = t), (this.material = e), this.updateMorphTargets();
}
copy(t) {
return super.copy(t), (this.material = t.material), (this.geometry = t.geometry), this;
}
computeLineDistances() {
const t = this.geometry;
if (t.isBufferGeometry)
if (null === t.index) {
const e = t.attributes.position,
n = [0];
for (let t = 1, i = e.count; t < i; t++) oa.fromBufferAttribute(e, t - 1), la.fromBufferAttribute(e, t), (n[t] = n[t - 1]), (n[t] += oa.distanceTo(la));
t.setAttribute("lineDistance", new Be(n, 1));
} else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
else t.isGeometry && console.error("THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
return this;
}
raycast(t, e) {
const n = this.geometry,
i = this.matrixWorld,
r = t.params.Line.threshold,
s = n.drawRange;
if ((null === n.boundingSphere && n.computeBoundingSphere(), ua.copy(n.boundingSphere), ua.applyMatrix4(i), (ua.radius += r), !1 === t.ray.intersectsSphere(ua))) return;
ha.copy(i).invert(), ca.copy(t.ray).applyMatrix4(ha);
const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3),
o = a * a,
l = new ht(),
h = new ht(),
c = new ht(),
u = new ht(),
d = this.isLineSegments ? 2 : 1;
if (n.isBufferGeometry) {
const i = n.index,
r = n.attributes.position;
if (null !== i) {
for (let n = Math.max(0, s.start), a = Math.min(i.count, s.start + s.count) - 1; n < a; n += d) {
const s = i.getX(n),
a = i.getX(n + 1);
l.fromBufferAttribute(r, s), h.fromBufferAttribute(r, a);
if (ca.distanceSqToSegment(l, h, u, c) > o) continue;
u.applyMatrix4(this.matrixWorld);
const d = t.ray.origin.distanceTo(u);
d < t.near || d > t.far || e.push({ distance: d, point: c.clone().applyMatrix4(this.matrixWorld), index: n, face: null, faceIndex: null, object: this });
}
} else {
for (let n = Math.max(0, s.start), i = Math.min(r.count, s.start + s.count) - 1; n < i; n += d) {
l.fromBufferAttribute(r, n), h.fromBufferAttribute(r, n + 1);
if (ca.distanceSqToSegment(l, h, u, c) > o) continue;
u.applyMatrix4(this.matrixWorld);
const i = t.ray.origin.distanceTo(u);
i < t.near || i > t.far || e.push({ distance: i, point: c.clone().applyMatrix4(this.matrixWorld), index: n, face: null, faceIndex: null, object: this });
}
}
} else n.isGeometry && console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
}
updateMorphTargets() {
const t = this.geometry;
if (t.isBufferGeometry) {
const e = t.morphAttributes,
n = Object.keys(e);
if (n.length > 0) {
const t = e[n[0]];
if (void 0 !== t) {
(this.morphTargetInfluences = []), (this.morphTargetDictionary = {});
for (let e = 0, n = t.length; e < n; e++) {
const n = t[e].name || String(e);
this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e);
}
}
}
} else {
const e = t.morphTargets;
void 0 !== e && e.length > 0 && console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.");
}
}
}
da.prototype.isLine = !0;
const pa = new ht(),
ma = new ht();
class fa extends da {
constructor(t, e) {
super(t, e), (this.type = "LineSegments");
}
computeLineDistances() {
const t = this.geometry;
if (t.isBufferGeometry)
if (null === t.index) {
const e = t.attributes.position,
n = [];
for (let t = 0, i = e.count; t < i; t += 2) pa.fromBufferAttribute(e, t), ma.fromBufferAttribute(e, t + 1), (n[t] = 0 === t ? 0 : n[t - 1]), (n[t + 1] = n[t] + pa.distanceTo(ma));
t.setAttribute("lineDistance", new Be(n, 1));
} else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
else t.isGeometry && console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
return this;
}
}
fa.prototype.isLineSegments = !0;
class ga extends da {
constructor(t, e) {
super(t, e), (this.type = "LineLoop");
}
}
ga.prototype.isLineLoop = !0;
class va extends Se {
constructor(t) {
super(), (this.type = "PointsMaterial"), (this.color = new Pe(16777215)), (this.map = null), (this.alphaMap = null), (this.size = 1), (this.sizeAttenuation = !0), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.size = t.size), (this.sizeAttenuation = t.sizeAttenuation), this;
}
}
va.prototype.isPointsMaterial = !0;
const xa = new Ht(),
ya = new Ut(),
_a = new Pt(),
ba = new ht();
class wa extends ue {
constructor(t = new qe(), e = new va()) {
super(), (this.type = "Points"), (this.geometry = t), (this.material = e), this.updateMorphTargets();
}
copy(t) {
return super.copy(t), (this.material = t.material), (this.geometry = t.geometry), this;
}
raycast(t, e) {
const n = this.geometry,
i = this.matrixWorld,
r = t.params.Points.threshold,
s = n.drawRange;
if ((null === n.boundingSphere && n.computeBoundingSphere(), _a.copy(n.boundingSphere), _a.applyMatrix4(i), (_a.radius += r), !1 === t.ray.intersectsSphere(_a))) return;
xa.copy(i).invert(), ya.copy(t.ray).applyMatrix4(xa);
const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3),
o = a * a;
if (n.isBufferGeometry) {
const r = n.index,
a = n.attributes.position;
if (null !== r) {
for (let n = Math.max(0, s.start), l = Math.min(r.count, s.start + s.count); n < l; n++) {
const s = r.getX(n);
ba.fromBufferAttribute(a, s), Ma(ba, s, o, i, t, e, this);
}
} else {
for (let n = Math.max(0, s.start), r = Math.min(a.count, s.start + s.count); n < r; n++) ba.fromBufferAttribute(a, n), Ma(ba, n, o, i, t, e, this);
}
} else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
}
updateMorphTargets() {
const t = this.geometry;
if (t.isBufferGeometry) {
const e = t.morphAttributes,
n = Object.keys(e);
if (n.length > 0) {
const t = e[n[0]];
if (void 0 !== t) {
(this.morphTargetInfluences = []), (this.morphTargetDictionary = {});
for (let e = 0, n = t.length; e < n; e++) {
const n = t[e].name || String(e);
this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e);
}
}
}
} else {
const e = t.morphTargets;
void 0 !== e && e.length > 0 && console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.");
}
}
}
function Ma(t, e, n, i, r, s, a) {
const o = ya.distanceSqToPoint(t);
if (o < n) {
const n = new ht();
ya.closestPointToPoint(t, n), n.applyMatrix4(i);
const l = r.ray.origin.distanceTo(n);
if (l < r.near || l > r.far) return;
s.push({ distance: l, distanceToRay: Math.sqrt(o), point: n, index: e, face: null, object: a });
}
}
wa.prototype.isPoints = !0;
(class extends it {
constructor(t, e, n, i, r, s, a, o, l) {
super(t, e, n, i, r, s, a, o, l), (this.format = void 0 !== a ? a : M), (this.minFilter = void 0 !== s ? s : f), (this.magFilter = void 0 !== r ? r : f), (this.generateMipmaps = !1);
const h = this;
"requestVideoFrameCallback" in t &&
t.requestVideoFrameCallback(function e() {
(h.needsUpdate = !0), t.requestVideoFrameCallback(e);
});
}
clone() {
return new this.constructor(this.image).copy(this);
}
update() {
const t = this.image;
!1 === "requestVideoFrameCallback" in t && t.readyState >= t.HAVE_CURRENT_DATA && (this.needsUpdate = !0);
}
}.prototype.isVideoTexture = !0);
(class extends it {
constructor(t, e, n) {
super({ width: t, height: e }), (this.format = n), (this.magFilter = d), (this.minFilter = d), (this.generateMipmaps = !1), (this.needsUpdate = !0);
}
}.prototype.isFramebufferTexture = !0);
class Sa extends it {
constructor(t, e, n, i, r, s, a, o, l, h, c, u) {
super(null, s, a, o, l, h, i, r, c, u), (this.image = { width: e, height: n }), (this.mipmaps = t), (this.flipY = !1), (this.generateMipmaps = !1);
}
}
Sa.prototype.isCompressedTexture = !0;
(class extends it {
constructor(t, e, n, i, r, s, a, o, l) {
super(t, e, n, i, r, s, a, o, l), (this.needsUpdate = !0);
}
}.prototype.isCanvasTexture = !0);
new ht(), new ht(), new ht(), new we();
class Ea {
constructor() {
(this.type = "Curve"), (this.arcLengthDivisions = 200);
}
getPoint() {
return console.warn("THREE.Curve: .getPoint() not implemented."), null;
}
getPointAt(t, e) {
const n = this.getUtoTmapping(t);
return this.getPoint(n, e);
}
getPoints(t = 5) {
const e = [];
for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t));
return e;
}
getSpacedPoints(t = 5) {
const e = [];
for (let n = 0; n <= t; n++) e.push(this.getPointAt(n / t));
return e;
}
getLength() {
const t = this.getLengths();
return t[t.length - 1];
}
getLengths(t = this.arcLengthDivisions) {
if (this.cacheArcLengths && this.cacheArcLengths.length === t + 1 && !this.needsUpdate) return this.cacheArcLengths;
this.needsUpdate = !1;
const e = [];
let n,
i = this.getPoint(0),
r = 0;
e.push(0);
for (let s = 1; s <= t; s++) (n = this.getPoint(s / t)), (r += n.distanceTo(i)), e.push(r), (i = n);
return (this.cacheArcLengths = e), e;
}
updateArcLengths() {
(this.needsUpdate = !0), this.getLengths();
}
getUtoTmapping(t, e) {
const n = this.getLengths();
let i = 0;
const r = n.length;
let s;
s = e || t * n[r - 1];
let a,
o = 0,
l = r - 1;
for (; o <= l; )
if (((i = Math.floor(o + (l - o) / 2)), (a = n[i] - s), a < 0)) o = i + 1;
else {
if (!(a > 0)) {
l = i;
break;
}
l = i - 1;
}
if (((i = l), n[i] === s)) return i / (r - 1);
const h = n[i];
return (i + (s - h) / (n[i + 1] - h)) / (r - 1);
}
getTangent(t, e) {
const n = 1e-4;
let i = t - n,
r = t + n;
i < 0 && (i = 0), r > 1 && (r = 1);
const s = this.getPoint(i),
a = this.getPoint(r),
o = e || (s.isVector2 ? new $() : new ht());
return o.copy(a).sub(s).normalize(), o;
}
getTangentAt(t, e) {
const n = this.getUtoTmapping(t);
return this.getTangent(n, e);
}
computeFrenetFrames(t, e) {
const n = new ht(),
i = [],
r = [],
s = [],
a = new ht(),
o = new Ht();
for (let e = 0; e <= t; e++) {
const n = e / t;
i[e] = this.getTangentAt(n, new ht());
}
(r[0] = new ht()), (s[0] = new ht());
let l = Number.MAX_VALUE;
const h = Math.abs(i[0].x),
c = Math.abs(i[0].y),
u = Math.abs(i[0].z);
h <= l && ((l = h), n.set(1, 0, 0)), c <= l && ((l = c), n.set(0, 1, 0)), u <= l && n.set(0, 0, 1), a.crossVectors(i[0], n).normalize(), r[0].crossVectors(i[0], a), s[0].crossVectors(i[0], r[0]);
for (let e = 1; e <= t; e++) {
if (((r[e] = r[e - 1].clone()), (s[e] = s[e - 1].clone()), a.crossVectors(i[e - 1], i[e]), a.length() > Number.EPSILON)) {
a.normalize();
const t = Math.acos(j(i[e - 1].dot(i[e]), -1, 1));
r[e].applyMatrix4(o.makeRotationAxis(a, t));
}
s[e].crossVectors(i[e], r[e]);
}
if (!0 === e) {
let e = Math.acos(j(r[0].dot(r[t]), -1, 1));
(e /= t), i[0].dot(a.crossVectors(r[0], r[t])) > 0 && (e = -e);
for (let n = 1; n <= t; n++) r[n].applyMatrix4(o.makeRotationAxis(i[n], e * n)), s[n].crossVectors(i[n], r[n]);
}
return { tangents: i, normals: r, binormals: s };
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return (this.arcLengthDivisions = t.arcLengthDivisions), this;
}
toJSON() {
const t = { metadata: { version: 4.5, type: "Curve", generator: "Curve.toJSON" } };
return (t.arcLengthDivisions = this.arcLengthDivisions), (t.type = this.type), t;
}
fromJSON(t) {
return (this.arcLengthDivisions = t.arcLengthDivisions), this;
}
}
class Ta extends Ea {
constructor(t = 0, e = 0, n = 1, i = 1, r = 0, s = 2 * Math.PI, a = !1, o = 0) {
super(), (this.type = "EllipseCurve"), (this.aX = t), (this.aY = e), (this.xRadius = n), (this.yRadius = i), (this.aStartAngle = r), (this.aEndAngle = s), (this.aClockwise = a), (this.aRotation = o);
}
getPoint(t, e) {
const n = e || new $(),
i = 2 * Math.PI;
let r = this.aEndAngle - this.aStartAngle;
const s = Math.abs(r) < Number.EPSILON;
for (; r < 0; ) r += i;
for (; r > i; ) r -= i;
r < Number.EPSILON && (r = s ? 0 : i), !0 !== this.aClockwise || s || (r === i ? (r = -i) : (r -= i));
const a = this.aStartAngle + t * r;
let o = this.aX + this.xRadius * Math.cos(a),
l = this.aY + this.yRadius * Math.sin(a);
if (0 !== this.aRotation) {
const t = Math.cos(this.aRotation),
e = Math.sin(this.aRotation),
n = o - this.aX,
i = l - this.aY;
(o = n * t - i * e + this.aX), (l = n * e + i * t + this.aY);
}
return n.set(o, l);
}
copy(t) {
return super.copy(t), (this.aX = t.aX), (this.aY = t.aY), (this.xRadius = t.xRadius), (this.yRadius = t.yRadius), (this.aStartAngle = t.aStartAngle), (this.aEndAngle = t.aEndAngle), (this.aClockwise = t.aClockwise), (this.aRotation = t.aRotation), this;
}
toJSON() {
const t = super.toJSON();
return (t.aX = this.aX), (t.aY = this.aY), (t.xRadius = this.xRadius), (t.yRadius = this.yRadius), (t.aStartAngle = this.aStartAngle), (t.aEndAngle = this.aEndAngle), (t.aClockwise = this.aClockwise), (t.aRotation = this.aRotation), t;
}
fromJSON(t) {
return super.fromJSON(t), (this.aX = t.aX), (this.aY = t.aY), (this.xRadius = t.xRadius), (this.yRadius = t.yRadius), (this.aStartAngle = t.aStartAngle), (this.aEndAngle = t.aEndAngle), (this.aClockwise = t.aClockwise), (this.aRotation = t.aRotation), this;
}
}
Ta.prototype.isEllipseCurve = !0;
class Aa extends Ta {
constructor(t, e, n, i, r, s) {
super(t, e, n, n, i, r, s), (this.type = "ArcCurve");
}
}
function La() {
let t = 0,
e = 0,
n = 0,
i = 0;
function r(r, s, a, o) {
(t = r), (e = a), (n = -3 * r + 3 * s - 2 * a - o), (i = 2 * r - 2 * s + a + o);
}
return {
initCatmullRom: function (t, e, n, i, s) {
r(e, n, s * (n - t), s * (i - e));
},
initNonuniformCatmullRom: function (t, e, n, i, s, a, o) {
let l = (e - t) / s - (n - t) / (s + a) + (n - e) / a,
h = (n - e) / a - (i - e) / (a + o) + (i - n) / o;
(l *= a), (h *= a), r(e, n, l, h);
},
calc: function (r) {
const s = r * r;
return t + e * r + n * s + i * (s * r);
},
};
}
Aa.prototype.isArcCurve = !0;
const Ca = new ht(),
Ra = new La(),
Pa = new La(),
Da = new La();
class Ia extends Ea {
constructor(t = [], e = !1, n = "centripetal", i = 0.5) {
super(), (this.type = "CatmullRomCurve3"), (this.points = t), (this.closed = e), (this.curveType = n), (this.tension = i);
}
getPoint(t, e = new ht()) {
const n = e,
i = this.points,
r = i.length,
s = (r - (this.closed ? 0 : 1)) * t;
let a,
o,
l = Math.floor(s),
h = s - l;
this.closed ? (l += l > 0 ? 0 : (Math.floor(Math.abs(l) / r) + 1) * r) : 0 === h && l === r - 1 && ((l = r - 2), (h = 1)), this.closed || l > 0 ? (a = i[(l - 1) % r]) : (Ca.subVectors(i[0], i[1]).add(i[0]), (a = Ca));
const c = i[l % r],
u = i[(l + 1) % r];
if ((this.closed || l + 2 < r ? (o = i[(l + 2) % r]) : (Ca.subVectors(i[r - 1], i[r - 2]).add(i[r - 1]), (o = Ca)), "centripetal" === this.curveType || "chordal" === this.curveType)) {
const t = "chordal" === this.curveType ? 0.5 : 0.25;
let e = Math.pow(a.distanceToSquared(c), t),
n = Math.pow(c.distanceToSquared(u), t),
i = Math.pow(u.distanceToSquared(o), t);
n < 1e-4 && (n = 1), e < 1e-4 && (e = n), i < 1e-4 && (i = n), Ra.initNonuniformCatmullRom(a.x, c.x, u.x, o.x, e, n, i), Pa.initNonuniformCatmullRom(a.y, c.y, u.y, o.y, e, n, i), Da.initNonuniformCatmullRom(a.z, c.z, u.z, o.z, e, n, i);
} else "catmullrom" === this.curveType && (Ra.initCatmullRom(a.x, c.x, u.x, o.x, this.tension), Pa.initCatmullRom(a.y, c.y, u.y, o.y, this.tension), Da.initCatmullRom(a.z, c.z, u.z, o.z, this.tension));
return n.set(Ra.calc(h), Pa.calc(h), Da.calc(h)), n;
}
copy(t) {
super.copy(t), (this.points = []);
for (let e = 0, n = t.points.length; e < n; e++) {
const n = t.points[e];
this.points.push(n.clone());
}
return (this.closed = t.closed), (this.curveType = t.curveType), (this.tension = t.tension), this;
}
toJSON() {
const t = super.toJSON();
t.points = [];
for (let e = 0, n = this.points.length; e < n; e++) {
const n = this.points[e];
t.points.push(n.toArray());
}
return (t.closed = this.closed), (t.curveType = this.curveType), (t.tension = this.tension), t;
}
fromJSON(t) {
super.fromJSON(t), (this.points = []);
for (let e = 0, n = t.points.length; e < n; e++) {
const n = t.points[e];
this.points.push(new ht().fromArray(n));
}
return (this.closed = t.closed), (this.curveType = t.curveType), (this.tension = t.tension), this;
}
}
function Na(t, e, n, i, r) {
const s = 0.5 * (i - e),
a = 0.5 * (r - n),
o = t * t;
return (2 * n - 2 * i + s + a) * (t * o) + (-3 * n + 3 * i - 2 * s - a) * o + s * t + n;
}
function za(t, e, n, i) {
return (
(function (t, e) {
const n = 1 - t;
return n * n * e;
})(t, e) +
(function (t, e) {
return 2 * (1 - t) * t * e;
})(t, n) +
(function (t, e) {
return t * t * e;
})(t, i)
);
}
function Oa(t, e, n, i, r) {
return (
(function (t, e) {
const n = 1 - t;
return n * n * n * e;
})(t, e) +
(function (t, e) {
const n = 1 - t;
return 3 * n * n * t * e;
})(t, n) +
(function (t, e) {
return 3 * (1 - t) * t * t * e;
})(t, i) +
(function (t, e) {
return t * t * t * e;
})(t, r)
);
}
Ia.prototype.isCatmullRomCurve3 = !0;
class Fa extends Ea {
constructor(t = new $(), e = new $(), n = new $(), i = new $()) {
super(), (this.type = "CubicBezierCurve"), (this.v0 = t), (this.v1 = e), (this.v2 = n), (this.v3 = i);
}
getPoint(t, e = new $()) {
const n = e,
i = this.v0,
r = this.v1,
s = this.v2,
a = this.v3;
return n.set(Oa(t, i.x, r.x, s.x, a.x), Oa(t, i.y, r.y, s.y, a.y)), n;
}
copy(t) {
return super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this;
}
toJSON() {
const t = super.toJSON();
return (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), (t.v3 = this.v3.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this;
}
}
Fa.prototype.isCubicBezierCurve = !0;
class Ba extends Ea {
constructor(t = new ht(), e = new ht(), n = new ht(), i = new ht()) {
super(), (this.type = "CubicBezierCurve3"), (this.v0 = t), (this.v1 = e), (this.v2 = n), (this.v3 = i);
}
getPoint(t, e = new ht()) {
const n = e,
i = this.v0,
r = this.v1,
s = this.v2,
a = this.v3;
return n.set(Oa(t, i.x, r.x, s.x, a.x), Oa(t, i.y, r.y, s.y, a.y), Oa(t, i.z, r.z, s.z, a.z)), n;
}
copy(t) {
return super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this;
}
toJSON() {
const t = super.toJSON();
return (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), (t.v3 = this.v3.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this;
}
}
Ba.prototype.isCubicBezierCurve3 = !0;
class Ua extends Ea {
constructor(t = new $(), e = new $()) {
super(), (this.type = "LineCurve"), (this.v1 = t), (this.v2 = e);
}
getPoint(t, e = new $()) {
const n = e;
return 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n;
}
getPointAt(t, e) {
return this.getPoint(t, e);
}
getTangent(t, e) {
const n = e || new $();
return n.copy(this.v2).sub(this.v1).normalize(), n;
}
copy(t) {
return super.copy(t), this.v1.copy(t.v1), this.v2.copy(t.v2), this;
}
toJSON() {
const t = super.toJSON();
return (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this;
}
}
Ua.prototype.isLineCurve = !0;
class Ha extends Ea {
constructor(t = new $(), e = new $(), n = new $()) {
super(), (this.type = "QuadraticBezierCurve"), (this.v0 = t), (this.v1 = e), (this.v2 = n);
}
getPoint(t, e = new $()) {
const n = e,
i = this.v0,
r = this.v1,
s = this.v2;
return n.set(za(t, i.x, r.x, s.x), za(t, i.y, r.y, s.y)), n;
}
copy(t) {
return super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this;
}
toJSON() {
const t = super.toJSON();
return (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this;
}
}
Ha.prototype.isQuadraticBezierCurve = !0;
class Va extends Ea {
constructor(t = new ht(), e = new ht(), n = new ht()) {
super(), (this.type = "QuadraticBezierCurve3"), (this.v0 = t), (this.v1 = e), (this.v2 = n);
}
getPoint(t, e = new ht()) {
const n = e,
i = this.v0,
r = this.v1,
s = this.v2;
return n.set(za(t, i.x, r.x, s.x), za(t, i.y, r.y, s.y), za(t, i.z, r.z, s.z)), n;
}
copy(t) {
return super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this;
}
toJSON() {
const t = super.toJSON();
return (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this;
}
}
Va.prototype.isQuadraticBezierCurve3 = !0;
class ka extends Ea {
constructor(t = []) {
super(), (this.type = "SplineCurve"), (this.points = t);
}
getPoint(t, e = new $()) {
const n = e,
i = this.points,
r = (i.length - 1) * t,
s = Math.floor(r),
a = r - s,
o = i[0 === s ? s : s - 1],
l = i[s],
h = i[s > i.length - 2 ? i.length - 1 : s + 1],
c = i[s > i.length - 3 ? i.length - 1 : s + 2];
return n.set(Na(a, o.x, l.x, h.x, c.x), Na(a, o.y, l.y, h.y, c.y)), n;
}
copy(t) {
super.copy(t), (this.points = []);
for (let e = 0, n = t.points.length; e < n; e++) {
const n = t.points[e];
this.points.push(n.clone());
}
return this;
}
toJSON() {
const t = super.toJSON();
t.points = [];
for (let e = 0, n = this.points.length; e < n; e++) {
const n = this.points[e];
t.points.push(n.toArray());
}
return t;
}
fromJSON(t) {
super.fromJSON(t), (this.points = []);
for (let e = 0, n = t.points.length; e < n; e++) {
const n = t.points[e];
this.points.push(new $().fromArray(n));
}
return this;
}
}
ka.prototype.isSplineCurve = !0;
var Ga = Object.freeze({
__proto__: null,
ArcCurve: Aa,
CatmullRomCurve3: Ia,
CubicBezierCurve: Fa,
CubicBezierCurve3: Ba,
EllipseCurve: Ta,
LineCurve: Ua,
LineCurve3: class extends Ea {
constructor(t = new ht(), e = new ht()) {
super(), (this.type = "LineCurve3"), (this.isLineCurve3 = !0), (this.v1 = t), (this.v2 = e);
}
getPoint(t, e = new ht()) {
const n = e;
return 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n;
}
getPointAt(t, e) {
return this.getPoint(t, e);
}
copy(t) {
return super.copy(t), this.v1.copy(t.v1), this.v2.copy(t.v2), this;
}
toJSON() {
const t = super.toJSON();
return (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this;
}
},
QuadraticBezierCurve: Ha,
QuadraticBezierCurve3: Va,
SplineCurve: ka,
});
class Wa extends Ea {
constructor() {
super(), (this.type = "CurvePath"), (this.curves = []), (this.autoClose = !1);
}
add(t) {
this.curves.push(t);
}
closePath() {
const t = this.curves[0].getPoint(0),
e = this.curves[this.curves.length - 1].getPoint(1);
t.equals(e) || this.curves.push(new Ua(e, t));
}
getPoint(t, e) {
const n = t * this.getLength(),
i = this.getCurveLengths();
let r = 0;
for (; r < i.length; ) {
if (i[r] >= n) {
const t = i[r] - n,
s = this.curves[r],
a = s.getLength(),
o = 0 === a ? 0 : 1 - t / a;
return s.getPointAt(o, e);
}
r++;
}
return null;
}
getLength() {
const t = this.getCurveLengths();
return t[t.length - 1];
}
updateArcLengths() {
(this.needsUpdate = !0), (this.cacheLengths = null), this.getCurveLengths();
}
getCurveLengths() {
if (this.cacheLengths && this.cacheLengths.length === this.curves.length) return this.cacheLengths;
const t = [];
let e = 0;
for (let n = 0, i = this.curves.length; n < i; n++) (e += this.curves[n].getLength()), t.push(e);
return (this.cacheLengths = t), t;
}
getSpacedPoints(t = 40) {
const e = [];
for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t));
return this.autoClose && e.push(e[0]), e;
}
getPoints(t = 12) {
const e = [];
let n;
for (let i = 0, r = this.curves; i < r.length; i++) {
const s = r[i],
a = s && s.isEllipseCurve ? 2 * t : s && (s.isLineCurve || s.isLineCurve3) ? 1 : s && s.isSplineCurve ? t * s.points.length : t,
o = s.getPoints(a);
for (let t = 0; t < o.length; t++) {
const i = o[t];
(n && n.equals(i)) || (e.push(i), (n = i));
}
}
return this.autoClose && e.length > 1 && !e[e.length - 1].equals(e[0]) && e.push(e[0]), e;
}
copy(t) {
super.copy(t), (this.curves = []);
for (let e = 0, n = t.curves.length; e < n; e++) {
const n = t.curves[e];
this.curves.push(n.clone());
}
return (this.autoClose = t.autoClose), this;
}
toJSON() {
const t = super.toJSON();
(t.autoClose = this.autoClose), (t.curves = []);
for (let e = 0, n = this.curves.length; e < n; e++) {
const n = this.curves[e];
t.curves.push(n.toJSON());
}
return t;
}
fromJSON(t) {
super.fromJSON(t), (this.autoClose = t.autoClose), (this.curves = []);
for (let e = 0, n = t.curves.length; e < n; e++) {
const n = t.curves[e];
this.curves.push(new Ga[n.type]().fromJSON(n));
}
return this;
}
}
class ja extends Wa {
constructor(t) {
super(), (this.type = "Path"), (this.currentPoint = new $()), t && this.setFromPoints(t);
}
setFromPoints(t) {
this.moveTo(t[0].x, t[0].y);
for (let e = 1, n = t.length; e < n; e++) this.lineTo(t[e].x, t[e].y);
return this;
}
moveTo(t, e) {
return this.currentPoint.set(t, e), this;
}
lineTo(t, e) {
const n = new Ua(this.currentPoint.clone(), new $(t, e));
return this.curves.push(n), this.currentPoint.set(t, e), this;
}
quadraticCurveTo(t, e, n, i) {
const r = new Ha(this.currentPoint.clone(), new $(t, e), new $(n, i));
return this.curves.push(r), this.currentPoint.set(n, i), this;
}
bezierCurveTo(t, e, n, i, r, s) {
const a = new Fa(this.currentPoint.clone(), new $(t, e), new $(n, i), new $(r, s));
return this.curves.push(a), this.currentPoint.set(r, s), this;
}
splineThru(t) {
const e = [this.currentPoint.clone()].concat(t),
n = new ka(e);
return this.curves.push(n), this.currentPoint.copy(t[t.length - 1]), this;
}
arc(t, e, n, i, r, s) {
const a = this.currentPoint.x,
o = this.currentPoint.y;
return this.absarc(t + a, e + o, n, i, r, s), this;
}
absarc(t, e, n, i, r, s) {
return this.absellipse(t, e, n, n, i, r, s), this;
}
ellipse(t, e, n, i, r, s, a, o) {
const l = this.currentPoint.x,
h = this.currentPoint.y;
return this.absellipse(t + l, e + h, n, i, r, s, a, o), this;
}
absellipse(t, e, n, i, r, s, a, o) {
const l = new Ta(t, e, n, i, r, s, a, o);
if (this.curves.length > 0) {
const t = l.getPoint(0);
t.equals(this.currentPoint) || this.lineTo(t.x, t.y);
}
this.curves.push(l);
const h = l.getPoint(1);
return this.currentPoint.copy(h), this;
}
copy(t) {
return super.copy(t), this.currentPoint.copy(t.currentPoint), this;
}
toJSON() {
const t = super.toJSON();
return (t.currentPoint = this.currentPoint.toArray()), t;
}
fromJSON(t) {
return super.fromJSON(t), this.currentPoint.fromArray(t.currentPoint), this;
}
}
class qa extends ja {
constructor(t) {
super(t), (this.uuid = W()), (this.type = "Shape"), (this.holes = []);
}
getPointsHoles(t) {
const e = [];
for (let n = 0, i = this.holes.length; n < i; n++) e[n] = this.holes[n].getPoints(t);
return e;
}
extractPoints(t) {
return { shape: this.getPoints(t), holes: this.getPointsHoles(t) };
}
copy(t) {
super.copy(t), (this.holes = []);
for (let e = 0, n = t.holes.length; e < n; e++) {
const n = t.holes[e];
this.holes.push(n.clone());
}
return this;
}
toJSON() {
const t = super.toJSON();
(t.uuid = this.uuid), (t.holes = []);
for (let e = 0, n = this.holes.length; e < n; e++) {
const n = this.holes[e];
t.holes.push(n.toJSON());
}
return t;
}
fromJSON(t) {
super.fromJSON(t), (this.uuid = t.uuid), (this.holes = []);
for (let e = 0, n = t.holes.length; e < n; e++) {
const n = t.holes[e];
this.holes.push(new ja().fromJSON(n));
}
return this;
}
}
const Xa = function (t, e, n = 2) {
const i = e && e.length,
r = i ? e[0] * n : t.length;
let s = Ya(t, 0, r, n, !0);
const a = [];
if (!s || s.next === s.prev) return a;
let o, l, h, c, u, d, p;
if (
(i &&
(s = (function (t, e, n, i) {
const r = [];
let s, a, o, l, h;
for (s = 0, a = e.length; s < a; s++) (o = e[s] * i), (l = s < a - 1 ? e[s + 1] * i : t.length), (h = Ya(t, o, l, i, !1)), h === h.next && (h.steiner = !0), r.push(so(h));
for (r.sort(eo), s = 0; s < r.length; s++) no(r[s], n), (n = Ja(n, n.next));
return n;
})(t, e, s, n)),
t.length > 80 * n)
) {
(o = h = t[0]), (l = c = t[1]);
for (let e = n; e < r; e += n) (u = t[e]), (d = t[e + 1]), u < o && (o = u), d < l && (l = d), u > h && (h = u), d > c && (c = d);
(p = Math.max(h - o, c - l)), (p = 0 !== p ? 1 / p : 0);
}
return $a(s, a, n, o, l, p), a;
};
function Ya(t, e, n, i, r) {
let s, a;
if (
r ===
(function (t, e, n, i) {
let r = 0;
for (let s = e, a = n - i; s < n; s += i) (r += (t[a] - t[s]) * (t[s + 1] + t[a + 1])), (a = s);
return r;
})(t, e, n, i) >
0
)
for (s = e; s < n; s += i) a = go(s, t[s], t[s + 1], a);
else for (s = n - i; s >= e; s -= i) a = go(s, t[s], t[s + 1], a);
return a && ho(a, a.next) && (vo(a), (a = a.next)), a;
}
function Ja(t, e) {
if (!t) return t;
e || (e = t);
let n,
i = t;
do {
if (((n = !1), i.steiner || (!ho(i, i.next) && 0 !== lo(i.prev, i, i.next)))) i = i.next;
else {
if ((vo(i), (i = e = i.prev), i === i.next)) break;
n = !0;
}
} while (n || i !== e);
return e;
}
function $a(t, e, n, i, r, s, a) {
if (!t) return;
!a &&
s &&
(function (t, e, n, i) {
let r = t;
do {
null === r.z && (r.z = ro(r.x, r.y, e, n, i)), (r.prevZ = r.prev), (r.nextZ = r.next), (r = r.next);
} while (r !== t);
(r.prevZ.nextZ = null),
(r.prevZ = null),
(function (t) {
let e,
n,
i,
r,
s,
a,
o,
l,
h = 1;
do {
for (n = t, t = null, s = null, a = 0; n; ) {
for (a++, i = n, o = 0, e = 0; e < h && (o++, (i = i.nextZ), i); e++);
for (l = h; o > 0 || (l > 0 && i); ) 0 !== o && (0 === l || !i || n.z <= i.z) ? ((r = n), (n = n.nextZ), o--) : ((r = i), (i = i.nextZ), l--), s ? (s.nextZ = r) : (t = r), (r.prevZ = s), (s = r);
n = i;
}
(s.nextZ = null), (h *= 2);
} while (a > 1);
})(r);
})(t, i, r, s);
let o,
l,
h = t;
for (; t.prev !== t.next; )
if (((o = t.prev), (l = t.next), s ? Qa(t, i, r, s) : Za(t))) e.push(o.i / n), e.push(t.i / n), e.push(l.i / n), vo(t), (t = l.next), (h = l.next);
else if ((t = l) === h) {
a ? (1 === a ? $a((t = Ka(Ja(t), e, n)), e, n, i, r, s, 2) : 2 === a && to(t, e, n, i, r, s)) : $a(Ja(t), e, n, i, r, s, 1);
break;
}
}
function Za(t) {
const e = t.prev,
n = t,
i = t.next;
if (lo(e, n, i) >= 0) return !1;
let r = t.next.next;
for (; r !== t.prev; ) {
if (ao(e.x, e.y, n.x, n.y, i.x, i.y, r.x, r.y) && lo(r.prev, r, r.next) >= 0) return !1;
r = r.next;
}
return !0;
}
function Qa(t, e, n, i) {
const r = t.prev,
s = t,
a = t.next;
if (lo(r, s, a) >= 0) return !1;
const o = r.x < s.x ? (r.x < a.x ? r.x : a.x) : s.x < a.x ? s.x : a.x,
l = r.y < s.y ? (r.y < a.y ? r.y : a.y) : s.y < a.y ? s.y : a.y,
h = r.x > s.x ? (r.x > a.x ? r.x : a.x) : s.x > a.x ? s.x : a.x,
c = r.y > s.y ? (r.y > a.y ? r.y : a.y) : s.y > a.y ? s.y : a.y,
u = ro(o, l, e, n, i),
d = ro(h, c, e, n, i);
let p = t.prevZ,
m = t.nextZ;
for (; p && p.z >= u && m && m.z <= d; ) {
if (p !== t.prev && p !== t.next && ao(r.x, r.y, s.x, s.y, a.x, a.y, p.x, p.y) && lo(p.prev, p, p.next) >= 0) return !1;
if (((p = p.prevZ), m !== t.prev && m !== t.next && ao(r.x, r.y, s.x, s.y, a.x, a.y, m.x, m.y) && lo(m.prev, m, m.next) >= 0)) return !1;
m = m.nextZ;
}
for (; p && p.z >= u; ) {
if (p !== t.prev && p !== t.next && ao(r.x, r.y, s.x, s.y, a.x, a.y, p.x, p.y) && lo(p.prev, p, p.next) >= 0) return !1;
p = p.prevZ;
}
for (; m && m.z <= d; ) {
if (m !== t.prev && m !== t.next && ao(r.x, r.y, s.x, s.y, a.x, a.y, m.x, m.y) && lo(m.prev, m, m.next) >= 0) return !1;
m = m.nextZ;
}
return !0;
}
function Ka(t, e, n) {
let i = t;
do {
const r = i.prev,
s = i.next.next;
!ho(r, s) && co(r, i, i.next, s) && mo(r, s) && mo(s, r) && (e.push(r.i / n), e.push(i.i / n), e.push(s.i / n), vo(i), vo(i.next), (i = t = s)), (i = i.next);
} while (i !== t);
return Ja(i);
}
function to(t, e, n, i, r, s) {
let a = t;
do {
let t = a.next.next;
for (; t !== a.prev; ) {
if (a.i !== t.i && oo(a, t)) {
let o = fo(a, t);
return (a = Ja(a, a.next)), (o = Ja(o, o.next)), $a(a, e, n, i, r, s), void $a(o, e, n, i, r, s);
}
t = t.next;
}
a = a.next;
} while (a !== t);
}
function eo(t, e) {
return t.x - e.x;
}
function no(t, e) {
if (
((e = (function (t, e) {
let n = e;
const i = t.x,
r = t.y;
let s,
a = -1 / 0;
do {
if (r <= n.y && r >= n.next.y && n.next.y !== n.y) {
const t = n.x + ((r - n.y) * (n.next.x - n.x)) / (n.next.y - n.y);
if (t <= i && t > a) {
if (((a = t), t === i)) {
if (r === n.y) return n;
if (r === n.next.y) return n.next;
}
s = n.x < n.next.x ? n : n.next;
}
}
n = n.next;
} while (n !== e);
if (!s) return null;
if (i === a) return s;
const o = s,
l = s.x,
h = s.y;
let c,
u = 1 / 0;
n = s;
do {
i >= n.x && n.x >= l && i !== n.x && ao(r < h ? i : a, r, l, h, r < h ? a : i, r, n.x, n.y) && ((c = Math.abs(r - n.y) / (i - n.x)), mo(n, t) && (c < u || (c === u && (n.x > s.x || (n.x === s.x && io(s, n))))) && ((s = n), (u = c))), (n = n.next);
} while (n !== o);
return s;
})(t, e)),
e)
) {
const n = fo(e, t);
Ja(e, e.next), Ja(n, n.next);
}
}
function io(t, e) {
return lo(t.prev, t, e.prev) < 0 && lo(e.next, t, t.next) < 0;
}
function ro(t, e, n, i, r) {
return (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - n) * r) | (t << 8))) | (t << 4))) | (t << 2))) | (t << 1))) | ((e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - i) * r) | (e << 8))) | (e << 4))) | (e << 2))) | (e << 1))) << 1);
}
function so(t) {
let e = t,
n = t;
do {
(e.x < n.x || (e.x === n.x && e.y < n.y)) && (n = e), (e = e.next);
} while (e !== t);
return n;
}
function ao(t, e, n, i, r, s, a, o) {
return (r - a) * (e - o) - (t - a) * (s - o) >= 0 && (t - a) * (i - o) - (n - a) * (e - o) >= 0 && (n - a) * (s - o) - (r - a) * (i - o) >= 0;
}
function oo(t, e) {
return (
t.next.i !== e.i &&
t.prev.i !== e.i &&
!(function (t, e) {
let n = t;
do {
if (n.i !== t.i && n.next.i !== t.i && n.i !== e.i && n.next.i !== e.i && co(n, n.next, t, e)) return !0;
n = n.next;
} while (n !== t);
return !1;
})(t, e) &&
((mo(t, e) &&
mo(e, t) &&
(function (t, e) {
let n = t,
i = !1;
const r = (t.x + e.x) / 2,
s = (t.y + e.y) / 2;
do {
n.y > s != n.next.y > s && n.next.y !== n.y && r < ((n.next.x - n.x) * (s - n.y)) / (n.next.y - n.y) + n.x && (i = !i), (n = n.next);
} while (n !== t);
return i;
})(t, e) &&
(lo(t.prev, t, e.prev) || lo(t, e.prev, e))) ||
(ho(t, e) && lo(t.prev, t, t.next) > 0 && lo(e.prev, e, e.next) > 0))
);
}
function lo(t, e, n) {
return (e.y - t.y) * (n.x - e.x) - (e.x - t.x) * (n.y - e.y);
}
function ho(t, e) {
return t.x === e.x && t.y === e.y;
}
function co(t, e, n, i) {
const r = po(lo(t, e, n)),
s = po(lo(t, e, i)),
a = po(lo(n, i, t)),
o = po(lo(n, i, e));
return (r !== s && a !== o) || !(0 !== r || !uo(t, n, e)) || !(0 !== s || !uo(t, i, e)) || !(0 !== a || !uo(n, t, i)) || !(0 !== o || !uo(n, e, i));
}
function uo(t, e, n) {
return e.x <= Math.max(t.x, n.x) && e.x >= Math.min(t.x, n.x) && e.y <= Math.max(t.y, n.y) && e.y >= Math.min(t.y, n.y);
}
function po(t) {
return t > 0 ? 1 : t < 0 ? -1 : 0;
}
function mo(t, e) {
return lo(t.prev, t, t.next) < 0 ? lo(t, e, t.next) >= 0 && lo(t, t.prev, e) >= 0 : lo(t, e, t.prev) < 0 || lo(t, t.next, e) < 0;
}
function fo(t, e) {
const n = new xo(t.i, t.x, t.y),
i = new xo(e.i, e.x, e.y),
r = t.next,
s = e.prev;
return (t.next = e), (e.prev = t), (n.next = r), (r.prev = n), (i.next = n), (n.prev = i), (s.next = i), (i.prev = s), i;
}
function go(t, e, n, i) {
const r = new xo(t, e, n);
return i ? ((r.next = i.next), (r.prev = i), (i.next.prev = r), (i.next = r)) : ((r.prev = r), (r.next = r)), r;
}
function vo(t) {
(t.next.prev = t.prev), (t.prev.next = t.next), t.prevZ && (t.prevZ.nextZ = t.nextZ), t.nextZ && (t.nextZ.prevZ = t.prevZ);
}
function xo(t, e, n) {
(this.i = t), (this.x = e), (this.y = n), (this.prev = null), (this.next = null), (this.z = null), (this.prevZ = null), (this.nextZ = null), (this.steiner = !1);
}
class yo {
static area(t) {
const e = t.length;
let n = 0;
for (let i = e - 1, r = 0; r < e; i = r++) n += t[i].x * t[r].y - t[r].x * t[i].y;
return 0.5 * n;
}
static isClockWise(t) {
return yo.area(t) < 0;
}
static triangulateShape(t, e) {
const n = [],
i = [],
r = [];
_o(t), bo(n, t);
let s = t.length;
e.forEach(_o);
for (let t = 0; t < e.length; t++) i.push(s), (s += e[t].length), bo(n, e[t]);
const a = Xa(n, i);
for (let t = 0; t < a.length; t += 3) r.push(a.slice(t, t + 3));
return r;
}
}
function _o(t) {
const e = t.length;
e > 2 && t[e - 1].equals(t[0]) && t.pop();
}
function bo(t, e) {
for (let n = 0; n < e.length; n++) t.push(e[n].x), t.push(e[n].y);
}
class wo extends qe {
constructor(t = new qa([new $(0.5, 0.5), new $(-0.5, 0.5), new $(-0.5, -0.5), new $(0.5, -0.5)]), e = {}) {
super(), (this.type = "ExtrudeGeometry"), (this.parameters = { shapes: t, options: e }), (t = Array.isArray(t) ? t : [t]);
const n = this,
i = [],
r = [];
for (let e = 0, n = t.length; e < n; e++) {
s(t[e]);
}
function s(t) {
const s = [],
a = void 0 !== e.curveSegments ? e.curveSegments : 12,
o = void 0 !== e.steps ? e.steps : 1;
let l = void 0 !== e.depth ? e.depth : 1,
h = void 0 === e.bevelEnabled || e.bevelEnabled,
c = void 0 !== e.bevelThickness ? e.bevelThickness : 0.2,
u = void 0 !== e.bevelSize ? e.bevelSize : c - 0.1,
d = void 0 !== e.bevelOffset ? e.bevelOffset : 0,
p = void 0 !== e.bevelSegments ? e.bevelSegments : 3;
const m = e.extrudePath,
f = void 0 !== e.UVGenerator ? e.UVGenerator : Mo;
void 0 !== e.amount && (console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."), (l = e.amount));
let g,
v,
x,
y,
_,
b = !1;
m && ((g = m.getSpacedPoints(o)), (b = !0), (h = !1), (v = m.computeFrenetFrames(o, !1)), (x = new ht()), (y = new ht()), (_ = new ht())), h || ((p = 0), (c = 0), (u = 0), (d = 0));
const w = t.extractPoints(a);
let M = w.shape;
const S = w.holes;
if (!yo.isClockWise(M)) {
M = M.reverse();
for (let t = 0, e = S.length; t < e; t++) {
const e = S[t];
yo.isClockWise(e) && (S[t] = e.reverse());
}
}
const E = yo.triangulateShape(M, S),
T = M;
for (let t = 0, e = S.length; t < e; t++) {
const e = S[t];
M = M.concat(e);
}
function A(t, e, n) {
return e || console.error("THREE.ExtrudeGeometry: vec does not exist"), e.clone().multiplyScalar(n).add(t);
}
const L = M.length,
C = E.length;
function R(t, e, n) {
let i, r, s;
const a = t.x - e.x,
o = t.y - e.y,
l = n.x - t.x,
h = n.y - t.y,
c = a * a + o * o,
u = a * h - o * l;
if (Math.abs(u) > Number.EPSILON) {
const u = Math.sqrt(c),
d = Math.sqrt(l * l + h * h),
p = e.x - o / u,
m = e.y + a / u,
f = ((n.x - h / d - p) * h - (n.y + l / d - m) * l) / (a * h - o * l);
(i = p + a * f - t.x), (r = m + o * f - t.y);
const g = i * i + r * r;
if (g <= 2) return new $(i, r);
s = Math.sqrt(g / 2);
} else {
let t = !1;
a > Number.EPSILON ? l > Number.EPSILON && (t = !0) : a < -Number.EPSILON ? l < -Number.EPSILON && (t = !0) : Math.sign(o) === Math.sign(h) && (t = !0), t ? ((i = -o), (r = a), (s = Math.sqrt(c))) : ((i = a), (r = o), (s = Math.sqrt(c / 2)));
}
return new $(i / s, r / s);
}
const P = [];
for (let t = 0, e = T.length, n = e - 1, i = t + 1; t < e; t++, n++, i++) n === e && (n = 0), i === e && (i = 0), (P[t] = R(T[t], T[n], T[i]));
const D = [];
let I,
N = P.concat();
for (let t = 0, e = S.length; t < e; t++) {
const e = S[t];
I = [];
for (let t = 0, n = e.length, i = n - 1, r = t + 1; t < n; t++, i++, r++) i === n && (i = 0), r === n && (r = 0), (I[t] = R(e[t], e[i], e[r]));
D.push(I), (N = N.concat(I));
}
for (let t = 0; t < p; t++) {
const e = t / p,
n = c * Math.cos((e * Math.PI) / 2),
i = u * Math.sin((e * Math.PI) / 2) + d;
for (let t = 0, e = T.length; t < e; t++) {
const e = A(T[t], P[t], i);
F(e.x, e.y, -n);
}
for (let t = 0, e = S.length; t < e; t++) {
const e = S[t];
I = D[t];
for (let t = 0, r = e.length; t < r; t++) {
const r = A(e[t], I[t], i);
F(r.x, r.y, -n);
}
}
}
const z = u + d;
for (let t = 0; t < L; t++) {
const e = h ? A(M[t], N[t], z) : M[t];
b ? (y.copy(v.normals[0]).multiplyScalar(e.x), x.copy(v.binormals[0]).multiplyScalar(e.y), _.copy(g[0]).add(y).add(x), F(_.x, _.y, _.z)) : F(e.x, e.y, 0);
}
for (let t = 1; t <= o; t++)
for (let e = 0; e < L; e++) {
const n = h ? A(M[e], N[e], z) : M[e];
b ? (y.copy(v.normals[t]).multiplyScalar(n.x), x.copy(v.binormals[t]).multiplyScalar(n.y), _.copy(g[t]).add(y).add(x), F(_.x, _.y, _.z)) : F(n.x, n.y, (l / o) * t);
}
for (let t = p - 1; t >= 0; t--) {
const e = t / p,
n = c * Math.cos((e * Math.PI) / 2),
i = u * Math.sin((e * Math.PI) / 2) + d;
for (let t = 0, e = T.length; t < e; t++) {
const e = A(T[t], P[t], i);
F(e.x, e.y, l + n);
}
for (let t = 0, e = S.length; t < e; t++) {
const e = S[t];
I = D[t];
for (let t = 0, r = e.length; t < r; t++) {
const r = A(e[t], I[t], i);
b ? F(r.x, r.y + g[o - 1].y, g[o - 1].x + n) : F(r.x, r.y, l + n);
}
}
}
function O(t, e) {
let n = t.length;
for (; --n >= 0; ) {
const i = n;
let r = n - 1;
r < 0 && (r = t.length - 1);
for (let t = 0, n = o + 2 * p; t < n; t++) {
const n = L * t,
s = L * (t + 1);
U(e + i + n, e + r + n, e + r + s, e + i + s);
}
}
}
function F(t, e, n) {
s.push(t), s.push(e), s.push(n);
}
function B(t, e, r) {
H(t), H(e), H(r);
const s = i.length / 3,
a = f.generateTopUV(n, i, s - 3, s - 2, s - 1);
V(a[0]), V(a[1]), V(a[2]);
}
function U(t, e, r, s) {
H(t), H(e), H(s), H(e), H(r), H(s);
const a = i.length / 3,
o = f.generateSideWallUV(n, i, a - 6, a - 3, a - 2, a - 1);
V(o[0]), V(o[1]), V(o[3]), V(o[1]), V(o[2]), V(o[3]);
}
function H(t) {
i.push(s[3 * t + 0]), i.push(s[3 * t + 1]), i.push(s[3 * t + 2]);
}
function V(t) {
r.push(t.x), r.push(t.y);
}
!(function () {
const t = i.length / 3;
if (h) {
let t = 0,
e = L * t;
for (let t = 0; t < C; t++) {
const n = E[t];
B(n[2] + e, n[1] + e, n[0] + e);
}
(t = o + 2 * p), (e = L * t);
for (let t = 0; t < C; t++) {
const n = E[t];
B(n[0] + e, n[1] + e, n[2] + e);
}
} else {
for (let t = 0; t < C; t++) {
const e = E[t];
B(e[2], e[1], e[0]);
}
for (let t = 0; t < C; t++) {
const e = E[t];
B(e[0] + L * o, e[1] + L * o, e[2] + L * o);
}
}
n.addGroup(t, i.length / 3 - t, 0);
})(),
(function () {
const t = i.length / 3;
let e = 0;
O(T, e), (e += T.length);
for (let t = 0, n = S.length; t < n; t++) {
const n = S[t];
O(n, e), (e += n.length);
}
n.addGroup(t, i.length / 3 - t, 1);
})();
}
this.setAttribute("position", new Be(i, 3)), this.setAttribute("uv", new Be(r, 2)), this.computeVertexNormals();
}
toJSON() {
const t = super.toJSON();
return (function (t, e, n) {
if (((n.shapes = []), Array.isArray(t)))
for (let e = 0, i = t.length; e < i; e++) {
const i = t[e];
n.shapes.push(i.uuid);
}
else n.shapes.push(t.uuid);
void 0 !== e.extrudePath && (n.options.extrudePath = e.extrudePath.toJSON());
return n;
})(this.parameters.shapes, this.parameters.options, t);
}
static fromJSON(t, e) {
const n = [];
for (let i = 0, r = t.shapes.length; i < r; i++) {
const r = e[t.shapes[i]];
n.push(r);
}
const i = t.options.extrudePath;
return void 0 !== i && (t.options.extrudePath = new Ga[i.type]().fromJSON(i)), new wo(n, t.options);
}
}
const Mo = {
generateTopUV: function (t, e, n, i, r) {
const s = e[3 * n],
a = e[3 * n + 1],
o = e[3 * i],
l = e[3 * i + 1],
h = e[3 * r],
c = e[3 * r + 1];
return [new $(s, a), new $(o, l), new $(h, c)];
},
generateSideWallUV: function (t, e, n, i, r, s) {
const a = e[3 * n],
o = e[3 * n + 1],
l = e[3 * n + 2],
h = e[3 * i],
c = e[3 * i + 1],
u = e[3 * i + 2],
d = e[3 * r],
p = e[3 * r + 1],
m = e[3 * r + 2],
f = e[3 * s],
g = e[3 * s + 1],
v = e[3 * s + 2];
return Math.abs(o - c) < Math.abs(a - h) ? [new $(a, 1 - l), new $(h, 1 - u), new $(d, 1 - m), new $(f, 1 - v)] : [new $(o, 1 - l), new $(c, 1 - u), new $(p, 1 - m), new $(g, 1 - v)];
},
};
class So extends qe {
constructor(t = new qa([new $(0, 0.5), new $(-0.5, -0.5), new $(0.5, -0.5)]), e = 12) {
super(), (this.type = "ShapeGeometry"), (this.parameters = { shapes: t, curveSegments: e });
const n = [],
i = [],
r = [],
s = [];
let a = 0,
o = 0;
if (!1 === Array.isArray(t)) l(t);
else for (let e = 0; e < t.length; e++) l(t[e]), this.addGroup(a, o, e), (a += o), (o = 0);
function l(t) {
const a = i.length / 3,
l = t.extractPoints(e);
let h = l.shape;
const c = l.holes;
!1 === yo.isClockWise(h) && (h = h.reverse());
for (let t = 0, e = c.length; t < e; t++) {
const e = c[t];
!0 === yo.isClockWise(e) && (c[t] = e.reverse());
}
const u = yo.triangulateShape(h, c);
for (let t = 0, e = c.length; t < e; t++) {
const e = c[t];
h = h.concat(e);
}
for (let t = 0, e = h.length; t < e; t++) {
const e = h[t];
i.push(e.x, e.y, 0), r.push(0, 0, 1), s.push(e.x, e.y);
}
for (let t = 0, e = u.length; t < e; t++) {
const e = u[t],
i = e[0] + a,
r = e[1] + a,
s = e[2] + a;
n.push(i, r, s), (o += 3);
}
}
this.setIndex(n), this.setAttribute("position", new Be(i, 3)), this.setAttribute("normal", new Be(r, 3)), this.setAttribute("uv", new Be(s, 2));
}
toJSON() {
const t = super.toJSON();
return (function (t, e) {
if (((e.shapes = []), Array.isArray(t)))
for (let n = 0, i = t.length; n < i; n++) {
const i = t[n];
e.shapes.push(i.uuid);
}
else e.shapes.push(t.uuid);
return e;
})(this.parameters.shapes, t);
}
static fromJSON(t, e) {
const n = [];
for (let i = 0, r = t.shapes.length; i < r; i++) {
const r = e[t.shapes[i]];
n.push(r);
}
return new So(n, t.curveSegments);
}
}
class Eo extends Se {
constructor(t) {
super(), (this.type = "ShadowMaterial"), (this.color = new Pe(0)), (this.transparent = !0), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), this;
}
}
Eo.prototype.isShadowMaterial = !0;
class To extends Se {
constructor(t) {
super(), (this.defines = { STANDARD: "" }), (this.type = "MeshStandardMaterial"), (this.color = new Pe(16777215)), (this.roughness = 1), (this.metalness = 0), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new Pe(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new $(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.roughnessMap = null), (this.metalnessMap = null), (this.alphaMap = null), (this.envMap = null), (this.envMapIntensity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = "round"), (this.wireframeLinejoin = "round"), (this.flatShading = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), (this.defines = { STANDARD: "" }), this.color.copy(t.color), (this.roughness = t.roughness), (this.metalness = t.metalness), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.roughnessMap = t.roughnessMap), (this.metalnessMap = t.metalnessMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.envMapIntensity = t.envMapIntensity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.flatShading = t.flatShading), this;
}
}
To.prototype.isMeshStandardMaterial = !0;
class Ao extends To {
constructor(t) {
super(),
(this.defines = { STANDARD: "", PHYSICAL: "" }),
(this.type = "MeshPhysicalMaterial"),
(this.clearcoatMap = null),
(this.clearcoatRoughness = 0),
(this.clearcoatRoughnessMap = null),
(this.clearcoatNormalScale = new $(1, 1)),
(this.clearcoatNormalMap = null),
(this.ior = 1.5),
Object.defineProperty(this, "reflectivity", {
get: function () {
return j((2.5 * (this.ior - 1)) / (this.ior + 1), 0, 1);
},
set: function (t) {
this.ior = (1 + 0.4 * t) / (1 - 0.4 * t);
},
}),
(this.sheenColor = new Pe(0)),
(this.sheenColorMap = null),
(this.sheenRoughness = 1),
(this.sheenRoughnessMap = null),
(this.transmissionMap = null),
(this.thickness = 0),
(this.thicknessMap = null),
(this.attenuationDistance = 0),
(this.attenuationColor = new Pe(1, 1, 1)),
(this.specularIntensity = 1),
(this.specularIntensityMap = null),
(this.specularColor = new Pe(1, 1, 1)),
(this.specularColorMap = null),
(this._sheen = 0),
(this._clearcoat = 0),
(this._transmission = 0),
this.setValues(t);
}
get sheen() {
return this._sheen;
}
set sheen(t) {
this._sheen > 0 != t > 0 && this.version++, (this._sheen = t);
}
get clearcoat() {
return this._clearcoat;
}
set clearcoat(t) {
this._clearcoat > 0 != t > 0 && this.version++, (this._clearcoat = t);
}
get transmission() {
return this._transmission;
}
set transmission(t) {
this._transmission > 0 != t > 0 && this.version++, (this._transmission = t);
}
copy(t) {
return super.copy(t), (this.defines = { STANDARD: "", PHYSICAL: "" }), (this.clearcoat = t.clearcoat), (this.clearcoatMap = t.clearcoatMap), (this.clearcoatRoughness = t.clearcoatRoughness), (this.clearcoatRoughnessMap = t.clearcoatRoughnessMap), (this.clearcoatNormalMap = t.clearcoatNormalMap), this.clearcoatNormalScale.copy(t.clearcoatNormalScale), (this.ior = t.ior), (this.sheen = t.sheen), this.sheenColor.copy(t.sheenColor), (this.sheenColorMap = t.sheenColorMap), (this.sheenRoughness = t.sheenRoughness), (this.sheenRoughnessMap = t.sheenRoughnessMap), (this.transmission = t.transmission), (this.transmissionMap = t.transmissionMap), (this.thickness = t.thickness), (this.thicknessMap = t.thicknessMap), (this.attenuationDistance = t.attenuationDistance), this.attenuationColor.copy(t.attenuationColor), (this.specularIntensity = t.specularIntensity), (this.specularIntensityMap = t.specularIntensityMap), this.specularColor.copy(t.specularColor), (this.specularColorMap = t.specularColorMap), this;
}
}
Ao.prototype.isMeshPhysicalMaterial = !0;
class Lo extends Se {
constructor(t) {
super(), (this.type = "MeshPhongMaterial"), (this.color = new Pe(16777215)), (this.specular = new Pe(1118481)), (this.shininess = 30), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new Pe(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new $(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = "round"), (this.wireframeLinejoin = "round"), (this.flatShading = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), this.specular.copy(t.specular), (this.shininess = t.shininess), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.flatShading = t.flatShading), this;
}
}
Lo.prototype.isMeshPhongMaterial = !0;
class Co extends Se {
constructor(t) {
super(), (this.defines = { TOON: "" }), (this.type = "MeshToonMaterial"), (this.color = new Pe(16777215)), (this.map = null), (this.gradientMap = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new Pe(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new $(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.alphaMap = null), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = "round"), (this.wireframeLinejoin = "round"), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.gradientMap = t.gradientMap), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.alphaMap = t.alphaMap), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), this;
}
}
Co.prototype.isMeshToonMaterial = !0;
class Ro extends Se {
constructor(t) {
super(), (this.type = "MeshNormalMaterial"), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new $(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.fog = !1), (this.flatShading = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.flatShading = t.flatShading), this;
}
}
Ro.prototype.isMeshNormalMaterial = !0;
class Po extends Se {
constructor(t) {
super(), (this.type = "MeshLambertMaterial"), (this.color = new Pe(16777215)), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new Pe(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = "round"), (this.wireframeLinejoin = "round"), this.setValues(t);
}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), this;
}
}
Po.prototype.isMeshLambertMaterial = !0;
class Do extends Se {
constructor(t) {
super(), (this.defines = { MATCAP: "" }), (this.type = "MeshMatcapMaterial"), (this.color = new Pe(16777215)), (this.matcap = null), (this.map = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new $(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.alphaMap = null), (this.flatShading = !1), this.setValues(t);
}
copy(t) {
return super.copy(t), (this.defines = { MATCAP: "" }), this.color.copy(t.color), (this.matcap = t.matcap), (this.map = t.map), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.alphaMap = t.alphaMap), (this.flatShading = t.flatShading), this;
}
}
Do.prototype.isMeshMatcapMaterial = !0;
class Io extends aa {
constructor(t) {
super(), (this.type = "LineDashedMaterial"), (this.scale = 1), (this.dashSize = 3), (this.gapSize = 1), this.setValues(t);
}
copy(t) {
return super.copy(t), (this.scale = t.scale), (this.dashSize = t.dashSize), (this.gapSize = t.gapSize), this;
}
}
Io.prototype.isLineDashedMaterial = !0;
const No = {
arraySlice: function (t, e, n) {
return No.isTypedArray(t) ? new t.constructor(t.subarray(e, void 0 !== n ? n : t.length)) : t.slice(e, n);
},
convertArray: function (t, e, n) {
return !t || (!n && t.constructor === e) ? t : "number" == typeof e.BYTES_PER_ELEMENT ? new e(t) : Array.prototype.slice.call(t);
},
isTypedArray: function (t) {
return ArrayBuffer.isView(t) && !(t instanceof DataView);
},
getKeyframeOrder: function (t) {
const e = t.length,
n = new Array(e);
for (let t = 0; t !== e; ++t) n[t] = t;
return (
n.sort(function (e, n) {
return t[e] - t[n];
}),
n
);
},
sortedArray: function (t, e, n) {
const i = t.length,
r = new t.constructor(i);
for (let s = 0, a = 0; a !== i; ++s) {
const i = n[s] * e;
for (let n = 0; n !== e; ++n) r[a++] = t[i + n];
}
return r;
},
flattenJSON: function (t, e, n, i) {
let r = 1,
s = t[0];
for (; void 0 !== s && void 0 === s[i]; ) s = t[r++];
if (void 0 === s) return;
let a = s[i];
if (void 0 !== a)
if (Array.isArray(a))
do {
(a = s[i]), void 0 !== a && (e.push(s.time), n.push.apply(n, a)), (s = t[r++]);
} while (void 0 !== s);
else if (void 0 !== a.toArray)
do {
(a = s[i]), void 0 !== a && (e.push(s.time), a.toArray(n, n.length)), (s = t[r++]);
} while (void 0 !== s);
else
do {
(a = s[i]), void 0 !== a && (e.push(s.time), n.push(a)), (s = t[r++]);
} while (void 0 !== s);
},
subclip: function (t, e, n, i, r = 30) {
const s = t.clone();
s.name = e;
const a = [];
for (let t = 0; t < s.tracks.length; ++t) {
const e = s.tracks[t],
o = e.getValueSize(),
l = [],
h = [];
for (let t = 0; t < e.times.length; ++t) {
const s = e.times[t] * r;
if (!(s < n || s >= i)) {
l.push(e.times[t]);
for (let n = 0; n < o; ++n) h.push(e.values[t * o + n]);
}
}
0 !== l.length && ((e.times = No.convertArray(l, e.times.constructor)), (e.values = No.convertArray(h, e.values.constructor)), a.push(e));
}
s.tracks = a;
let o = 1 / 0;
for (let t = 0; t < s.tracks.length; ++t) o > s.tracks[t].times[0] && (o = s.tracks[t].times[0]);
for (let t = 0; t < s.tracks.length; ++t) s.tracks[t].shift(-1 * o);
return s.resetDuration(), s;
},
makeClipAdditive: function (t, e = 0, n = t, i = 30) {
i <= 0 && (i = 30);
const r = n.tracks.length,
s = e / i;
for (let e = 0; e < r; ++e) {
const i = n.tracks[e],
r = i.ValueTypeName;
if ("bool" === r || "string" === r) continue;
const a = t.tracks.find(function (t) {
return t.name === i.name && t.ValueTypeName === r;
});
if (void 0 === a) continue;
let o = 0;
const l = i.getValueSize();
i.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (o = l / 3);
let h = 0;
const c = a.getValueSize();
a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (h = c / 3);
const u = i.times.length - 1;
let d;
if (s <= i.times[0]) {
const t = o,
e = l - o;
d = No.arraySlice(i.values, t, e);
} else if (s >= i.times[u]) {
const t = u * l + o,
e = t + l - o;
d = No.arraySlice(i.values, t, e);
} else {
const t = i.createInterpolant(),
e = o,
n = l - o;
t.evaluate(s), (d = No.arraySlice(t.resultBuffer, e, n));
}
if ("quaternion" === r) {
new lt().fromArray(d).normalize().conjugate().toArray(d);
}
const p = a.times.length;
for (let t = 0; t < p; ++t) {
const e = t * c + h;
if ("quaternion" === r) lt.multiplyQuaternionsFlat(a.values, e, d, 0, a.values, e);
else {
const t = c - 2 * h;
for (let n = 0; n < t; ++n) a.values[e + n] -= d[n];
}
}
}
return (t.blendMode = 2501), t;
},
};
class zo {
constructor(t, e, n, i) {
(this.parameterPositions = t), (this._cachedIndex = 0), (this.resultBuffer = void 0 !== i ? i : new e.constructor(n)), (this.sampleValues = e), (this.valueSize = n), (this.settings = null), (this.DefaultSettings_ = {});
}
evaluate(t) {
const e = this.parameterPositions;
let n = this._cachedIndex,
i = e[n],
r = e[n - 1];
t: {
e: {
let s;
n: {
i: if (!(t < i)) {
for (let s = n + 2; ; ) {
if (void 0 === i) {
if (t < r) break i;
return (n = e.length), (this._cachedIndex = n), this.afterEnd_(n - 1, t, r);
}
if (n === s) break;
if (((r = i), (i = e[++n]), t < i)) break e;
}
s = e.length;
break n;
}
if (t >= r) break t;
{
const a = e[1];
t < a && ((n = 2), (r = a));
for (let s = n - 2; ; ) {
if (void 0 === r) return (this._cachedIndex = 0), this.beforeStart_(0, t, i);
if (n === s) break;
if (((i = r), (r = e[--n - 1]), t >= r)) break e;
}
(s = n), (n = 0);
}
}
for (; n < s; ) {
const i = (n + s) >>> 1;
t < e[i] ? (s = i) : (n = i + 1);
}
if (((i = e[n]), (r = e[n - 1]), void 0 === r)) return (this._cachedIndex = 0), this.beforeStart_(0, t, i);
if (void 0 === i) return (n = e.length), (this._cachedIndex = n), this.afterEnd_(n - 1, r, t);
}
(this._cachedIndex = n), this.intervalChanged_(n, r, i);
}
return this.interpolate_(n, r, t, i);
}
getSettings_() {
return this.settings || this.DefaultSettings_;
}
copySampleValue_(t) {
const e = this.resultBuffer,
n = this.sampleValues,
i = this.valueSize,
r = t * i;
for (let t = 0; t !== i; ++t) e[t] = n[r + t];
return e;
}
interpolate_() {
throw new Error("call to abstract method");
}
intervalChanged_() {}
}
(zo.prototype.beforeStart_ = zo.prototype.copySampleValue_), (zo.prototype.afterEnd_ = zo.prototype.copySampleValue_);
class Oo extends zo {
constructor(t, e, n, i) {
super(t, e, n, i), (this._weightPrev = -0), (this._offsetPrev = -0), (this._weightNext = -0), (this._offsetNext = -0), (this.DefaultSettings_ = { endingStart: R, endingEnd: R });
}
intervalChanged_(t, e, n) {
const i = this.parameterPositions;
let r = t - 2,
s = t + 1,
a = i[r],
o = i[s];
if (void 0 === a)
switch (this.getSettings_().endingStart) {
case P:
(r = t), (a = 2 * e - n);
break;
case D:
(r = i.length - 2), (a = e + i[r] - i[r + 1]);
break;
default:
(r = t), (a = n);
}
if (void 0 === o)
switch (this.getSettings_().endingEnd) {
case P:
(s = t), (o = 2 * n - e);
break;
case D:
(s = 1), (o = n + i[1] - i[0]);
break;
default:
(s = t - 1), (o = e);
}
const l = 0.5 * (n - e),
h = this.valueSize;
(this._weightPrev = l / (e - a)), (this._weightNext = l / (o - n)), (this._offsetPrev = r * h), (this._offsetNext = s * h);
}
interpolate_(t, e, n, i) {
const r = this.resultBuffer,
s = this.sampleValues,
a = this.valueSize,
o = t * a,
l = o - a,
h = this._offsetPrev,
c = this._offsetNext,
u = this._weightPrev,
d = this._weightNext,
p = (n - e) / (i - e),
m = p * p,
f = m * p,
g = -u * f + 2 * u * m - u * p,
v = (1 + u) * f + (-1.5 - 2 * u) * m + (-0.5 + u) * p + 1,
x = (-1 - d) * f + (1.5 + d) * m + 0.5 * p,
y = d * f - d * m;
for (let t = 0; t !== a; ++t) r[t] = g * s[h + t] + v * s[l + t] + x * s[o + t] + y * s[c + t];
return r;
}
}
class Fo extends zo {
constructor(t, e, n, i) {
super(t, e, n, i);
}
interpolate_(t, e, n, i) {
const r = this.resultBuffer,
s = this.sampleValues,
a = this.valueSize,
o = t * a,
l = o - a,
h = (n - e) / (i - e),
c = 1 - h;
for (let t = 0; t !== a; ++t) r[t] = s[l + t] * c + s[o + t] * h;
return r;
}
}
class Bo extends zo {
constructor(t, e, n, i) {
super(t, e, n, i);
}
interpolate_(t) {
return this.copySampleValue_(t - 1);
}
}
class Uo {
constructor(t, e, n, i) {
if (void 0 === t) throw new Error("THREE.KeyframeTrack: track name is undefined");
if (void 0 === e || 0 === e.length) throw new Error("THREE.KeyframeTrack: no keyframes in track named " + t);
(this.name = t), (this.times = No.convertArray(e, this.TimeBufferType)), (this.values = No.convertArray(n, this.ValueBufferType)), this.setInterpolation(i || this.DefaultInterpolation);
}
static toJSON(t) {
const e = t.constructor;
let n;
if (e.toJSON !== this.toJSON) n = e.toJSON(t);
else {
n = { name: t.name, times: No.convertArray(t.times, Array), values: No.convertArray(t.values, Array) };
const e = t.getInterpolation();
e !== t.DefaultInterpolation && (n.interpolation = e);
}
return (n.type = t.ValueTypeName), n;
}
InterpolantFactoryMethodDiscrete(t) {
return new Bo(this.times, this.values, this.getValueSize(), t);
}
InterpolantFactoryMethodLinear(t) {
return new Fo(this.times, this.values, this.getValueSize(), t);
}
InterpolantFactoryMethodSmooth(t) {
return new Oo(this.times, this.values, this.getValueSize(), t);
}
setInterpolation(t) {
let e;
switch (t) {
case A:
e = this.InterpolantFactoryMethodDiscrete;
break;
case L:
e = this.InterpolantFactoryMethodLinear;
break;
case C:
e = this.InterpolantFactoryMethodSmooth;
}
if (void 0 === e) {
const e = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name;
if (void 0 === this.createInterpolant) {
if (t === this.DefaultInterpolation) throw new Error(e);
this.setInterpolation(this.DefaultInterpolation);
}
return console.warn("THREE.KeyframeTrack:", e), this;
}
return (this.createInterpolant = e), this;
}
getInterpolation() {
switch (this.createInterpolant) {
case this.InterpolantFactoryMethodDiscrete:
return A;
case this.InterpolantFactoryMethodLinear:
return L;
case this.InterpolantFactoryMethodSmooth:
return C;
}
}
getValueSize() {
return this.values.length / this.times.length;
}
shift(t) {
if (0 !== t) {
const e = this.times;
for (let n = 0, i = e.length; n !== i; ++n) e[n] += t;
}
return this;
}
scale(t) {
if (1 !== t) {
const e = this.times;
for (let n = 0, i = e.length; n !== i; ++n) e[n] *= t;
}
return this;
}
trim(t, e) {
const n = this.times,
i = n.length;
let r = 0,
s = i - 1;
for (; r !== i && n[r] < t; ) ++r;
for (; -1 !== s && n[s] > e; ) --s;
if ((++s, 0 !== r || s !== i)) {
r >= s && ((s = Math.max(s, 1)), (r = s - 1));
const t = this.getValueSize();
(this.times = No.arraySlice(n, r, s)), (this.values = No.arraySlice(this.values, r * t, s * t));
}
return this;
}
validate() {
let t = !0;
const e = this.getValueSize();
e - Math.floor(e) != 0 && (console.error("THREE.KeyframeTrack: Invalid value size in track.", this), (t = !1));
const n = this.times,
i = this.values,
r = n.length;
0 === r && (console.error("THREE.KeyframeTrack: Track is empty.", this), (t = !1));
let s = null;
for (let e = 0; e !== r; e++) {
const i = n[e];
if ("number" == typeof i && isNaN(i)) {
console.error("THREE.KeyframeTrack: Time is not a valid number.", this, e, i), (t = !1);
break;
}
if (null !== s && s > i) {
console.error("THREE.KeyframeTrack: Out of order keys.", this, e, i, s), (t = !1);
break;
}
s = i;
}
if (void 0 !== i && No.isTypedArray(i))
for (let e = 0, n = i.length; e !== n; ++e) {
const n = i[e];
if (isNaN(n)) {
console.error("THREE.KeyframeTrack: Value is not a valid number.", this, e, n), (t = !1);
break;
}
}
return t;
}
optimize() {
const t = No.arraySlice(this.times),
e = No.arraySlice(this.values),
n = this.getValueSize(),
i = this.getInterpolation() === C,
r = t.length - 1;
let s = 1;
for (let a = 1; a < r; ++a) {
let r = !1;
const o = t[a];
if (o !== t[a + 1] && (1 !== a || o !== t[0]))
if (i) r = !0;
else {
const t = a * n,
i = t - n,
s = t + n;
for (let a = 0; a !== n; ++a) {
const n = e[t + a];
if (n !== e[i + a] || n !== e[s + a]) {
r = !0;
break;
}
}
}
if (r) {
if (a !== s) {
t[s] = t[a];
const i = a * n,
r = s * n;
for (let t = 0; t !== n; ++t) e[r + t] = e[i + t];
}
++s;
}
}
if (r > 0) {
t[s] = t[r];
for (let t = r * n, i = s * n, a = 0; a !== n; ++a) e[i + a] = e[t + a];
++s;
}
return s !== t.length ? ((this.times = No.arraySlice(t, 0, s)), (this.values = No.arraySlice(e, 0, s * n))) : ((this.times = t), (this.values = e)), this;
}
clone() {
const t = No.arraySlice(this.times, 0),
e = No.arraySlice(this.values, 0),
n = new (0, this.constructor)(this.name, t, e);
return (n.createInterpolant = this.createInterpolant), n;
}
}
(Uo.prototype.TimeBufferType = Float32Array), (Uo.prototype.ValueBufferType = Float32Array), (Uo.prototype.DefaultInterpolation = L);
class Ho extends Uo {}
(Ho.prototype.ValueTypeName = "bool"), (Ho.prototype.ValueBufferType = Array), (Ho.prototype.DefaultInterpolation = A), (Ho.prototype.InterpolantFactoryMethodLinear = void 0), (Ho.prototype.InterpolantFactoryMethodSmooth = void 0);
class Vo extends Uo {}
Vo.prototype.ValueTypeName = "color";
class ko extends Uo {}
ko.prototype.ValueTypeName = "number";
class Go extends zo {
constructor(t, e, n, i) {
super(t, e, n, i);
}
interpolate_(t, e, n, i) {
const r = this.resultBuffer,
s = this.sampleValues,
a = this.valueSize,
o = (n - e) / (i - e);
let l = t * a;
for (let t = l + a; l !== t; l += 4) lt.slerpFlat(r, 0, s, l - a, s, l, o);
return r;
}
}
class Wo extends Uo {
InterpolantFactoryMethodLinear(t) {
return new Go(this.times, this.values, this.getValueSize(), t);
}
}
(Wo.prototype.ValueTypeName = "quaternion"), (Wo.prototype.DefaultInterpolation = L), (Wo.prototype.InterpolantFactoryMethodSmooth = void 0);
class jo extends Uo {}
(jo.prototype.ValueTypeName = "string"), (jo.prototype.ValueBufferType = Array), (jo.prototype.DefaultInterpolation = A), (jo.prototype.InterpolantFactoryMethodLinear = void 0), (jo.prototype.InterpolantFactoryMethodSmooth = void 0);
class qo extends Uo {}
qo.prototype.ValueTypeName = "vector";
class Xo {
constructor(t, e = -1, n, i = 2500) {
(this.name = t), (this.tracks = n), (this.duration = e), (this.blendMode = i), (this.uuid = W()), this.duration < 0 && this.resetDuration();
}
static parse(t) {
const e = [],
n = t.tracks,
i = 1 / (t.fps || 1);
for (let t = 0, r = n.length; t !== r; ++t) e.push(Yo(n[t]).scale(i));
const r = new this(t.name, t.duration, e, t.blendMode);
return (r.uuid = t.uuid), r;
}
static toJSON(t) {
const e = [],
n = t.tracks,
i = { name: t.name, duration: t.duration, tracks: e, uuid: t.uuid, blendMode: t.blendMode };
for (let t = 0, i = n.length; t !== i; ++t) e.push(Uo.toJSON(n[t]));
return i;
}
static CreateFromMorphTargetSequence(t, e, n, i) {
const r = e.length,
s = [];
for (let t = 0; t < r; t++) {
let a = [],
o = [];
a.push((t + r - 1) % r, t, (t + 1) % r), o.push(0, 1, 0);
const l = No.getKeyframeOrder(a);
(a = No.sortedArray(a, 1, l)), (o = No.sortedArray(o, 1, l)), i || 0 !== a[0] || (a.push(r), o.push(o[0])), s.push(new ko(".morphTargetInfluences[" + e[t].name + "]", a, o).scale(1 / n));
}
return new this(t, -1, s);
}
static findByName(t, e) {
let n = t;
if (!Array.isArray(t)) {
const e = t;
n = (e.geometry && e.geometry.animations) || e.animations;
}
for (let t = 0; t < n.length; t++) if (n[t].name === e) return n[t];
return null;
}
static CreateClipsFromMorphTargetSequences(t, e, n) {
const i = {},
r = /^([\w-]*?)([\d]+)$/;
for (let e = 0, n = t.length; e < n; e++) {
const n = t[e],
s = n.name.match(r);
if (s && s.length > 1) {
const t = s[1];
let e = i[t];
e || (i[t] = e = []), e.push(n);
}
}
const s = [];
for (const t in i) s.push(this.CreateFromMorphTargetSequence(t, i[t], e, n));
return s;
}
static parseAnimation(t, e) {
if (!t) return console.error("THREE.AnimationClip: No animation in JSONLoader data."), null;
const n = function (t, e, n, i, r) {
if (0 !== n.length) {
const s = [],
a = [];
No.flattenJSON(n, s, a, i), 0 !== s.length && r.push(new t(e, s, a));
}
},
i = [],
r = t.name || "default",
s = t.fps || 30,
a = t.blendMode;
let o = t.length || -1;
const l = t.hierarchy || [];
for (let t = 0; t < l.length; t++) {
const r = l[t].keys;
if (r && 0 !== r.length)
if (r[0].morphTargets) {
const t = {};
let e;
for (e = 0; e < r.length; e++) if (r[e].morphTargets) for (let n = 0; n < r[e].morphTargets.length; n++) t[r[e].morphTargets[n]] = -1;
for (const n in t) {
const t = [],
s = [];
for (let i = 0; i !== r[e].morphTargets.length; ++i) {
const i = r[e];
t.push(i.time), s.push(i.morphTarget === n ? 1 : 0);
}
i.push(new ko(".morphTargetInfluence[" + n + "]", t, s));
}
o = t.length * (s || 1);
} else {
const s = ".bones[" + e[t].name + "]";
n(qo, s + ".position", r, "pos", i), n(Wo, s + ".quaternion", r, "rot", i), n(qo, s + ".scale", r, "scl", i);
}
}
if (0 === i.length) return null;
return new this(r, o, i, a);
}
resetDuration() {
let t = 0;
for (let e = 0, n = this.tracks.length; e !== n; ++e) {
const n = this.tracks[e];
t = Math.max(t, n.times[n.times.length - 1]);
}
return (this.duration = t), this;
}
trim() {
for (let t = 0; t < this.tracks.length; t++) this.tracks[t].trim(0, this.duration);
return this;
}
validate() {
let t = !0;
for (let e = 0; e < this.tracks.length; e++) t = t && this.tracks[e].validate();
return t;
}
optimize() {
for (let t = 0; t < this.tracks.length; t++) this.tracks[t].optimize();
return this;
}
clone() {
const t = [];
for (let e = 0; e < this.tracks.length; e++) t.push(this.tracks[e].clone());
return new this.constructor(this.name, this.duration, t, this.blendMode);
}
toJSON() {
return this.constructor.toJSON(this);
}
}
function Yo(t) {
if (void 0 === t.type) throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");
const e = (function (t) {
switch (t.toLowerCase()) {
case "scalar":
case "double":
case "float":
case "number":
case "integer":
return ko;
case "vector":
case "vector2":
case "vector3":
case "vector4":
return qo;
case "color":
return Vo;
case "quaternion":
return Wo;
case "bool":
case "boolean":
return Ho;
case "string":
return jo;
}
throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + t);
})(t.type);
if (void 0 === t.times) {
const e = [],
n = [];
No.flattenJSON(t.keys, e, n, "value"), (t.times = e), (t.values = n);
}
return void 0 !== e.parse ? e.parse(t) : new e(t.name, t.times, t.values, t.interpolation);
}
const Jo = {
enabled: !1,
files: {},
add: function (t, e) {
!1 !== this.enabled && (this.files[t] = e);
},
get: function (t) {
if (!1 !== this.enabled) return this.files[t];
},
remove: function (t) {
delete this.files[t];
},
clear: function () {
this.files = {};
},
};
class $o {
constructor(t, e, n) {
const i = this;
let r,
s = !1,
a = 0,
o = 0;
const l = [];
(this.onStart = void 0),
(this.onLoad = t),
(this.onProgress = e),
(this.onError = n),
(this.itemStart = function (t) {
o++, !1 === s && void 0 !== i.onStart && i.onStart(t, a, o), (s = !0);
}),
(this.itemEnd = function (t) {
a++, void 0 !== i.onProgress && i.onProgress(t, a, o), a === o && ((s = !1), void 0 !== i.onLoad && i.onLoad());
}),
(this.itemError = function (t) {
void 0 !== i.onError && i.onError(t);
}),
(this.resolveURL = function (t) {
return r ? r(t) : t;
}),
(this.setURLModifier = function (t) {
return (r = t), this;
}),
(this.addHandler = function (t, e) {
return l.push(t, e), this;
}),
(this.removeHandler = function (t) {
const e = l.indexOf(t);
return -1 !== e && l.splice(e, 2), this;
}),
(this.getHandler = function (t) {
for (let e = 0, n = l.length; e < n; e += 2) {
const n = l[e],
i = l[e + 1];
if ((n.global && (n.lastIndex = 0), n.test(t))) return i;
}
return null;
});
}
}
const Zo = new $o();
class Qo {
constructor(t) {
(this.manager = void 0 !== t ? t : Zo), (this.crossOrigin = "anonymous"), (this.withCredentials = !1), (this.path = ""), (this.resourcePath = ""), (this.requestHeader = {});
}
load() {}
loadAsync(t, e) {
const n = this;
return new Promise(function (i, r) {
n.load(t, i, e, r);
});
}
parse() {}
setCrossOrigin(t) {
return (this.crossOrigin = t), this;
}
setWithCredentials(t) {
return (this.withCredentials = t), this;
}
setPath(t) {
return (this.path = t), this;
}
setResourcePath(t) {
return (this.resourcePath = t), this;
}
setRequestHeader(t) {
return (this.requestHeader = t), this;
}
}
const Ko = {};
class tl extends Qo {
constructor(t) {
super(t);
}
load(t, e, n, i) {
void 0 === t && (t = ""), void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t));
const r = Jo.get(t);
if (void 0 !== r)
return (
this.manager.itemStart(t),
setTimeout(() => {
e && e(r), this.manager.itemEnd(t);
}, 0),
r
);
if (void 0 !== Ko[t]) return void Ko[t].push({ onLoad: e, onProgress: n, onError: i });
(Ko[t] = []), Ko[t].push({ onLoad: e, onProgress: n, onError: i });
const s = new Request(t, { headers: new Headers(this.requestHeader), credentials: this.withCredentials ? "include" : "same-origin" });
fetch(s)
.then((e) => {
if (200 === e.status || 0 === e.status) {
if ((0 === e.status && console.warn("THREE.FileLoader: HTTP Status 0 received."), "undefined" == typeof ReadableStream || void 0 === e.body.getReader)) return e;
const n = Ko[t],
i = e.body.getReader(),
r = e.headers.get("Content-Length"),
s = r ? parseInt(r) : 0,
a = 0 !== s;
let o = 0;
const l = new ReadableStream({
start(t) {
!(function e() {
i.read().then(({ done: i, value: r }) => {
if (i) t.close();
else {
o += r.byteLength;
const i = new ProgressEvent("progress", { lengthComputable: a, loaded: o, total: s });
for (let t = 0, e = n.length; t < e; t++) {
const e = n[t];
e.onProgress && e.onProgress(i);
}
t.enqueue(r), e();
}
});
})();
},
});
return new Response(l);
}
throw Error(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`);
})
.then((t) => {
switch (this.responseType) {
case "arraybuffer":
return t.arrayBuffer();
case "blob":
return t.blob();
case "document":
return t.text().then((t) => new DOMParser().parseFromString(t, this.mimeType));
case "json":
return t.json();
default:
return t.text();
}
})
.then((e) => {
Jo.add(t, e);
const n = Ko[t];
delete Ko[t];
for (let t = 0, i = n.length; t < i; t++) {
const i = n[t];
i.onLoad && i.onLoad(e);
}
})
.catch((e) => {
const n = Ko[t];
if (void 0 === n) throw (this.manager.itemError(t), e);
delete Ko[t];
for (let t = 0, i = n.length; t < i; t++) {
const i = n[t];
i.onError && i.onError(e);
}
this.manager.itemError(t);
})
.finally(() => {
this.manager.itemEnd(t);
}),
this.manager.itemStart(t);
}
setResponseType(t) {
return (this.responseType = t), this;
}
setMimeType(t) {
return (this.mimeType = t), this;
}
}
class el extends Qo {
constructor(t) {
super(t);
}
load(t, e, n, i) {
void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t));
const r = this,
s = Jo.get(t);
if (void 0 !== s)
return (
r.manager.itemStart(t),
setTimeout(function () {
e && e(s), r.manager.itemEnd(t);
}, 0),
s
);
const a = K("img");
function o() {
h(), Jo.add(t, this), e && e(this), r.manager.itemEnd(t);
}
function l(e) {
h(), i && i(e), r.manager.itemError(t), r.manager.itemEnd(t);
}
function h() {
a.removeEventListener("load", o, !1), a.removeEventListener("error", l, !1);
}
return a.addEventListener("load", o, !1), a.addEventListener("error", l, !1), "data:" !== t.substr(0, 5) && void 0 !== this.crossOrigin && (a.crossOrigin = this.crossOrigin), r.manager.itemStart(t), (a.src = t), a;
}
}
class nl extends Qo {
constructor(t) {
super(t);
}
load(t, e, n, i) {
const r = new wn(),
s = new el(this.manager);
s.setCrossOrigin(this.crossOrigin), s.setPath(this.path);
let a = 0;
function o(n) {
s.load(
t[n],
function (t) {
(r.images[n] = t), a++, 6 === a && ((r.needsUpdate = !0), e && e(r));
},
void 0,
i
);
}
for (let e = 0; e < t.length; ++e) o(e);
return r;
}
}
class il extends Qo {
constructor(t) {
super(t);
}
load(t, e, n, i) {
const r = new it(),
s = new el(this.manager);
return (
s.setCrossOrigin(this.crossOrigin),
s.setPath(this.path),
s.load(
t,
function (t) {
(r.image = t), (r.needsUpdate = !0), void 0 !== e && e(r);
},
n,
i
),
r
);
}
}
class rl extends ue {
constructor(t, e = 1) {
super(), (this.type = "Light"), (this.color = new Pe(t)), (this.intensity = e);
}
dispose() {}
copy(t) {
return super.copy(t), this.color.copy(t.color), (this.intensity = t.intensity), this;
}
toJSON(t) {
const e = super.toJSON(t);
return (e.object.color = this.color.getHex()), (e.object.intensity = this.intensity), void 0 !== this.groundColor && (e.object.groundColor = this.groundColor.getHex()), void 0 !== this.distance && (e.object.distance = this.distance), void 0 !== this.angle && (e.object.angle = this.angle), void 0 !== this.decay && (e.object.decay = this.decay), void 0 !== this.penumbra && (e.object.penumbra = this.penumbra), void 0 !== this.shadow && (e.object.shadow = this.shadow.toJSON()), e;
}
}
rl.prototype.isLight = !0;
class sl extends rl {
constructor(t, e, n) {
super(t, n), (this.type = "HemisphereLight"), this.position.copy(ue.DefaultUp), this.updateMatrix(), (this.groundColor = new Pe(e));
}
copy(t) {
return rl.prototype.copy.call(this, t), this.groundColor.copy(t.groundColor), this;
}
}
sl.prototype.isHemisphereLight = !0;
const al = new Ht(),
ol = new ht(),
ll = new ht();
class hl {
constructor(t) {
(this.camera = t), (this.bias = 0), (this.normalBias = 0), (this.radius = 1), (this.blurSamples = 8), (this.mapSize = new $(512, 512)), (this.map = null), (this.mapPass = null), (this.matrix = new Ht()), (this.autoUpdate = !0), (this.needsUpdate = !1), (this._frustum = new Rn()), (this._frameExtents = new $(1, 1)), (this._viewportCount = 1), (this._viewports = [new st(0, 0, 1, 1)]);
}
getViewportCount() {
return this._viewportCount;
}
getFrustum() {
return this._frustum;
}
updateMatrices(t) {
const e = this.camera,
n = this.matrix;
ol.setFromMatrixPosition(t.matrixWorld), e.position.copy(ol), ll.setFromMatrixPosition(t.target.matrixWorld), e.lookAt(ll), e.updateMatrixWorld(), al.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), this._frustum.setFromProjectionMatrix(al), n.set(0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 1), n.multiply(e.projectionMatrix), n.multiply(e.matrixWorldInverse);
}
getViewport(t) {
return this._viewports[t];
}
getFrameExtents() {
return this._frameExtents;
}
dispose() {
this.map && this.map.dispose(), this.mapPass && this.mapPass.dispose();
}
copy(t) {
return (this.camera = t.camera.clone()), (this.bias = t.bias), (this.radius = t.radius), this.mapSize.copy(t.mapSize), this;
}
clone() {
return new this.constructor().copy(this);
}
toJSON() {
const t = {};
return 0 !== this.bias && (t.bias = this.bias), 0 !== this.normalBias && (t.normalBias = this.normalBias), 1 !== this.radius && (t.radius = this.radius), (512 === this.mapSize.x && 512 === this.mapSize.y) || (t.mapSize = this.mapSize.toArray()), (t.camera = this.camera.toJSON(!1).object), delete t.camera.matrix, t;
}
}
class cl extends hl {
constructor() {
super(new yn(50, 1, 0.5, 500)), (this.focus = 1);
}
updateMatrices(t) {
const e = this.camera,
n = 2 * G * t.angle * this.focus,
i = this.mapSize.width / this.mapSize.height,
r = t.distance || e.far;
(n === e.fov && i === e.aspect && r === e.far) || ((e.fov = n), (e.aspect = i), (e.far = r), e.updateProjectionMatrix()), super.updateMatrices(t);
}
copy(t) {
return super.copy(t), (this.focus = t.focus), this;
}
}
cl.prototype.isSpotLightShadow = !0;
class ul extends rl {
constructor(t, e, n = 0, i = Math.PI / 3, r = 0, s = 1) {
super(t, e), (this.type = "SpotLight"), this.position.copy(ue.DefaultUp), this.updateMatrix(), (this.target = new ue()), (this.distance = n), (this.angle = i), (this.penumbra = r), (this.decay = s), (this.shadow = new cl());
}
get power() {
return this.intensity * Math.PI;
}
set power(t) {
this.intensity = t / Math.PI;
}
dispose() {
this.shadow.dispose();
}
copy(t) {
return super.copy(t), (this.distance = t.distance), (this.angle = t.angle), (this.penumbra = t.penumbra), (this.decay = t.decay), (this.target = t.target.clone()), (this.shadow = t.shadow.clone()), this;
}
}
ul.prototype.isSpotLight = !0;
const dl = new Ht(),
pl = new ht(),
ml = new ht();
class fl extends hl {
constructor() {
super(new yn(90, 1, 0.5, 500)), (this._frameExtents = new $(4, 2)), (this._viewportCount = 6), (this._viewports = [new st(2, 1, 1, 1), new st(0, 1, 1, 1), new st(3, 1, 1, 1), new st(1, 1, 1, 1), new st(3, 0, 1, 1), new st(1, 0, 1, 1)]), (this._cubeDirections = [new ht(1, 0, 0), new ht(-1, 0, 0), new ht(0, 0, 1), new ht(0, 0, -1), new ht(0, 1, 0), new ht(0, -1, 0)]), (this._cubeUps = [new ht(0, 1, 0), new ht(0, 1, 0), new ht(0, 1, 0), new ht(0, 1, 0), new ht(0, 0, 1), new ht(0, 0, -1)]);
}
updateMatrices(t, e = 0) {
const n = this.camera,
i = this.matrix,
r = t.distance || n.far;
r !== n.far && ((n.far = r), n.updateProjectionMatrix()), pl.setFromMatrixPosition(t.matrixWorld), n.position.copy(pl), ml.copy(n.position), ml.add(this._cubeDirections[e]), n.up.copy(this._cubeUps[e]), n.lookAt(ml), n.updateMatrixWorld(), i.makeTranslation(-pl.x, -pl.y, -pl.z), dl.multiplyMatrices(n.projectionMatrix, n.matrixWorldInverse), this._frustum.setFromProjectionMatrix(dl);
}
}
fl.prototype.isPointLightShadow = !0;
class gl extends rl {
constructor(t, e, n = 0, i = 1) {
super(t, e), (this.type = "PointLight"), (this.distance = n), (this.decay = i), (this.shadow = new fl());
}
get power() {
return 4 * this.intensity * Math.PI;
}
set power(t) {
this.intensity = t / (4 * Math.PI);
}
dispose() {
this.shadow.dispose();
}
copy(t) {
return super.copy(t), (this.distance = t.distance), (this.decay = t.decay), (this.shadow = t.shadow.clone()), this;
}
}
gl.prototype.isPointLight = !0;
class vl extends hl {
constructor() {
super(new Gn(-5, 5, 5, -5, 0.5, 500));
}
}
vl.prototype.isDirectionalLightShadow = !0;
class xl extends rl {
constructor(t, e) {
super(t, e), (this.type = "DirectionalLight"), this.position.copy(ue.DefaultUp), this.updateMatrix(), (this.target = new ue()), (this.shadow = new vl());
}
dispose() {
this.shadow.dispose();
}
copy(t) {
return super.copy(t), (this.target = t.target.clone()), (this.shadow = t.shadow.clone()), this;
}
}
xl.prototype.isDirectionalLight = !0;
class yl extends rl {
constructor(t, e) {
super(t, e), (this.type = "AmbientLight");
}
}
yl.prototype.isAmbientLight = !0;
class _l extends rl {
constructor(t, e, n = 10, i = 10) {
super(t, e), (this.type = "RectAreaLight"), (this.width = n), (this.height = i);
}
get power() {
return this.intensity * this.width * this.height * Math.PI;
}
set power(t) {
this.intensity = t / (this.width * this.height * Math.PI);
}
copy(t) {
return super.copy(t), (this.width = t.width), (this.height = t.height), this;
}
toJSON(t) {
const e = super.toJSON(t);
return (e.object.width = this.width), (e.object.height = this.height), e;
}
}
_l.prototype.isRectAreaLight = !0;
class bl {
constructor() {
this.coefficients = [];
for (let t = 0; t < 9; t++) this.coefficients.push(new ht());
}
set(t) {
for (let e = 0; e < 9; e++) this.coefficients[e].copy(t[e]);
return this;
}
zero() {
for (let t = 0; t < 9; t++) this.coefficients[t].set(0, 0, 0);
return this;
}
getAt(t, e) {
const n = t.x,
i = t.y,
r = t.z,
s = this.coefficients;
return e.copy(s[0]).multiplyScalar(0.282095), e.addScaledVector(s[1], 0.488603 * i), e.addScaledVector(s[2], 0.488603 * r), e.addScaledVector(s[3], 0.488603 * n), e.addScaledVector(s[4], n * i * 1.092548), e.addScaledVector(s[5], i * r * 1.092548), e.addScaledVector(s[6], 0.315392 * (3 * r * r - 1)), e.addScaledVector(s[7], n * r * 1.092548), e.addScaledVector(s[8], 0.546274 * (n * n - i * i)), e;
}
getIrradianceAt(t, e) {
const n = t.x,
i = t.y,
r = t.z,
s = this.coefficients;
return e.copy(s[0]).multiplyScalar(0.886227), e.addScaledVector(s[1], 1.023328 * i), e.addScaledVector(s[2], 1.023328 * r), e.addScaledVector(s[3], 1.023328 * n), e.addScaledVector(s[4], 0.858086 * n * i), e.addScaledVector(s[5], 0.858086 * i * r), e.addScaledVector(s[6], 0.743125 * r * r - 0.247708), e.addScaledVector(s[7], 0.858086 * n * r), e.addScaledVector(s[8], 0.429043 * (n * n - i * i)), e;
}
add(t) {
for (let e = 0; e < 9; e++) this.coefficients[e].add(t.coefficients[e]);
return this;
}
addScaledSH(t, e) {
for (let n = 0; n < 9; n++) this.coefficients[n].addScaledVector(t.coefficients[n], e);
return this;
}
scale(t) {
for (let e = 0; e < 9; e++) this.coefficients[e].multiplyScalar(t);
return this;
}
lerp(t, e) {
for (let n = 0; n < 9; n++) this.coefficients[n].lerp(t.coefficients[n], e);
return this;
}
equals(t) {
for (let e = 0; e < 9; e++) if (!this.coefficients[e].equals(t.coefficients[e])) return !1;
return !0;
}
copy(t) {
return this.set(t.coefficients);
}
clone() {
return new this.constructor().copy(this);
}
fromArray(t, e = 0) {
const n = this.coefficients;
for (let i = 0; i < 9; i++) n[i].fromArray(t, e + 3 * i);
return this;
}
toArray(t = [], e = 0) {
const n = this.coefficients;
for (let i = 0; i < 9; i++) n[i].toArray(t, e + 3 * i);
return t;
}
static getBasisAt(t, e) {
const n = t.x,
i = t.y,
r = t.z;
(e[0] = 0.282095), (e[1] = 0.488603 * i), (e[2] = 0.488603 * r), (e[3] = 0.488603 * n), (e[4] = 1.092548 * n * i), (e[5] = 1.092548 * i * r), (e[6] = 0.315392 * (3 * r * r - 1)), (e[7] = 1.092548 * n * r), (e[8] = 0.546274 * (n * n - i * i));
}
}
bl.prototype.isSphericalHarmonics3 = !0;
class wl extends rl {
constructor(t = new bl(), e = 1) {
super(void 0, e), (this.sh = t);
}
copy(t) {
return super.copy(t), this.sh.copy(t.sh), this;
}
fromJSON(t) {
return (this.intensity = t.intensity), this.sh.fromArray(t.sh), this;
}
toJSON(t) {
const e = super.toJSON(t);
return (e.object.sh = this.sh.toArray()), e;
}
}
wl.prototype.isLightProbe = !0;
class Ml {
static decodeText(t) {
if ("undefined" != typeof TextDecoder) return new TextDecoder().decode(t);
let e = "";
for (let n = 0, i = t.length; n < i; n++) e += String.fromCharCode(t[n]);
try {
return decodeURIComponent(escape(e));
} catch (t) {
return e;
}
}
static extractUrlBase(t) {
const e = t.lastIndexOf("/");
return -1 === e ? "./" : t.substr(0, e + 1);
}
static resolveURL(t, e) {
return "string" != typeof t || "" === t ? "" : (/^https?:\/\//i.test(e) && /^\//.test(t) && (e = e.replace(/(^https?:\/\/[^\/]+).*/i, "$1")), /^(https?:)?\/\//i.test(t) || /^data:.*,.*$/i.test(t) || /^blob:.*$/i.test(t) ? t : e + t);
}
}
class Sl extends qe {
constructor() {
super(), (this.type = "InstancedBufferGeometry"), (this.instanceCount = 1 / 0);
}
copy(t) {
return super.copy(t), (this.instanceCount = t.instanceCount), this;
}
clone() {
return new this.constructor().copy(this);
}
toJSON() {
const t = super.toJSON(this);
return (t.instanceCount = this.instanceCount), (t.isInstancedBufferGeometry = !0), t;
}
}
Sl.prototype.isInstancedBufferGeometry = !0;
let El;
(class extends Qo {
constructor(t) {
super(t), "undefined" == typeof createImageBitmap && console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."), "undefined" == typeof fetch && console.warn("THREE.ImageBitmapLoader: fetch() not supported."), (this.options = { premultiplyAlpha: "none" });
}
setOptions(t) {
return (this.options = t), this;
}
load(t, e, n, i) {
void 0 === t && (t = ""), void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t));
const r = this,
s = Jo.get(t);
if (void 0 !== s)
return (
r.manager.itemStart(t),
setTimeout(function () {
e && e(s), r.manager.itemEnd(t);
}, 0),
s
);
const a = {};
(a.credentials = "anonymous" === this.crossOrigin ? "same-origin" : "include"),
(a.headers = this.requestHeader),
fetch(t, a)
.then(function (t) {
return t.blob();
})
.then(function (t) {
return createImageBitmap(t, Object.assign(r.options, { colorSpaceConversion: "none" }));
})
.then(function (n) {
Jo.add(t, n), e && e(n), r.manager.itemEnd(t);
})
.catch(function (e) {
i && i(e), r.manager.itemError(t), r.manager.itemEnd(t);
}),
r.manager.itemStart(t);
}
}.prototype.isImageBitmapLoader = !0);
const Tl = function () {
return void 0 === El && (El = new (window.AudioContext || window.webkitAudioContext)()), El;
};
class Al extends Qo {
constructor(t) {
super(t);
}
load(t, e, n, i) {
const r = this,
s = new tl(this.manager);
s.setResponseType("arraybuffer"),
s.setPath(this.path),
s.setRequestHeader(this.requestHeader),
s.setWithCredentials(this.withCredentials),
s.load(
t,
function (n) {
try {
const t = n.slice(0);
Tl().decodeAudioData(t, function (t) {
e(t);
});
} catch (e) {
i ? i(e) : console.error(e), r.manager.itemError(t);
}
},
n,
i
);
}
}
(class extends wl {
constructor(t, e, n = 1) {
super(void 0, n);
const i = new Pe().set(t),
r = new Pe().set(e),
s = new ht(i.r, i.g, i.b),
a = new ht(r.r, r.g, r.b),
o = Math.sqrt(Math.PI),
l = o * Math.sqrt(0.75);
this.sh.coefficients[0].copy(s).add(a).multiplyScalar(o), this.sh.coefficients[1].copy(s).sub(a).multiplyScalar(l);
}
}.prototype.isHemisphereLightProbe = !0);
(class extends wl {
constructor(t, e = 1) {
super(void 0, e);
const n = new Pe().set(t);
this.sh.coefficients[0].set(n.r, n.g, n.b).multiplyScalar(2 * Math.sqrt(Math.PI));
}
}.prototype.isAmbientLightProbe = !0);
class Ll extends ue {
constructor(t) {
super(), (this.type = "Audio"), (this.listener = t), (this.context = t.context), (this.gain = this.context.createGain()), this.gain.connect(t.getInput()), (this.autoplay = !1), (this.buffer = null), (this.detune = 0), (this.loop = !1), (this.loopStart = 0), (this.loopEnd = 0), (this.offset = 0), (this.duration = void 0), (this.playbackRate = 1), (this.isPlaying = !1), (this.hasPlaybackControl = !0), (this.source = null), (this.sourceType = "empty"), (this._startedAt = 0), (this._progress = 0), (this._connected = !1), (this.filters = []);
}
getOutput() {
return this.gain;
}
setNodeSource(t) {
return (this.hasPlaybackControl = !1), (this.sourceType = "audioNode"), (this.source = t), this.connect(), this;
}
setMediaElementSource(t) {
return (this.hasPlaybackControl = !1), (this.sourceType = "mediaNode"), (this.source = this.context.createMediaElementSource(t)), this.connect(), this;
}
setMediaStreamSource(t) {
return (this.hasPlaybackControl = !1), (this.sourceType = "mediaStreamNode"), (this.source = this.context.createMediaStreamSource(t)), this.connect(), this;
}
setBuffer(t) {
return (this.buffer = t), (this.sourceType = "buffer"), this.autoplay && this.play(), this;
}
play(t = 0) {
if (!0 === this.isPlaying) return void console.warn("THREE.Audio: Audio is already playing.");
if (!1 === this.hasPlaybackControl) return void console.warn("THREE.Audio: this Audio has no playback control.");
this._startedAt = this.context.currentTime + t;
const e = this.context.createBufferSource();
return (e.buffer = this.buffer), (e.loop = this.loop), (e.loopStart = this.loopStart), (e.loopEnd = this.loopEnd), (e.onended = this.onEnded.bind(this)), e.start(this._startedAt, this._progress + this.offset, this.duration), (this.isPlaying = !0), (this.source = e), this.setDetune(this.detune), this.setPlaybackRate(this.playbackRate), this.connect();
}
pause() {
if (!1 !== this.hasPlaybackControl) return !0 === this.isPlaying && ((this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate), !0 === this.loop && (this._progress = this._progress % (this.duration || this.buffer.duration)), this.source.stop(), (this.source.onended = null), (this.isPlaying = !1)), this;
console.warn("THREE.Audio: this Audio has no playback control.");
}
stop() {
if (!1 !== this.hasPlaybackControl) return (this._progress = 0), this.source.stop(), (this.source.onended = null), (this.isPlaying = !1), this;
console.warn("THREE.Audio: this Audio has no playback control.");
}
connect() {
if (this.filters.length > 0) {
this.source.connect(this.filters[0]);
for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].connect(this.filters[t]);
this.filters[this.filters.length - 1].connect(this.getOutput());
} else this.source.connect(this.getOutput());
return (this._connected = !0), this;
}
disconnect() {
if (this.filters.length > 0) {
this.source.disconnect(this.filters[0]);
for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].disconnect(this.filters[t]);
this.filters[this.filters.length - 1].disconnect(this.getOutput());
} else this.source.disconnect(this.getOutput());
return (this._connected = !1), this;
}
getFilters() {
return this.filters;
}
setFilters(t) {
return t || (t = []), !0 === this._connected ? (this.disconnect(), (this.filters = t.slice()), this.connect()) : (this.filters = t.slice()), this;
}
setDetune(t) {
if (((this.detune = t), void 0 !== this.source.detune)) return !0 === this.isPlaying && this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, 0.01), this;
}
getDetune() {
return this.detune;
}
getFilter() {
return this.getFilters()[0];
}
setFilter(t) {
return this.setFilters(t ? [t] : []);
}
setPlaybackRate(t) {
if (!1 !== this.hasPlaybackControl) return (this.playbackRate = t), !0 === this.isPlaying && this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, 0.01), this;
console.warn("THREE.Audio: this Audio has no playback control.");
}
getPlaybackRate() {
return this.playbackRate;
}
onEnded() {
this.isPlaying = !1;
}
getLoop() {
return !1 === this.hasPlaybackControl ? (console.warn("THREE.Audio: this Audio has no playback control."), !1) : this.loop;
}
setLoop(t) {
if (!1 !== this.hasPlaybackControl) return (this.loop = t), !0 === this.isPlaying && (this.source.loop = this.loop), this;
console.warn("THREE.Audio: this Audio has no playback control.");
}
setLoopStart(t) {
return (this.loopStart = t), this;
}
setLoopEnd(t) {
return (this.loopEnd = t), this;
}
getVolume() {
return this.gain.gain.value;
}
setVolume(t) {
return this.gain.gain.setTargetAtTime(t, this.context.currentTime, 0.01), this;
}
}
class Cl {
constructor(t, e, n) {
let i, r, s;
switch (((this.binding = t), (this.valueSize = n), e)) {
case "quaternion":
(i = this._slerp), (r = this._slerpAdditive), (s = this._setAdditiveIdentityQuaternion), (this.buffer = new Float64Array(6 * n)), (this._workIndex = 5);
break;
case "string":
case "bool":
(i = this._select), (r = this._select), (s = this._setAdditiveIdentityOther), (this.buffer = new Array(5 * n));
break;
default:
(i = this._lerp), (r = this._lerpAdditive), (s = this._setAdditiveIdentityNumeric), (this.buffer = new Float64Array(5 * n));
}
(this._mixBufferRegion = i), (this._mixBufferRegionAdditive = r), (this._setIdentity = s), (this._origIndex = 3), (this._addIndex = 4), (this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0), (this.useCount = 0), (this.referenceCount = 0);
}
accumulate(t, e) {
const n = this.buffer,
i = this.valueSize,
r = t * i + i;
let s = this.cumulativeWeight;
if (0 === s) {
for (let t = 0; t !== i; ++t) n[r + t] = n[t];
s = e;
} else {
s += e;
const t = e / s;
this._mixBufferRegion(n, r, 0, t, i);
}
this.cumulativeWeight = s;
}
accumulateAdditive(t) {
const e = this.buffer,
n = this.valueSize,
i = n * this._addIndex;
0 === this.cumulativeWeightAdditive && this._setIdentity(), this._mixBufferRegionAdditive(e, i, 0, t, n), (this.cumulativeWeightAdditive += t);
}
apply(t) {
const e = this.valueSize,
n = this.buffer,
i = t * e + e,
r = this.cumulativeWeight,
s = this.cumulativeWeightAdditive,
a = this.binding;
if (((this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0), r < 1)) {
const t = e * this._origIndex;
this._mixBufferRegion(n, i, t, 1 - r, e);
}
s > 0 && this._mixBufferRegionAdditive(n, i, this._addIndex * e, 1, e);
for (let t = e, r = e + e; t !== r; ++t)
if (n[t] !== n[t + e]) {
a.setValue(n, i);
break;
}
}
saveOriginalState() {
const t = this.binding,
e = this.buffer,
n = this.valueSize,
i = n * this._origIndex;
t.getValue(e, i);
for (let t = n, r = i; t !== r; ++t) e[t] = e[i + (t % n)];
this._setIdentity(), (this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0);
}
restoreOriginalState() {
const t = 3 * this.valueSize;
this.binding.setValue(this.buffer, t);
}
_setAdditiveIdentityNumeric() {
const t = this._addIndex * this.valueSize,
e = t + this.valueSize;
for (let n = t; n < e; n++) this.buffer[n] = 0;
}
_setAdditiveIdentityQuaternion() {
this._setAdditiveIdentityNumeric(), (this.buffer[this._addIndex * this.valueSize + 3] = 1);
}
_setAdditiveIdentityOther() {
const t = this._origIndex * this.valueSize,
e = this._addIndex * this.valueSize;
for (let n = 0; n < this.valueSize; n++) this.buffer[e + n] = this.buffer[t + n];
}
_select(t, e, n, i, r) {
if (i >= 0.5) for (let i = 0; i !== r; ++i) t[e + i] = t[n + i];
}
_slerp(t, e, n, i) {
lt.slerpFlat(t, e, t, e, t, n, i);
}
_slerpAdditive(t, e, n, i, r) {
const s = this._workIndex * r;
lt.multiplyQuaternionsFlat(t, s, t, e, t, n), lt.slerpFlat(t, e, t, e, t, s, i);
}
_lerp(t, e, n, i, r) {
const s = 1 - i;
for (let a = 0; a !== r; ++a) {
const r = e + a;
t[r] = t[r] * s + t[n + a] * i;
}
}
_lerpAdditive(t, e, n, i, r) {
for (let s = 0; s !== r; ++s) {
const r = e + s;
t[r] = t[r] + t[n + s] * i;
}
}
}
const Rl = "\\[\\]\\.:\\/",
Pl = new RegExp("[" + Rl + "]", "g"),
Dl = "[^" + Rl + "]",
Il = "[^" + Rl.replace("\\.", "") + "]",
Nl = /((?:WC+[\/:])*)/.source.replace("WC", Dl),
zl = /(WCOD+)?/.source.replace("WCOD", Il),
Ol = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", Dl),
Fl = /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", Dl),
Bl = new RegExp("^" + Nl + zl + Ol + Fl + "$"),
Ul = ["material", "materials", "bones"];
class Hl {
constructor(t, e, n) {
(this.path = e), (this.parsedPath = n || Hl.parseTrackName(e)), (this.node = Hl.findNode(t, this.parsedPath.nodeName) || t), (this.rootNode = t), (this.getValue = this._getValue_unbound), (this.setValue = this._setValue_unbound);
}
static create(t, e, n) {
return t && t.isAnimationObjectGroup ? new Hl.Composite(t, e, n) : new Hl(t, e, n);
}
static sanitizeNodeName(t) {
return t.replace(/\s/g, "_").replace(Pl, "");
}
static parseTrackName(t) {
const e = Bl.exec(t);
if (!e) throw new Error("PropertyBinding: Cannot parse trackName: " + t);
const n = { nodeName: e[2], objectName: e[3], objectIndex: e[4], propertyName: e[5], propertyIndex: e[6] },
i = n.nodeName && n.nodeName.lastIndexOf(".");
if (void 0 !== i && -1 !== i) {
const t = n.nodeName.substring(i + 1);
-1 !== Ul.indexOf(t) && ((n.nodeName = n.nodeName.substring(0, i)), (n.objectName = t));
}
if (null === n.propertyName || 0 === n.propertyName.length) throw new Error("PropertyBinding: can not parse propertyName from trackName: " + t);
return n;
}
static findNode(t, e) {
if (!e || "" === e || "." === e || -1 === e || e === t.name || e === t.uuid) return t;
if (t.skeleton) {
const n = t.skeleton.getBoneByName(e);
if (void 0 !== n) return n;
}
if (t.children) {
const n = function (t) {
for (let i = 0; i < t.length; i++) {
const r = t[i];
if (r.name === e || r.uuid === e) return r;
const s = n(r.children);
if (s) return s;
}
return null;
},
i = n(t.children);
if (i) return i;
}
return null;
}
_getValue_unavailable() {}
_setValue_unavailable() {}
_getValue_direct(t, e) {
t[e] = this.targetObject[this.propertyName];
}
_getValue_array(t, e) {
const n = this.resolvedProperty;
for (let i = 0, r = n.length; i !== r; ++i) t[e++] = n[i];
}
_getValue_arrayElement(t, e) {
t[e] = this.resolvedProperty[this.propertyIndex];
}
_getValue_toArray(t, e) {
this.resolvedProperty.toArray(t, e);
}
_setValue_direct(t, e) {
this.targetObject[this.propertyName] = t[e];
}
_setValue_direct_setNeedsUpdate(t, e) {
(this.targetObject[this.propertyName] = t[e]), (this.targetObject.needsUpdate = !0);
}
_setValue_direct_setMatrixWorldNeedsUpdate(t, e) {
(this.targetObject[this.propertyName] = t[e]), (this.targetObject.matrixWorldNeedsUpdate = !0);
}
_setValue_array(t, e) {
const n = this.resolvedProperty;
for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++];
}
_setValue_array_setNeedsUpdate(t, e) {
const n = this.resolvedProperty;
for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++];
this.targetObject.needsUpdate = !0;
}
_setValue_array_setMatrixWorldNeedsUpdate(t, e) {
const n = this.resolvedProperty;
for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++];
this.targetObject.matrixWorldNeedsUpdate = !0;
}
_setValue_arrayElement(t, e) {
this.resolvedProperty[this.propertyIndex] = t[e];
}
_setValue_arrayElement_setNeedsUpdate(t, e) {
(this.resolvedProperty[this.propertyIndex] = t[e]), (this.targetObject.needsUpdate = !0);
}
_setValue_arrayElement_setMatrixWorldNeedsUpdate(t, e) {
(this.resolvedProperty[this.propertyIndex] = t[e]), (this.targetObject.matrixWorldNeedsUpdate = !0);
}
_setValue_fromArray(t, e) {
this.resolvedProperty.fromArray(t, e);
}
_setValue_fromArray_setNeedsUpdate(t, e) {
this.resolvedProperty.fromArray(t, e), (this.targetObject.needsUpdate = !0);
}
_setValue_fromArray_setMatrixWorldNeedsUpdate(t, e) {
this.resolvedProperty.fromArray(t, e), (this.targetObject.matrixWorldNeedsUpdate = !0);
}
_getValue_unbound(t, e) {
this.bind(), this.getValue(t, e);
}
_setValue_unbound(t, e) {
this.bind(), this.setValue(t, e);
}
bind() {
let t = this.node;
const e = this.parsedPath,
n = e.objectName,
i = e.propertyName;
let r = e.propertyIndex;
if ((t || ((t = Hl.findNode(this.rootNode, e.nodeName) || this.rootNode), (this.node = t)), (this.getValue = this._getValue_unavailable), (this.setValue = this._setValue_unavailable), !t)) return void console.error("THREE.PropertyBinding: Trying to update node for track: " + this.path + " but it wasn't found.");
if (n) {
let i = e.objectIndex;
switch (n) {
case "materials":
if (!t.material) return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this);
if (!t.material.materials) return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", this);
t = t.material.materials;
break;
case "bones":
if (!t.skeleton) return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.", this);
t = t.skeleton.bones;
for (let e = 0; e < t.length; e++)
if (t[e].name === i) {
i = e;
break;
}
break;
default:
if (void 0 === t[n]) return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.", this);
t = t[n];
}
if (void 0 !== i) {
if (void 0 === t[i]) return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", this, t);
t = t[i];
}
}
const s = t[i];
if (void 0 === s) {
const n = e.nodeName;
return void console.error("THREE.PropertyBinding: Trying to update property for track: " + n + "." + i + " but it wasn't found.", t);
}
let a = this.Versioning.None;
(this.targetObject = t), void 0 !== t.needsUpdate ? (a = this.Versioning.NeedsUpdate) : void 0 !== t.matrixWorldNeedsUpdate && (a = this.Versioning.MatrixWorldNeedsUpdate);
let o = this.BindingType.Direct;
if (void 0 !== r) {
if ("morphTargetInfluences" === i) {
if (!t.geometry) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", this);
if (!t.geometry.isBufferGeometry) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.", this);
if (!t.geometry.morphAttributes) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this);
void 0 !== t.morphTargetDictionary[r] && (r = t.morphTargetDictionary[r]);
}
(o = this.BindingType.ArrayElement), (this.resolvedProperty = s), (this.propertyIndex = r);
} else void 0 !== s.fromArray && void 0 !== s.toArray ? ((o = this.BindingType.HasFromToArray), (this.resolvedProperty = s)) : Array.isArray(s) ? ((o = this.BindingType.EntireArray), (this.resolvedProperty = s)) : (this.propertyName = i);
(this.getValue = this.GetterByBindingType[o]), (this.setValue = this.SetterByBindingTypeAndVersioning[o][a]);
}
unbind() {
(this.node = null), (this.getValue = this._getValue_unbound), (this.setValue = this._setValue_unbound);
}
}
(Hl.Composite = class {
constructor(t, e, n) {
const i = n || Hl.parseTrackName(e);
(this._targetGroup = t), (this._bindings = t.subscribe_(e, i));
}
getValue(t, e) {
this.bind();
const n = this._targetGroup.nCachedObjects_,
i = this._bindings[n];
void 0 !== i && i.getValue(t, e);
}
setValue(t, e) {
const n = this._bindings;
for (let i = this._targetGroup.nCachedObjects_, r = n.length; i !== r; ++i) n[i].setValue(t, e);
}
bind() {
const t = this._bindings;
for (let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e) t[e].bind();
}
unbind() {
const t = this._bindings;
for (let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e) t[e].unbind();
}
}),
(Hl.prototype.BindingType = { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3 }),
(Hl.prototype.Versioning = { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2 }),
(Hl.prototype.GetterByBindingType = [Hl.prototype._getValue_direct, Hl.prototype._getValue_array, Hl.prototype._getValue_arrayElement, Hl.prototype._getValue_toArray]),
(Hl.prototype.SetterByBindingTypeAndVersioning = [
[Hl.prototype._setValue_direct, Hl.prototype._setValue_direct_setNeedsUpdate, Hl.prototype._setValue_direct_setMatrixWorldNeedsUpdate],
[Hl.prototype._setValue_array, Hl.prototype._setValue_array_setNeedsUpdate, Hl.prototype._setValue_array_setMatrixWorldNeedsUpdate],
[Hl.prototype._setValue_arrayElement, Hl.prototype._setValue_arrayElement_setNeedsUpdate, Hl.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],
[Hl.prototype._setValue_fromArray, Hl.prototype._setValue_fromArray_setNeedsUpdate, Hl.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate],
]);
class Vl {
constructor(t, e, n = null, i = e.blendMode) {
(this._mixer = t), (this._clip = e), (this._localRoot = n), (this.blendMode = i);
const r = e.tracks,
s = r.length,
a = new Array(s),
o = { endingStart: R, endingEnd: R };
for (let t = 0; t !== s; ++t) {
const e = r[t].createInterpolant(null);
(a[t] = e), (e.settings = o);
}
(this._interpolantSettings = o), (this._interpolants = a), (this._propertyBindings = new Array(s)), (this._cacheIndex = null), (this._byClipCacheIndex = null), (this._timeScaleInterpolant = null), (this._weightInterpolant = null), (this.loop = 2201), (this._loopCount = -1), (this._startTime = null), (this.time = 0), (this.timeScale = 1), (this._effectiveTimeScale = 1), (this.weight = 1), (this._effectiveWeight = 1), (this.repetitions = 1 / 0), (this.paused = !1), (this.enabled = !0), (this.clampWhenFinished = !1), (this.zeroSlopeAtStart = !0), (this.zeroSlopeAtEnd = !0);
}
play() {
return this._mixer._activateAction(this), this;
}
stop() {
return this._mixer._deactivateAction(this), this.reset();
}
reset() {
return (this.paused = !1), (this.enabled = !0), (this.time = 0), (this._loopCount = -1), (this._startTime = null), this.stopFading().stopWarping();
}
isRunning() {
return this.enabled && !this.paused && 0 !== this.timeScale && null === this._startTime && this._mixer._isActiveAction(this);
}
isScheduled() {
return this._mixer._isActiveAction(this);
}
startAt(t) {
return (this._startTime = t), this;
}
setLoop(t, e) {
return (this.loop = t), (this.repetitions = e), this;
}
setEffectiveWeight(t) {
return (this.weight = t), (this._effectiveWeight = this.enabled ? t : 0), this.stopFading();
}
getEffectiveWeight() {
return this._effectiveWeight;
}
fadeIn(t) {
return this._scheduleFading(t, 0, 1);
}
fadeOut(t) {
return this._scheduleFading(t, 1, 0);
}
crossFadeFrom(t, e, n) {
if ((t.fadeOut(e), this.fadeIn(e), n)) {
const n = this._clip.duration,
i = t._clip.duration,
r = i / n,
s = n / i;
t.warp(1, r, e), this.warp(s, 1, e);
}
return this;
}
crossFadeTo(t, e, n) {
return t.crossFadeFrom(this, e, n);
}
stopFading() {
const t = this._weightInterpolant;
return null !== t && ((this._weightInterpolant = null), this._mixer._takeBackControlInterpolant(t)), this;
}
setEffectiveTimeScale(t) {
return (this.timeScale = t), (this._effectiveTimeScale = this.paused ? 0 : t), this.stopWarping();
}
getEffectiveTimeScale() {
return this._effectiveTimeScale;
}
setDuration(t) {
return (this.timeScale = this._clip.duration / t), this.stopWarping();
}
syncWith(t) {
return (this.time = t.time), (this.timeScale = t.timeScale), this.stopWarping();
}
halt(t) {
return this.warp(this._effectiveTimeScale, 0, t);
}
warp(t, e, n) {
const i = this._mixer,
r = i.time,
s = this.timeScale;
let a = this._timeScaleInterpolant;
null === a && ((a = i._lendControlInterpolant()), (this._timeScaleInterpolant = a));
const o = a.parameterPositions,
l = a.sampleValues;
return (o[0] = r), (o[1] = r + n), (l[0] = t / s), (l[1] = e / s), this;
}
stopWarping() {
const t = this._timeScaleInterpolant;
return null !== t && ((this._timeScaleInterpolant = null), this._mixer._takeBackControlInterpolant(t)), this;
}
getMixer() {
return this._mixer;
}
getClip() {
return this._clip;
}
getRoot() {
return this._localRoot || this._mixer._root;
}
_update(t, e, n, i) {
if (!this.enabled) return void this._updateWeight(t);
const r = this._startTime;
if (null !== r) {
const i = (t - r) * n;
if (i < 0 || 0 === n) return;
(this._startTime = null), (e = n * i);
}
e *= this._updateTimeScale(t);
const s = this._updateTime(e),
a = this._updateWeight(t);
if (a > 0) {
const t = this._interpolants,
e = this._propertyBindings;
if (2501 === this.blendMode) for (let n = 0, i = t.length; n !== i; ++n) t[n].evaluate(s), e[n].accumulateAdditive(a);
else for (let n = 0, r = t.length; n !== r; ++n) t[n].evaluate(s), e[n].accumulate(i, a);
}
}
_updateWeight(t) {
let e = 0;
if (this.enabled) {
e = this.weight;
const n = this._weightInterpolant;
if (null !== n) {
const i = n.evaluate(t)[0];
(e *= i), t > n.parameterPositions[1] && (this.stopFading(), 0 === i && (this.enabled = !1));
}
}
return (this._effectiveWeight = e), e;
}
_updateTimeScale(t) {
let e = 0;
if (!this.paused) {
e = this.timeScale;
const n = this._timeScaleInterpolant;
if (null !== n) {
(e *= n.evaluate(t)[0]), t > n.parameterPositions[1] && (this.stopWarping(), 0 === e ? (this.paused = !0) : (this.timeScale = e));
}
}
return (this._effectiveTimeScale = e), e;
}
_updateTime(t) {
const e = this._clip.duration,
n = this.loop;
let i = this.time + t,
r = this._loopCount;
const s = 2202 === n;
if (0 === t) return -1 === r ? i : s && 1 == (1 & r) ? e - i : i;
if (2200 === n) {
-1 === r && ((this._loopCount = 0), this._setEndings(!0, !0, !1));
t: {
if (i >= e) i = e;
else {
if (!(i < 0)) {
this.time = i;
break t;
}
i = 0;
}
this.clampWhenFinished ? (this.paused = !0) : (this.enabled = !1), (this.time = i), this._mixer.dispatchEvent({ type: "finished", action: this, direction: t < 0 ? -1 : 1 });
}
} else {
if ((-1 === r && (t >= 0 ? ((r = 0), this._setEndings(!0, 0 === this.repetitions, s)) : this._setEndings(0 === this.repetitions, !0, s)), i >= e || i < 0)) {
const n = Math.floor(i / e);
(i -= e * n), (r += Math.abs(n));
const a = this.repetitions - r;
if (a <= 0) this.clampWhenFinished ? (this.paused = !0) : (this.enabled = !1), (i = t > 0 ? e : 0), (this.time = i), this._mixer.dispatchEvent({ type: "finished", action: this, direction: t > 0 ? 1 : -1 });
else {
if (1 === a) {
const e = t < 0;
this._setEndings(e, !e, s);
} else this._setEndings(!1, !1, s);
(this._loopCount = r), (this.time = i), this._mixer.dispatchEvent({ type: "loop", action: this, loopDelta: n });
}
} else this.time = i;
if (s && 1 == (1 & r)) return e - i;
}
return i;
}
_setEndings(t, e, n) {
const i = this._interpolantSettings;
n ? ((i.endingStart = P), (i.endingEnd = P)) : ((i.endingStart = t ? (this.zeroSlopeAtStart ? P : R) : D), (i.endingEnd = e ? (this.zeroSlopeAtEnd ? P : R) : D));
}
_scheduleFading(t, e, n) {
const i = this._mixer,
r = i.time;
let s = this._weightInterpolant;
null === s && ((s = i._lendControlInterpolant()), (this._weightInterpolant = s));
const a = s.parameterPositions,
o = s.sampleValues;
return (a[0] = r), (o[0] = e), (a[1] = r + t), (o[1] = n), this;
}
}
(class extends H {
constructor(t) {
super(), (this._root = t), this._initMemoryManager(), (this._accuIndex = 0), (this.time = 0), (this.timeScale = 1);
}
_bindAction(t, e) {
const n = t._localRoot || this._root,
i = t._clip.tracks,
r = i.length,
s = t._propertyBindings,
a = t._interpolants,
o = n.uuid,
l = this._bindingsByRootAndName;
let h = l[o];
void 0 === h && ((h = {}), (l[o] = h));
for (let t = 0; t !== r; ++t) {
const r = i[t],
l = r.name;
let c = h[l];
if (void 0 !== c) s[t] = c;
else {
if (((c = s[t]), void 0 !== c)) {
null === c._cacheIndex && (++c.referenceCount, this._addInactiveBinding(c, o, l));
continue;
}
const i = e && e._propertyBindings[t].binding.parsedPath;
(c = new Cl(Hl.create(n, l, i), r.ValueTypeName, r.getValueSize())), ++c.referenceCount, this._addInactiveBinding(c, o, l), (s[t] = c);
}
a[t].resultBuffer = c.buffer;
}
}
_activateAction(t) {
if (!this._isActiveAction(t)) {
if (null === t._cacheIndex) {
const e = (t._localRoot || this._root).uuid,
n = t._clip.uuid,
i = this._actionsByClip[n];
this._bindAction(t, i && i.knownActions[0]), this._addInactiveAction(t, n, e);
}
const e = t._propertyBindings;
for (let t = 0, n = e.length; t !== n; ++t) {
const n = e[t];
0 == n.useCount++ && (this._lendBinding(n), n.saveOriginalState());
}
this._lendAction(t);
}
}
_deactivateAction(t) {
if (this._isActiveAction(t)) {
const e = t._propertyBindings;
for (let t = 0, n = e.length; t !== n; ++t) {
const n = e[t];
0 == --n.useCount && (n.restoreOriginalState(), this._takeBackBinding(n));
}
this._takeBackAction(t);
}
}
_initMemoryManager() {
(this._actions = []), (this._nActiveActions = 0), (this._actionsByClip = {}), (this._bindings = []), (this._nActiveBindings = 0), (this._bindingsByRootAndName = {}), (this._controlInterpolants = []), (this._nActiveControlInterpolants = 0);
const t = this;
this.stats = {
actions: {
get total() {
return t._actions.length;
},
get inUse() {
return t._nActiveActions;
},
},
bindings: {
get total() {
return t._bindings.length;
},
get inUse() {
return t._nActiveBindings;
},
},
controlInterpolants: {
get total() {
return t._controlInterpolants.length;
},
get inUse() {
return t._nActiveControlInterpolants;
},
},
};
}
_isActiveAction(t) {
const e = t._cacheIndex;
return null !== e && e < this._nActiveActions;
}
_addInactiveAction(t, e, n) {
const i = this._actions,
r = this._actionsByClip;
let s = r[e];
if (void 0 === s) (s = { knownActions: [t], actionByRoot: {} }), (t._byClipCacheIndex = 0), (r[e] = s);
else {
const e = s.knownActions;
(t._byClipCacheIndex = e.length), e.push(t);
}
(t._cacheIndex = i.length), i.push(t), (s.actionByRoot[n] = t);
}
_removeInactiveAction(t) {
const e = this._actions,
n = e[e.length - 1],
i = t._cacheIndex;
(n._cacheIndex = i), (e[i] = n), e.pop(), (t._cacheIndex = null);
const r = t._clip.uuid,
s = this._actionsByClip,
a = s[r],
o = a.knownActions,
l = o[o.length - 1],
h = t._byClipCacheIndex;
(l._byClipCacheIndex = h), (o[h] = l), o.pop(), (t._byClipCacheIndex = null);
delete a.actionByRoot[(t._localRoot || this._root).uuid], 0 === o.length && delete s[r], this._removeInactiveBindingsForAction(t);
}
_removeInactiveBindingsForAction(t) {
const e = t._propertyBindings;
for (let t = 0, n = e.length; t !== n; ++t) {
const n = e[t];
0 == --n.referenceCount && this._removeInactiveBinding(n);
}
}
_lendAction(t) {
const e = this._actions,
n = t._cacheIndex,
i = this._nActiveActions++,
r = e[i];
(t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r);
}
_takeBackAction(t) {
const e = this._actions,
n = t._cacheIndex,
i = --this._nActiveActions,
r = e[i];
(t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r);
}
_addInactiveBinding(t, e, n) {
const i = this._bindingsByRootAndName,
r = this._bindings;
let s = i[e];
void 0 === s && ((s = {}), (i[e] = s)), (s[n] = t), (t._cacheIndex = r.length), r.push(t);
}
_removeInactiveBinding(t) {
const e = this._bindings,
n = t.binding,
i = n.rootNode.uuid,
r = n.path,
s = this._bindingsByRootAndName,
a = s[i],
o = e[e.length - 1],
l = t._cacheIndex;
(o._cacheIndex = l), (e[l] = o), e.pop(), delete a[r], 0 === Object.keys(a).length && delete s[i];
}
_lendBinding(t) {
const e = this._bindings,
n = t._cacheIndex,
i = this._nActiveBindings++,
r = e[i];
(t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r);
}
_takeBackBinding(t) {
const e = this._bindings,
n = t._cacheIndex,
i = --this._nActiveBindings,
r = e[i];
(t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r);
}
_lendControlInterpolant() {
const t = this._controlInterpolants,
e = this._nActiveControlInterpolants++;
let n = t[e];
return void 0 === n && ((n = new Fo(new Float32Array(2), new Float32Array(2), 1, this._controlInterpolantsResultBuffer)), (n.__cacheIndex = e), (t[e] = n)), n;
}
_takeBackControlInterpolant(t) {
const e = this._controlInterpolants,
n = t.__cacheIndex,
i = --this._nActiveControlInterpolants,
r = e[i];
(t.__cacheIndex = i), (e[i] = t), (r.__cacheIndex = n), (e[n] = r);
}
clipAction(t, e, n) {
const i = e || this._root,
r = i.uuid;
let s = "string" == typeof t ? Xo.findByName(i, t) : t;
const a = null !== s ? s.uuid : t,
o = this._actionsByClip[a];
let l = null;
if ((void 0 === n && (n = null !== s ? s.blendMode : I), void 0 !== o)) {
const t = o.actionByRoot[r];
if (void 0 !== t && t.blendMode === n) return t;
(l = o.knownActions[0]), null === s && (s = l._clip);
}
if (null === s) return null;
const h = new Vl(this, s, e, n);
return this._bindAction(h, l), this._addInactiveAction(h, a, r), h;
}
existingAction(t, e) {
const n = e || this._root,
i = n.uuid,
r = "string" == typeof t ? Xo.findByName(n, t) : t,
s = r ? r.uuid : t,
a = this._actionsByClip[s];
return (void 0 !== a && a.actionByRoot[i]) || null;
}
stopAllAction() {
const t = this._actions;
for (let e = this._nActiveActions - 1; e >= 0; --e) t[e].stop();
return this;
}
update(t) {
t *= this.timeScale;
const e = this._actions,
n = this._nActiveActions,
i = (this.time += t),
r = Math.sign(t),
s = (this._accuIndex ^= 1);
for (let a = 0; a !== n; ++a) {
e[a]._update(i, t, r, s);
}
const a = this._bindings,
o = this._nActiveBindings;
for (let t = 0; t !== o; ++t) a[t].apply(s);
return this;
}
setTime(t) {
this.time = 0;
for (let t = 0; t < this._actions.length; t++) this._actions[t].time = 0;
return this.update(t);
}
getRoot() {
return this._root;
}
uncacheClip(t) {
const e = this._actions,
n = t.uuid,
i = this._actionsByClip,
r = i[n];
if (void 0 !== r) {
const t = r.knownActions;
for (let n = 0, i = t.length; n !== i; ++n) {
const i = t[n];
this._deactivateAction(i);
const r = i._cacheIndex,
s = e[e.length - 1];
(i._cacheIndex = null), (i._byClipCacheIndex = null), (s._cacheIndex = r), (e[r] = s), e.pop(), this._removeInactiveBindingsForAction(i);
}
delete i[n];
}
}
uncacheRoot(t) {
const e = t.uuid,
n = this._actionsByClip;
for (const t in n) {
const i = n[t].actionByRoot[e];
void 0 !== i && (this._deactivateAction(i), this._removeInactiveAction(i));
}
const i = this._bindingsByRootAndName[e];
if (void 0 !== i)
for (const t in i) {
const e = i[t];
e.restoreOriginalState(), this._removeInactiveBinding(e);
}
}
uncacheAction(t, e) {
const n = this.existingAction(t, e);
null !== n && (this._deactivateAction(n), this._removeInactiveAction(n));
}
}.prototype._controlInterpolantsResultBuffer = new Float32Array(1));
class kl {
constructor(t) {
"string" == typeof t && (console.warn("THREE.Uniform: Type parameter is no longer needed."), (t = arguments[1])), (this.value = t);
}
clone() {
return new kl(void 0 === this.value.clone ? this.value : this.value.clone());
}
}
(class extends As {
constructor(t, e, n = 1) {
super(t, e), (this.meshPerAttribute = n);
}
copy(t) {
return super.copy(t), (this.meshPerAttribute = t.meshPerAttribute), this;
}
clone(t) {
const e = super.clone(t);
return (e.meshPerAttribute = this.meshPerAttribute), e;
}
toJSON(t) {
const e = super.toJSON(t);
return (e.isInstancedInterleavedBuffer = !0), (e.meshPerAttribute = this.meshPerAttribute), e;
}
}.prototype.isInstancedInterleavedBuffer = !0);
const Gl = new $();
class Wl {
constructor(t = new $(1 / 0, 1 / 0), e = new $(-1 / 0, -1 / 0)) {
(this.min = t), (this.max = e);
}
set(t, e) {
return this.min.copy(t), this.max.copy(e), this;
}
setFromPoints(t) {
this.makeEmpty();
for (let e = 0, n = t.length; e < n; e++) this.expandByPoint(t[e]);
return this;
}
setFromCenterAndSize(t, e) {
const n = Gl.copy(e).multiplyScalar(0.5);
return this.min.copy(t).sub(n), this.max.copy(t).add(n), this;
}
clone() {
return new this.constructor().copy(this);
}
copy(t) {
return this.min.copy(t.min), this.max.copy(t.max), this;
}
makeEmpty() {
return (this.min.x = this.min.y = 1 / 0), (this.max.x = this.max.y = -1 / 0), this;
}
isEmpty() {
return this.max.x < this.min.x || this.max.y < this.min.y;
}
getCenter(t) {
return this.isEmpty() ? t.set(0, 0) : t.addVectors(this.min, this.max).multiplyScalar(0.5);
}
getSize(t) {
return this.isEmpty() ? t.set(0, 0) : t.subVectors(this.max, this.min);
}
expandByPoint(t) {
return this.min.min(t), this.max.max(t), this;
}
expandByVector(t) {
return this.min.sub(t), this.max.add(t), this;
}
expandByScalar(t) {
return this.min.addScalar(-t), this.max.addScalar(t), this;
}
containsPoint(t) {
return !(t.x < this.min.x || t.x > this.max.x || t.y < this.min.y || t.y > this.max.y);
}
containsBox(t) {
return this.min.x <= t.min.x && t.max.x <= this.max.x && this.min.y <= t.min.y && t.max.y <= this.max.y;
}
getParameter(t, e) {
return e.set((t.x - this.min.x) / (this.max.x - this.min.x), (t.y - this.min.y) / (this.max.y - this.min.y));
}
intersectsBox(t) {
return !(t.max.x < this.min.x || t.min.x > this.max.x || t.max.y < this.min.y || t.min.y > this.max.y);
}
clampPoint(t, e) {
return e.copy(t).clamp(this.min, this.max);
}
distanceToPoint(t) {
return Gl.copy(t).clamp(this.min, this.max).sub(t).length();
}
intersect(t) {
return this.min.max(t.min), this.max.min(t.max), this;
}
union(t) {
return this.min.min(t.min), this.max.max(t.max), this;
}
translate(t) {
return this.min.add(t), this.max.add(t), this;
}
equals(t) {
return t.min.equals(this.min) && t.max.equals(this.max);
}
}
Wl.prototype.isBox2 = !0;
const jl = new ht(),
ql = new Ht(),
Xl = new Ht();
function Yl(t) {
const e = [];
t && t.isBone && e.push(t);
for (let n = 0; n < t.children.length; n++) e.push.apply(e, Yl(t.children[n]));
return e;
}
const Jl = new Float32Array(1);
new Int32Array(Jl.buffer);
(Ea.create = function (t, e) {
return console.log("THREE.Curve.create() has been deprecated"), (t.prototype = Object.create(Ea.prototype)), (t.prototype.constructor = t), (t.prototype.getPoint = e), t;
}),
(ja.prototype.fromPoints = function (t) {
return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."), this.setFromPoints(t);
}),
(class extends fa {
constructor(t = 10, e = 10, n = 4473924, i = 8947848) {
(n = new Pe(n)), (i = new Pe(i));
const r = e / 2,
s = t / e,
a = t / 2,
o = [],
l = [];
for (let t = 0, h = 0, c = -a; t <= e; t++, c += s) {
o.push(-a, 0, c, a, 0, c), o.push(c, 0, -a, c, 0, a);
const e = t === r ? n : i;
e.toArray(l, h), (h += 3), e.toArray(l, h), (h += 3), e.toArray(l, h), (h += 3), e.toArray(l, h), (h += 3);
}
const h = new qe();
h.setAttribute("position", new Be(o, 3)), h.setAttribute("color", new Be(l, 3));
super(h, new aa({ vertexColors: !0, toneMapped: !1 })), (this.type = "GridHelper");
}
}.prototype.setColors = function () {
console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.");
}),
(class extends fa {
constructor(t) {
const e = Yl(t),
n = new qe(),
i = [],
r = [],
s = new Pe(0, 0, 1),
a = new Pe(0, 1, 0);
for (let t = 0; t < e.length; t++) {
const n = e[t];
n.parent && n.parent.isBone && (i.push(0, 0, 0), i.push(0, 0, 0), r.push(s.r, s.g, s.b), r.push(a.r, a.g, a.b));
}
n.setAttribute("position", new Be(i, 3)), n.setAttribute("color", new Be(r, 3));
super(n, new aa({ vertexColors: !0, depthTest: !1, depthWrite: !1, toneMapped: !1, transparent: !0 })), (this.type = "SkeletonHelper"), (this.isSkeletonHelper = !0), (this.root = t), (this.bones = e), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1);
}
updateMatrixWorld(t) {
const e = this.bones,
n = this.geometry,
i = n.getAttribute("position");
Xl.copy(this.root.matrixWorld).invert();
for (let t = 0, n = 0; t < e.length; t++) {
const r = e[t];
r.parent && r.parent.isBone && (ql.multiplyMatrices(Xl, r.matrixWorld), jl.setFromMatrixPosition(ql), i.setXYZ(n, jl.x, jl.y, jl.z), ql.multiplyMatrices(Xl, r.parent.matrixWorld), jl.setFromMatrixPosition(ql), i.setXYZ(n + 1, jl.x, jl.y, jl.z), (n += 2));
}
(n.getAttribute("position").needsUpdate = !0), super.updateMatrixWorld(t);
}
}.prototype.update = function () {
console.error("THREE.SkeletonHelper: update() no longer needs to be called.");
}),
(Qo.prototype.extractUrlBase = function (t) {
return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."), Ml.extractUrlBase(t);
}),
(Qo.Handlers = {
add: function () {
console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.");
},
get: function () {
console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.");
},
}),
(Wl.prototype.center = function (t) {
return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."), this.getCenter(t);
}),
(Wl.prototype.empty = function () {
return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."), this.isEmpty();
}),
(Wl.prototype.isIntersectionBox = function (t) {
return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t);
}),
(Wl.prototype.size = function (t) {
return console.warn("THREE.Box2: .size() has been renamed to .getSize()."), this.getSize(t);
}),
(dt.prototype.center = function (t) {
return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."), this.getCenter(t);
}),
(dt.prototype.empty = function () {
return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."), this.isEmpty();
}),
(dt.prototype.isIntersectionBox = function (t) {
return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t);
}),
(dt.prototype.isIntersectionSphere = function (t) {
return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."), this.intersectsSphere(t);
}),
(dt.prototype.size = function (t) {
return console.warn("THREE.Box3: .size() has been renamed to .getSize()."), this.getSize(t);
}),
(Pt.prototype.empty = function () {
return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."), this.isEmpty();
}),
(Rn.prototype.setFromMatrix = function (t) {
return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."), this.setFromProjectionMatrix(t);
}),
(Z.prototype.flattenToArrayOffset = function (t, e) {
return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."), this.toArray(t, e);
}),
(Z.prototype.multiplyVector3 = function (t) {
return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."), t.applyMatrix3(this);
}),
(Z.prototype.multiplyVector3Array = function () {
console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.");
}),
(Z.prototype.applyToBufferAttribute = function (t) {
return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."), t.applyMatrix3(this);
}),
(Z.prototype.applyToVector3Array = function () {
console.error("THREE.Matrix3: .applyToVector3Array() has been removed.");
}),
(Z.prototype.getInverse = function (t) {
return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."), this.copy(t).invert();
}),
(Ht.prototype.extractPosition = function (t) {
return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."), this.copyPosition(t);
}),
(Ht.prototype.flattenToArrayOffset = function (t, e) {
return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."), this.toArray(t, e);
}),
(Ht.prototype.getPosition = function () {
return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."), new ht().setFromMatrixColumn(this, 3);
}),
(Ht.prototype.setRotationFromQuaternion = function (t) {
return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."), this.makeRotationFromQuaternion(t);
}),
(Ht.prototype.multiplyToArray = function () {
console.warn("THREE.Matrix4: .multiplyToArray() has been removed.");
}),
(Ht.prototype.multiplyVector3 = function (t) {
return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this);
}),
(Ht.prototype.multiplyVector4 = function (t) {
return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this);
}),
(Ht.prototype.multiplyVector3Array = function () {
console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.");
}),
(Ht.prototype.rotateAxis = function (t) {
console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."), t.transformDirection(this);
}),
(Ht.prototype.crossVector = function (t) {
return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this);
}),
(Ht.prototype.translate = function () {
console.error("THREE.Matrix4: .translate() has been removed.");
}),
(Ht.prototype.rotateX = function () {
console.error("THREE.Matrix4: .rotateX() has been removed.");
}),
(Ht.prototype.rotateY = function () {
console.error("THREE.Matrix4: .rotateY() has been removed.");
}),
(Ht.prototype.rotateZ = function () {
console.error("THREE.Matrix4: .rotateZ() has been removed.");
}),
(Ht.prototype.rotateByAxis = function () {
console.error("THREE.Matrix4: .rotateByAxis() has been removed.");
}),
(Ht.prototype.applyToBufferAttribute = function (t) {
return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."), t.applyMatrix4(this);
}),
(Ht.prototype.applyToVector3Array = function () {
console.error("THREE.Matrix4: .applyToVector3Array() has been removed.");
}),
(Ht.prototype.makeFrustum = function (t, e, n, i, r, s) {
return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."), this.makePerspective(t, e, i, n, r, s);
}),
(Ht.prototype.getInverse = function (t) {
return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."), this.copy(t).invert();
}),
(An.prototype.isIntersectionLine = function (t) {
return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."), this.intersectsLine(t);
}),
(lt.prototype.multiplyVector3 = function (t) {
return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."), t.applyQuaternion(this);
}),
(lt.prototype.inverse = function () {
return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."), this.invert();
}),
(Ut.prototype.isIntersectionBox = function (t) {
return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t);
}),
(Ut.prototype.isIntersectionPlane = function (t) {
return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."), this.intersectsPlane(t);
}),
(Ut.prototype.isIntersectionSphere = function (t) {
return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."), this.intersectsSphere(t);
}),
(we.prototype.area = function () {
return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."), this.getArea();
}),
(we.prototype.barycoordFromPoint = function (t, e) {
return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."), this.getBarycoord(t, e);
}),
(we.prototype.midpoint = function (t) {
return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."), this.getMidpoint(t);
}),
(we.prototypenormal = function (t) {
return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."), this.getNormal(t);
}),
(we.prototype.plane = function (t) {
return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."), this.getPlane(t);
}),
(we.barycoordFromPoint = function (t, e, n, i, r) {
return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."), we.getBarycoord(t, e, n, i, r);
}),
(we.normal = function (t, e, n, i) {
return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."), we.getNormal(t, e, n, i);
}),
(qa.prototype.extractAllPoints = function (t) {
return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."), this.extractPoints(t);
}),
(qa.prototype.extrude = function (t) {
return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."), new wo(this, t);
}),
(qa.prototype.makeGeometry = function (t) {
return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."), new So(this, t);
}),
($.prototype.fromAttribute = function (t, e, n) {
return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n);
}),
($.prototype.distanceToManhattan = function (t) {
return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."), this.manhattanDistanceTo(t);
}),
($.prototype.lengthManhattan = function () {
return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength();
}),
(ht.prototype.setEulerFromRotationMatrix = function () {
console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.");
}),
(ht.prototype.setEulerFromQuaternion = function () {
console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.");
}),
(ht.prototype.getPositionFromMatrix = function (t) {
return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."), this.setFromMatrixPosition(t);
}),
(ht.prototype.getScaleFromMatrix = function (t) {
return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."), this.setFromMatrixScale(t);
}),
(ht.prototype.getColumnFromMatrix = function (t, e) {
return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."), this.setFromMatrixColumn(e, t);
}),
(ht.prototype.applyProjection = function (t) {
return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."), this.applyMatrix4(t);
}),
(ht.prototype.fromAttribute = function (t, e, n) {
return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n);
}),
(ht.prototype.distanceToManhattan = function (t) {
return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."), this.manhattanDistanceTo(t);
}),
(ht.prototype.lengthManhattan = function () {
return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength();
}),
(st.prototype.fromAttribute = function (t, e, n) {
return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n);
}),
(st.prototype.lengthManhattan = function () {
return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength();
}),
(ue.prototype.getChildByName = function (t) {
return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."), this.getObjectByName(t);
}),
(ue.prototype.renderDepth = function () {
console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.");
}),
(ue.prototype.translate = function (t, e) {
return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."), this.translateOnAxis(e, t);
}),
(ue.prototype.getWorldRotation = function () {
console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.");
}),
(ue.prototype.applyMatrix = function (t) {
return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."), this.applyMatrix4(t);
}),
Object.defineProperties(ue.prototype, {
eulerOrder: {
get: function () {
return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."), this.rotation.order;
},
set: function (t) {
console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."), (this.rotation.order = t);
},
},
useQuaternion: {
get: function () {
console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.");
},
set: function () {
console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.");
},
},
}),
(un.prototype.setDrawMode = function () {
console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.");
}),
Object.defineProperties(un.prototype, {
drawMode: {
get: function () {
return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."), 0;
},
set: function () {
console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.");
},
},
}),
(Zs.prototype.initBones = function () {
console.error("THREE.SkinnedMesh: initBones() has been removed.");
}),
(yn.prototype.setLens = function (t, e) {
console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."), void 0 !== e && (this.filmGauge = e), this.setFocalLength(t);
}),
Object.defineProperties(rl.prototype, {
onlyShadow: {
set: function () {
console.warn("THREE.Light: .onlyShadow has been removed.");
},
},
shadowCameraFov: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."), (this.shadow.camera.fov = t);
},
},
shadowCameraLeft: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."), (this.shadow.camera.left = t);
},
},
shadowCameraRight: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."), (this.shadow.camera.right = t);
},
},
shadowCameraTop: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."), (this.shadow.camera.top = t);
},
},
shadowCameraBottom: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."), (this.shadow.camera.bottom = t);
},
},
shadowCameraNear: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."), (this.shadow.camera.near = t);
},
},
shadowCameraFar: {
set: function (t) {
console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."), (this.shadow.camera.far = t);
},
},
shadowCameraVisible: {
set: function () {
console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.");
},
},
shadowBias: {
set: function (t) {
console.warn("THREE.Light: .shadowBias is now .shadow.bias."), (this.shadow.bias = t);
},
},
shadowDarkness: {
set: function () {
console.warn("THREE.Light: .shadowDarkness has been removed.");
},
},
shadowMapWidth: {
set: function (t) {
console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."), (this.shadow.mapSize.width = t);
},
},
shadowMapHeight: {
set: function (t) {
console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."), (this.shadow.mapSize.height = t);
},
},
}),
Object.defineProperties(ze.prototype, {
length: {
get: function () {
return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."), this.array.length;
},
},
dynamic: {
get: function () {
return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."), this.usage === B;
},
set: function () {
console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."), this.setUsage(B);
},
},
}),
(ze.prototype.setDynamic = function (t) {
return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."), this.setUsage(!0 === t ? B : F), this;
}),
(ze.prototype.copyIndicesArray = function () {
console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.");
}),
(ze.prototype.setArray = function () {
console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers");
}),
(qe.prototype.addIndex = function (t) {
console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."), this.setIndex(t);
}),
(qe.prototype.addAttribute = function (t, e) {
return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."), (e && e.isBufferAttribute) || (e && e.isInterleavedBufferAttribute) ? ("index" === t ? (console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."), this.setIndex(e), this) : this.setAttribute(t, e)) : (console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), this.setAttribute(t, new ze(arguments[1], arguments[2])));
}),
(qe.prototype.addDrawCall = function (t, e, n) {
void 0 !== n && console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."), console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."), this.addGroup(t, e);
}),
(qe.prototype.clearDrawCalls = function () {
console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."), this.clearGroups();
}),
(qe.prototype.computeOffsets = function () {
console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.");
}),
(qe.prototype.removeAttribute = function (t) {
return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."), this.deleteAttribute(t);
}),
(qe.prototype.applyMatrix = function (t) {
return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."), this.applyMatrix4(t);
}),
Object.defineProperties(qe.prototype, {
drawcalls: {
get: function () {
return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."), this.groups;
},
},
offsets: {
get: function () {
return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."), this.groups;
},
},
}),
(As.prototype.setDynamic = function (t) {
return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."), this.setUsage(!0 === t ? B : F), this;
}),
(As.prototype.setArray = function () {
console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers");
}),
(wo.prototype.getArrays = function () {
console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.");
}),
(wo.prototype.addShapeList = function () {
console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.");
}),
(wo.prototype.addShape = function () {
console.error("THREE.ExtrudeGeometry: .addShape() has been removed.");
}),
(Ts.prototype.dispose = function () {
console.error("THREE.Scene: .dispose() has been removed.");
}),
(kl.prototype.onUpdate = function () {
return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."), this;
}),
Object.defineProperties(Se.prototype, {
wrapAround: {
get: function () {
console.warn("THREE.Material: .wrapAround has been removed.");
},
set: function () {
console.warn("THREE.Material: .wrapAround has been removed.");
},
},
overdraw: {
get: function () {
console.warn("THREE.Material: .overdraw has been removed.");
},
set: function () {
console.warn("THREE.Material: .overdraw has been removed.");
},
},
wrapRGB: {
get: function () {
return console.warn("THREE.Material: .wrapRGB has been removed."), new Pe();
},
},
shading: {
get: function () {
console.error("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead.");
},
set: function (t) {
console.warn("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead."), (this.flatShading = 1 === t);
},
},
stencilMask: {
get: function () {
return console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead."), this.stencilFuncMask;
},
set: function (t) {
console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead."), (this.stencilFuncMask = t);
},
},
vertexTangents: {
get: function () {
console.warn("THREE." + this.type + ": .vertexTangents has been removed.");
},
set: function () {
console.warn("THREE." + this.type + ": .vertexTangents has been removed.");
},
},
}),
Object.defineProperties(vn.prototype, {
derivatives: {
get: function () {
return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."), this.extensions.derivatives;
},
set: function (t) {
console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."), (this.extensions.derivatives = t);
},
},
}),
(Ms.prototype.clearTarget = function (t, e, n, i) {
console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."), this.setRenderTarget(t), this.clear(e, n, i);
}),
(Ms.prototype.animate = function (t) {
console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."), this.setAnimationLoop(t);
}),
(Ms.prototype.getCurrentRenderTarget = function () {
return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."), this.getRenderTarget();
}),
(Ms.prototype.getMaxAnisotropy = function () {
return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."), this.capabilities.getMaxAnisotropy();
}),
(Ms.prototype.getPrecision = function () {
return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."), this.capabilities.precision;
}),
(Ms.prototype.resetGLState = function () {
return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."), this.state.reset();
}),
(Ms.prototype.supportsFloatTextures = function () {
return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."), this.extensions.get("OES_texture_float");
}),
(Ms.prototype.supportsHalfFloatTextures = function () {
return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."), this.extensions.get("OES_texture_half_float");
}),
(Ms.prototype.supportsStandardDerivatives = function () {
return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."), this.extensions.get("OES_standard_derivatives");
}),
(Ms.prototype.supportsCompressedTextureS3TC = function () {
return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."), this.extensions.get("WEBGL_compressed_texture_s3tc");
}),
(Ms.prototype.supportsCompressedTexturePVRTC = function () {
return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."), this.extensions.get("WEBGL_compressed_texture_pvrtc");
}),
(Ms.prototype.supportsBlendMinMax = function () {
return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."), this.extensions.get("EXT_blend_minmax");
}),
(Ms.prototype.supportsVertexTextures = function () {
return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."), this.capabilities.vertexTextures;
}),
(Ms.prototype.supportsInstancedArrays = function () {
return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."), this.extensions.get("ANGLE_instanced_arrays");
}),
(Ms.prototype.enableScissorTest = function (t) {
console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."), this.setScissorTest(t);
}),
(Ms.prototype.initMaterial = function () {
console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.");
}),
(Ms.prototype.addPrePlugin = function () {
console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.");
}),
(Ms.prototype.addPostPlugin = function () {
console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.");
}),
(Ms.prototype.updateShadowMap = function () {
console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.");
}),
(Ms.prototype.setFaceCulling = function () {
console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.");
}),
(Ms.prototype.allocTextureUnit = function () {
console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.");
}),
(Ms.prototype.setTexture = function () {
console.warn("THREE.WebGLRenderer: .setTexture() has been removed.");
}),
(Ms.prototype.setTexture2D = function () {
console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.");
}),
(Ms.prototype.setTextureCube = function () {
console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.");
}),
(Ms.prototype.getActiveMipMapLevel = function () {
return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."), this.getActiveMipmapLevel();
}),
Object.defineProperties(Ms.prototype, {
shadowMapEnabled: {
get: function () {
return this.shadowMap.enabled;
},
set: function (t) {
console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."), (this.shadowMap.enabled = t);
},
},
shadowMapType: {
get: function () {
return this.shadowMap.type;
},
set: function (t) {
console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."), (this.shadowMap.type = t);
},
},
shadowMapCullFace: {
get: function () {
console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.");
},
set: function () {
console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.");
},
},
context: {
get: function () {
return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."), this.getContext();
},
},
vr: {
get: function () {
return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"), this.xr;
},
},
gammaInput: {
get: function () {
return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."), !1;
},
set: function () {
console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.");
},
},
gammaOutput: {
get: function () {
return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."), !1;
},
set: function (t) {
console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."), (this.outputEncoding = !0 === t ? z : N);
},
},
toneMappingWhitePoint: {
get: function () {
return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."), 1;
},
set: function () {
console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.");
},
},
gammaFactor: {
get: function () {
return console.warn("THREE.WebGLRenderer: .gammaFactor has been removed."), 2;
},
set: function () {
console.warn("THREE.WebGLRenderer: .gammaFactor has been removed.");
},
},
}),
Object.defineProperties(ds.prototype, {
cullFace: {
get: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.");
},
set: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.");
},
},
renderReverseSided: {
get: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.");
},
set: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.");
},
},
renderSingleSided: {
get: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.");
},
set: function () {
console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.");
},
},
}),
Object.defineProperties(at.prototype, {
wrapS: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."), this.texture.wrapS;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."), (this.texture.wrapS = t);
},
},
wrapT: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."), this.texture.wrapT;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."), (this.texture.wrapT = t);
},
},
magFilter: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."), this.texture.magFilter;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."), (this.texture.magFilter = t);
},
},
minFilter: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."), this.texture.minFilter;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."), (this.texture.minFilter = t);
},
},
anisotropy: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."), this.texture.anisotropy;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."), (this.texture.anisotropy = t);
},
},
offset: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."), this.texture.offset;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."), (this.texture.offset = t);
},
},
repeat: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."), this.texture.repeat;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."), (this.texture.repeat = t);
},
},
format: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."), this.texture.format;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."), (this.texture.format = t);
},
},
type: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."), this.texture.type;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."), (this.texture.type = t);
},
},
generateMipmaps: {
get: function () {
return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."), this.texture.generateMipmaps;
},
set: function (t) {
console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."), (this.texture.generateMipmaps = t);
},
},
}),
(Ll.prototype.load = function (t) {
console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");
const e = this;
return (
new Al().load(t, function (t) {
e.setBuffer(t);
}),
this
);
}),
(bn.prototype.updateCubeMap = function (t, e) {
return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."), this.update(t, e);
}),
(bn.prototype.clear = function (t, e, n, i) {
return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."), this.renderTarget.clear(t, e, n, i);
}),
(et.crossOrigin = void 0),
(et.loadTexture = function (t, e, n, i) {
console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");
const r = new il();
r.setCrossOrigin(this.crossOrigin);
const s = r.load(t, n, void 0, i);
return e && (s.mapping = e), s;
}),
(et.loadTextureCube = function (t, e, n, i) {
console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");
const r = new nl();
r.setCrossOrigin(this.crossOrigin);
const s = r.load(t, n, void 0, i);
return e && (s.mapping = e), s;
}),
(et.loadCompressedTexture = function () {
console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.");
}),
(et.loadCompressedTextureCube = function () {
console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.");
});
"undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", { detail: { revision: e } })), "undefined" != typeof window && (window.__THREE__ ? console.warn("WARNING: Multiple instances of Three.js being imported.") : (window.__THREE__ = e));
/**
* lil-gui
* https://lil-gui.georgealways.com
* @version 0.16.1
* @author George Michael Brower
* @license MIT
*/
class $l {
constructor(t, e, n, i, r = "div") {
(this.parent = t), (this.object = e), (this.property = n), (this._disabled = !1), (this.initialValue = this.getValue()), (this.domElement = document.createElement("div")), this.domElement.classList.add("controller"), this.domElement.classList.add(i), (this.$name = document.createElement("div")), this.$name.classList.add("name"), ($l.nextNameID = $l.nextNameID || 0), (this.$name.id = "lil-gui-name-" + ++$l.nextNameID), (this.$widget = document.createElement(r)), this.$widget.classList.add("widget"), (this.$disable = this.$widget), this.domElement.appendChild(this.$name), this.domElement.appendChild(this.$widget), this.parent.children.push(this), this.parent.controllers.push(this), this.parent.$children.appendChild(this.domElement), (this._listenCallback = this._listenCallback.bind(this)), this.name(n);
}
name(t) {
return (this._name = t), (this.$name.innerHTML = t), this;
}
onChange(t) {
return (this._onChange = t), this;
}
_callOnChange() {
this.parent._callOnChange(this), void 0 !== this._onChange && this._onChange.call(this, this.getValue()), (this._changed = !0);
}
onFinishChange(t) {
return (this._onFinishChange = t), this;
}
_callOnFinishChange() {
this._changed && (this.parent._callOnFinishChange(this), void 0 !== this._onFinishChange && this._onFinishChange.call(this, this.getValue())), (this._changed = !1);
}
reset() {
return this.setValue(this.initialValue), this._callOnFinishChange(), this;
}
enable(t = !0) {
return this.disable(!t);
}
disable(t = !0) {
return t === this._disabled || ((this._disabled = t), this.domElement.classList.toggle("disabled", t), this.$disable.toggleAttribute("disabled", t)), this;
}
options(t) {
const e = this.parent.add(this.object, this.property, t);
return e.name(this._name), this.destroy(), e;
}
min(t) {
return this;
}
max(t) {
return this;
}
step(t) {
return this;
}
listen(t = !0) {
return (this._listening = t), void 0 !== this._listenCallbackID && (cancelAnimationFrame(this._listenCallbackID), (this._listenCallbackID = void 0)), this._listening && this._listenCallback(), this;
}
_listenCallback() {
this._listenCallbackID = requestAnimationFrame(this._listenCallback);
const t = this.save();
t !== this._listenPrevValue && this.updateDisplay(), (this._listenPrevValue = t);
}
getValue() {
return this.object[this.property];
}
setValue(t) {
return (this.object[this.property] = t), this._callOnChange(), this.updateDisplay(), this;
}
updateDisplay() {
return this;
}
load(t) {
return this.setValue(t), this._callOnFinishChange(), this;
}
save() {
return this.getValue();
}
destroy() {
this.listen(!1), this.parent.children.splice(this.parent.children.indexOf(this), 1), this.parent.controllers.splice(this.parent.controllers.indexOf(this), 1), this.parent.$children.removeChild(this.domElement);
}
}
class Zl extends $l {
constructor(t, e, n) {
super(t, e, n, "boolean", "label"),
(this.$input = document.createElement("input")),
this.$input.setAttribute("type", "checkbox"),
this.$input.setAttribute("aria-labelledby", this.$name.id),
this.$widget.appendChild(this.$input),
this.$input.addEventListener("change", () => {
this.setValue(this.$input.checked), this._callOnFinishChange();
}),
(this.$disable = this.$input),
this.updateDisplay();
}
updateDisplay() {
return (this.$input.checked = this.getValue()), this;
}
}
function Ql(t) {
let e, n;
return (e = t.match(/(#|0x)?([a-f0-9]{6})/i)) ? (n = e[2]) : (e = t.match(/rgb\(\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)\s*\)/)) ? (n = parseInt(e[1]).toString(16).padStart(2, 0) + parseInt(e[2]).toString(16).padStart(2, 0) + parseInt(e[3]).toString(16).padStart(2, 0)) : (e = t.match(/^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i)) && (n = e[1] + e[1] + e[2] + e[2] + e[3] + e[3]), !!n && "#" + n;
}
const Kl = { isPrimitive: !0, match: (t) => "string" == typeof t, fromHexString: Ql, toHexString: Ql },
th = { isPrimitive: !0, match: (t) => "number" == typeof t, fromHexString: (t) => parseInt(t.substring(1), 16), toHexString: (t) => "#" + t.toString(16).padStart(6, 0) },
eh = {
isPrimitive: !1,
match: Array.isArray,
fromHexString(t, e, n = 1) {
const i = th.fromHexString(t);
(e[0] = (((i >> 16) & 255) / 255) * n), (e[1] = (((i >> 8) & 255) / 255) * n), (e[2] = ((255 & i) / 255) * n);
},
toHexString: ([t, e, n], i = 1) => th.toHexString(((t * (i = 255 / i)) << 16) ^ ((e * i) << 8) ^ ((n * i) << 0)),
},
nh = {
isPrimitive: !1,
match: (t) => Object(t) === t,
fromHexString(t, e, n = 1) {
const i = th.fromHexString(t);
(e.r = (((i >> 16) & 255) / 255) * n), (e.g = (((i >> 8) & 255) / 255) * n), (e.b = ((255 & i) / 255) * n);
},
toHexString: ({ r: t, g: e, b: n }, i = 1) => th.toHexString(((t * (i = 255 / i)) << 16) ^ ((e * i) << 8) ^ ((n * i) << 0)),
},
ih = [Kl, th, eh, nh];
class rh extends $l {
constructor(t, e, n, i) {
var r;
super(t, e, n, "color"),
(this.$input = document.createElement("input")),
this.$input.setAttribute("type", "color"),
this.$input.setAttribute("tabindex", -1),
this.$input.setAttribute("aria-labelledby", this.$name.id),
(this.$text = document.createElement("input")),
this.$text.setAttribute("type", "text"),
this.$text.setAttribute("spellcheck", "false"),
this.$text.setAttribute("aria-labelledby", this.$name.id),
(this.$display = document.createElement("div")),
this.$display.classList.add("display"),
this.$display.appendChild(this.$input),
this.$widget.appendChild(this.$display),
this.$widget.appendChild(this.$text),
(this._format = ((r = this.initialValue), ih.find((t) => t.match(r)))),
(this._rgbScale = i),
(this._initialValueHexString = this.save()),
(this._textFocused = !1),
this.$input.addEventListener("input", () => {
this._setValueFromHexString(this.$input.value);
}),
this.$input.addEventListener("blur", () => {
this._callOnFinishChange();
}),
this.$text.addEventListener("input", () => {
const t = Ql(this.$text.value);
t && this._setValueFromHexString(t);
}),
this.$text.addEventListener("focus", () => {
(this._textFocused = !0), this.$text.select();
}),
this.$text.addEventListener("blur", () => {
(this._textFocused = !1), this.updateDisplay(), this._callOnFinishChange();
}),
(this.$disable = this.$text),
this.updateDisplay();
}
reset() {
return this._setValueFromHexString(this._initialValueHexString), this;
}
_setValueFromHexString(t) {
if (this._format.isPrimitive) {
const e = this._format.fromHexString(t);
this.setValue(e);
} else this._format.fromHexString(t, this.getValue(), this._rgbScale), this._callOnChange(), this.updateDisplay();
}
save() {
return this._format.toHexString(this.getValue(), this._rgbScale);
}
load(t) {
return this._setValueFromHexString(t), this._callOnFinishChange(), this;
}
updateDisplay() {
return (this.$input.value = this._format.toHexString(this.getValue(), this._rgbScale)), this._textFocused || (this.$text.value = this.$input.value.substring(1)), (this.$display.style.backgroundColor = this.$input.value), this;
}
}
class sh extends $l {
constructor(t, e, n) {
super(t, e, n, "function"),
(this.$button = document.createElement("button")),
this.$button.appendChild(this.$name),
this.$widget.appendChild(this.$button),
this.$button.addEventListener("click", (t) => {
t.preventDefault(), this.getValue().call(this.object);
}),
this.$button.addEventListener("touchstart", () => {}, { passive: !0 }),
(this.$disable = this.$button);
}
}
class ah extends $l {
constructor(t, e, n, i, r, s) {
super(t, e, n, "number"), this._initInput(), this.min(i), this.max(r);
const a = void 0 !== s;
this.step(a ? s : this._getImplicitStep(), a), this.updateDisplay();
}
min(t) {
return (this._min = t), this._onUpdateMinMax(), this;
}
max(t) {
return (this._max = t), this._onUpdateMinMax(), this;
}
step(t, e = !0) {
return (this._step = t), (this._stepExplicit = e), this;
}
updateDisplay() {
const t = this.getValue();
if (this._hasSlider) {
let e = (t - this._min) / (this._max - this._min);
(e = Math.max(0, Math.min(e, 1))), (this.$fill.style.width = 100 * e + "%");
}
return this._inputFocused || (this.$input.value = t), this;
}
_initInput() {
(this.$input = document.createElement("input")), this.$input.setAttribute("type", "number"), this.$input.setAttribute("step", "any"), this.$input.setAttribute("aria-labelledby", this.$name.id), this.$widget.appendChild(this.$input), (this.$disable = this.$input);
const t = (t) => {
const e = parseFloat(this.$input.value);
isNaN(e) || (this._snapClampSetValue(e + t), (this.$input.value = this.getValue()));
};
let e,
n,
i,
r,
s,
a = !1;
const o = (t) => {
if (a) {
const i = t.clientX - e,
r = t.clientY - n;
Math.abs(r) > 5 ? (t.preventDefault(), this.$input.blur(), (a = !1), this._setDraggingStyle(!0, "vertical")) : Math.abs(i) > 5 && l();
}
if (!a) {
const e = t.clientY - i;
(s -= e * this._step * this._arrowKeyMultiplier(t)), r + s > this._max ? (s = this._max - r) : r + s < this._min && (s = this._min - r), this._snapClampSetValue(r + s);
}
i = t.clientY;
},
l = () => {
this._setDraggingStyle(!1, "vertical"), this._callOnFinishChange(), window.removeEventListener("mousemove", o), window.removeEventListener("mouseup", l);
};
this.$input.addEventListener("input", () => {
const t = parseFloat(this.$input.value);
isNaN(t) || this.setValue(this._clamp(t));
}),
this.$input.addEventListener("keydown", (e) => {
"Enter" === e.code && this.$input.blur(), "ArrowUp" === e.code && (e.preventDefault(), t(this._step * this._arrowKeyMultiplier(e))), "ArrowDown" === e.code && (e.preventDefault(), t(this._step * this._arrowKeyMultiplier(e) * -1));
}),
this.$input.addEventListener(
"wheel",
(e) => {
this._inputFocused && (e.preventDefault(), t(this._step * this._normalizeMouseWheel(e)));
},
{ passive: !1 }
),
this.$input.addEventListener("mousedown", (t) => {
(e = t.clientX), (n = i = t.clientY), (a = !0), (r = this.getValue()), (s = 0), window.addEventListener("mousemove", o), window.addEventListener("mouseup", l);
}),
this.$input.addEventListener("touchstart", (t) => {
(e = t.clientX), (n = i = t.clientY), (a = !0), (r = this.getValue()), (s = 0), window.addEventListener("touchstart", o), window.addEventListener("mouseup", l);
}),
this.$input.addEventListener("focus", () => {
this._inputFocused = !0;
}),
this.$input.addEventListener("blur", () => {
(this._inputFocused = !1), this.updateDisplay(), this._callOnFinishChange();
});
}
_initSlider() {
(this._hasSlider = !0), (this.$slider = document.createElement("div")), this.$slider.classList.add("slider"), (this.$fill = document.createElement("div")), this.$fill.classList.add("fill"), this.$slider.appendChild(this.$fill), this.$widget.insertBefore(this.$slider, this.$input), this.domElement.classList.add("hasSlider");
const t = (t) => {
const e = this.$slider.getBoundingClientRect();
let n = ((i = t), (r = e.left), (s = e.right), (a = this._min), (o = this._max), ((i - r) / (s - r)) * (o - a) + a);
var i, r, s, a, o;
this._snapClampSetValue(n);
},
e = (e) => {
t(e.clientX);
},
n = () => {
this._callOnFinishChange(), this._setDraggingStyle(!1), window.removeEventListener("mousemove", e), window.removeEventListener("mouseup", n);
};
let i,
r,
s = !1;
const a = (e) => {
e.preventDefault(), this._setDraggingStyle(!0), t(e.touches[0].clientX), (s = !1);
},
o = (e) => {
if (s) {
const t = e.touches[0].clientX - i,
n = e.touches[0].clientY - r;
Math.abs(t) > Math.abs(n) ? a(e) : (window.removeEventListener("touchmove", o), window.removeEventListener("touchend", l));
} else e.preventDefault(), t(e.touches[0].clientX);
},
l = () => {
this._callOnFinishChange(), this._setDraggingStyle(!1), window.removeEventListener("touchmove", o), window.removeEventListener("touchend", l);
},
h = this._callOnFinishChange.bind(this);
let c;
this.$slider.addEventListener("mousedown", (i) => {
this._setDraggingStyle(!0), t(i.clientX), window.addEventListener("mousemove", e), window.addEventListener("mouseup", n);
}),
this.$slider.addEventListener(
"touchstart",
(t) => {
t.touches.length > 1 || (this._hasScrollBar ? ((i = t.touches[0].clientX), (r = t.touches[0].clientY), (s = !0)) : a(t), window.addEventListener("touchmove", o), window.addEventListener("touchend", l));
},
{ passive: !1 }
),
this.$slider.addEventListener(
"wheel",
(t) => {
if (Math.abs(t.deltaX) < Math.abs(t.deltaY) && this._hasScrollBar) return;
t.preventDefault();
const e = this._normalizeMouseWheel(t) * this._step;
this._snapClampSetValue(this.getValue() + e), (this.$input.value = this.getValue()), clearTimeout(c), (c = setTimeout(h, 400));
},
{ passive: !1 }
);
}
_setDraggingStyle(t, e = "horizontal") {
this.$slider && this.$slider.classList.toggle("active", t), document.body.classList.toggle("lil-gui-dragging", t), document.body.classList.toggle(`lil-gui-${e}`, t);
}
_getImplicitStep() {
return this._hasMin && this._hasMax ? (this._max - this._min) / 1e3 : 0.1;
}
_onUpdateMinMax() {
!this._hasSlider && this._hasMin && this._hasMax && (this._stepExplicit || this.step(this._getImplicitStep(), !1), this._initSlider(), this.updateDisplay());
}
_normalizeMouseWheel(t) {
let { deltaX: e, deltaY: n } = t;
Math.floor(t.deltaY) !== t.deltaY && t.wheelDelta && ((e = 0), (n = -t.wheelDelta / 120), (n *= this._stepExplicit ? 1 : 10));
return e + -n;
}
_arrowKeyMultiplier(t) {
let e = this._stepExplicit ? 1 : 10;
return t.shiftKey ? (e *= 10) : t.altKey && (e /= 10), e;
}
_snap(t) {
const e = Math.round(t / this._step) * this._step;
return parseFloat(e.toPrecision(15));
}
_clamp(t) {
return t < this._min && (t = this._min), t > this._max && (t = this._max), t;
}
_snapClampSetValue(t) {
this.setValue(this._clamp(this._snap(t)));
}
get _hasScrollBar() {
const t = this.parent.root.$children;
return t.scrollHeight > t.clientHeight;
}
get _hasMin() {
return void 0 !== this._min;
}
get _hasMax() {
return void 0 !== this._max;
}
}
class oh extends $l {
constructor(t, e, n, i) {
super(t, e, n, "option"),
(this.$select = document.createElement("select")),
this.$select.setAttribute("aria-labelledby", this.$name.id),
(this.$display = document.createElement("div")),
this.$display.classList.add("display"),
(this._values = Array.isArray(i) ? i : Object.values(i)),
(this._names = Array.isArray(i) ? i : Object.keys(i)),
this._names.forEach((t) => {
const e = document.createElement("option");
(e.innerHTML = t), this.$select.appendChild(e);
}),
this.$select.addEventListener("change", () => {
this.setValue(this._values[this.$select.selectedIndex]), this._callOnFinishChange();
}),
this.$select.addEventListener("focus", () => {
this.$display.classList.add("focus");
}),
this.$select.addEventListener("blur", () => {
this.$display.classList.remove("focus");
}),
this.$widget.appendChild(this.$select),
this.$widget.appendChild(this.$display),
(this.$disable = this.$select),
this.updateDisplay();
}
updateDisplay() {
const t = this.getValue(),
e = this._values.indexOf(t);
return (this.$select.selectedIndex = e), (this.$display.innerHTML = -1 === e ? t : this._names[e]), this;
}
}
class lh extends $l {
constructor(t, e, n) {
super(t, e, n, "string"),
(this.$input = document.createElement("input")),
this.$input.setAttribute("type", "text"),
this.$input.setAttribute("aria-labelledby", this.$name.id),
this.$input.addEventListener("input", () => {
this.setValue(this.$input.value);
}),
this.$input.addEventListener("keydown", (t) => {
"Enter" === t.code && this.$input.blur();
}),
this.$input.addEventListener("blur", () => {
this._callOnFinishChange();
}),
this.$widget.appendChild(this.$input),
(this.$disable = this.$input),
this.updateDisplay();
}
updateDisplay() {
return (this.$input.value = this.getValue()), this;
}
}
let hh = !1;
class ch {
constructor({ parent: t, autoPlace: e = void 0 === t, container: n, width: i, title: r = "Controls", injectStyles: s = !0, touchStyles: a = !0 } = {}) {
if (
((this.parent = t),
(this.root = t ? t.root : this),
(this.children = []),
(this.controllers = []),
(this.folders = []),
(this._closed = !1),
(this._hidden = !1),
(this.domElement = document.createElement("div")),
this.domElement.classList.add("lil-gui"),
(this.$title = document.createElement("div")),
this.$title.classList.add("title"),
this.$title.setAttribute("role", "button"),
this.$title.setAttribute("aria-expanded", !0),
this.$title.setAttribute("tabindex", 0),
this.$title.addEventListener("click", () => this.openAnimated(this._closed)),
this.$title.addEventListener("keydown", (t) => {
("Enter" !== t.code && "Space" !== t.code) || (t.preventDefault(), this.$title.click());
}),
this.$title.addEventListener("touchstart", () => {}, { passive: !0 }),
(this.$children = document.createElement("div")),
this.$children.classList.add("children"),
this.domElement.appendChild(this.$title),
this.domElement.appendChild(this.$children),
this.title(r),
a && this.domElement.classList.add("allow-touch-styles"),
this.parent)
)
return this.parent.children.push(this), this.parent.folders.push(this), void this.parent.$children.appendChild(this.domElement);
this.domElement.classList.add("root"),
!hh &&
s &&
(!(function (t) {
const e = document.createElement("style");
e.innerHTML = t;
const n = document.querySelector("head link[rel=stylesheet], head style");
n ? document.head.insertBefore(e, n) : document.head.appendChild(e);
})(
'.lil-gui {\n font-family: var(--font-family);\n font-size: var(--font-size);\n line-height: 1;\n font-weight: normal;\n font-style: normal;\n text-align: left;\n background-color: var(--background-color);\n color: var(--text-color);\n user-select: none;\n -webkit-user-select: none;\n touch-action: manipulation;\n --background-color: #1f1f1f;\n --text-color: #ebebeb;\n --title-background-color: #111111;\n --title-text-color: #ebebeb;\n --widget-color: #424242;\n --hover-color: #4f4f4f;\n --focus-color: #595959;\n --number-color: #2cc9ff;\n --string-color: #a2db3c;\n --font-size: 11px;\n --input-font-size: 11px;\n --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;\n --font-family-mono: Menlo, Monaco, Consolas, "Droid Sans Mono", monospace;\n --padding: 4px;\n --spacing: 4px;\n --widget-height: 20px;\n --name-width: 45%;\n --slider-knob-width: 2px;\n --slider-input-width: 27%;\n --color-input-width: 27%;\n --slider-input-min-width: 45px;\n --color-input-min-width: 45px;\n --folder-indent: 7px;\n --widget-padding: 0 0 0 3px;\n --widget-border-radius: 2px;\n --checkbox-size: calc(0.75 * var(--widget-height));\n --scrollbar-width: 5px;\n}\n.lil-gui, .lil-gui * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n.lil-gui.root {\n width: var(--width, 245px);\n display: flex;\n flex-direction: column;\n}\n.lil-gui.root > .title {\n background: var(--title-background-color);\n color: var(--title-text-color);\n}\n.lil-gui.root > .children {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.lil-gui.root > .children::-webkit-scrollbar {\n width: var(--scrollbar-width);\n height: var(--scrollbar-width);\n background: var(--background-color);\n}\n.lil-gui.root > .children::-webkit-scrollbar-thumb {\n border-radius: var(--scrollbar-width);\n background: var(--focus-color);\n}\n@media (pointer: coarse) {\n .lil-gui.allow-touch-styles {\n --widget-height: 28px;\n --padding: 6px;\n --spacing: 6px;\n --font-size: 13px;\n --input-font-size: 16px;\n --folder-indent: 10px;\n --scrollbar-width: 7px;\n --slider-input-min-width: 50px;\n --color-input-min-width: 65px;\n }\n}\n.lil-gui.force-touch-styles {\n --widget-height: 28px;\n --padding: 6px;\n --spacing: 6px;\n --font-size: 13px;\n --input-font-size: 16px;\n --folder-indent: 10px;\n --scrollbar-width: 7px;\n --slider-input-min-width: 50px;\n --color-input-min-width: 65px;\n}\n.lil-gui.autoPlace {\n max-height: 100%;\n position: fixed;\n top: 0;\n right: 15px;\n z-index: 1001;\n}\n\n.lil-gui .controller {\n display: flex;\n align-items: center;\n padding: 0 var(--padding);\n margin: var(--spacing) 0;\n}\n.lil-gui .controller.disabled {\n opacity: 0.5;\n}\n.lil-gui .controller.disabled, .lil-gui .controller.disabled * {\n pointer-events: none !important;\n}\n.lil-gui .controller > .name {\n min-width: var(--name-width);\n flex-shrink: 0;\n white-space: pre;\n padding-right: var(--spacing);\n line-height: var(--widget-height);\n}\n.lil-gui .controller .widget {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n min-height: var(--widget-height);\n}\n.lil-gui .controller.string input {\n color: var(--string-color);\n}\n.lil-gui .controller.boolean .widget {\n cursor: pointer;\n}\n.lil-gui .controller.color .display {\n width: 100%;\n height: var(--widget-height);\n border-radius: var(--widget-border-radius);\n position: relative;\n}\n@media (hover: hover) {\n .lil-gui .controller.color .display:hover:before {\n content: " ";\n display: block;\n position: absolute;\n border-radius: var(--widget-border-radius);\n border: 1px solid #fff9;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n.lil-gui .controller.color input[type=color] {\n opacity: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.lil-gui .controller.color input[type=text] {\n margin-left: var(--spacing);\n font-family: var(--font-family-mono);\n min-width: var(--color-input-min-width);\n width: var(--color-input-width);\n flex-shrink: 0;\n}\n.lil-gui .controller.option select {\n opacity: 0;\n position: absolute;\n width: 100%;\n max-width: 100%;\n}\n.lil-gui .controller.option .display {\n position: relative;\n pointer-events: none;\n border-radius: var(--widget-border-radius);\n height: var(--widget-height);\n line-height: var(--widget-height);\n max-width: 100%;\n overflow: hidden;\n word-break: break-all;\n padding-left: 0.55em;\n padding-right: 1.75em;\n background: var(--widget-color);\n}\n@media (hover: hover) {\n .lil-gui .controller.option .display.focus {\n background: var(--focus-color);\n }\n}\n.lil-gui .controller.option .display.active {\n background: var(--focus-color);\n}\n.lil-gui .controller.option .display:after {\n font-family: "lil-gui";\n content: "↕";\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n padding-right: 0.375em;\n}\n.lil-gui .controller.option .widget,\n.lil-gui .controller.option select {\n cursor: pointer;\n}\n@media (hover: hover) {\n .lil-gui .controller.option .widget:hover .display {\n background: var(--hover-color);\n }\n}\n.lil-gui .controller.number input {\n color: var(--number-color);\n}\n.lil-gui .controller.number.hasSlider input {\n margin-left: var(--spacing);\n width: var(--slider-input-width);\n min-width: var(--slider-input-min-width);\n flex-shrink: 0;\n}\n.lil-gui .controller.number .slider {\n width: 100%;\n height: var(--widget-height);\n background-color: var(--widget-color);\n border-radius: var(--widget-border-radius);\n padding-right: var(--slider-knob-width);\n overflow: hidden;\n cursor: ew-resize;\n touch-action: pan-y;\n}\n@media (hover: hover) {\n .lil-gui .controller.number .slider:hover {\n background-color: var(--hover-color);\n }\n}\n.lil-gui .controller.number .slider.active {\n background-color: var(--focus-color);\n}\n.lil-gui .controller.number .slider.active .fill {\n opacity: 0.95;\n}\n.lil-gui .controller.number .fill {\n height: 100%;\n border-right: var(--slider-knob-width) solid var(--number-color);\n box-sizing: content-box;\n}\n\n.lil-gui-dragging .lil-gui {\n --hover-color: var(--widget-color);\n}\n.lil-gui-dragging * {\n cursor: ew-resize !important;\n}\n\n.lil-gui-dragging.lil-gui-vertical * {\n cursor: ns-resize !important;\n}\n\n.lil-gui .title {\n --title-height: calc(var(--widget-height) + var(--spacing) * 1.25);\n height: var(--title-height);\n line-height: calc(var(--title-height) - 4px);\n font-weight: 600;\n padding: 0 var(--padding);\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n outline: none;\n text-decoration-skip: objects;\n}\n.lil-gui .title:before {\n font-family: "lil-gui";\n content: "▾";\n padding-right: 2px;\n display: inline-block;\n}\n.lil-gui .title:active {\n background: var(--title-background-color);\n opacity: 0.75;\n}\n@media (hover: hover) {\n body:not(.lil-gui-dragging) .lil-gui .title:hover {\n background: var(--title-background-color);\n opacity: 0.85;\n }\n .lil-gui .title:focus {\n text-decoration: underline var(--focus-color);\n }\n}\n.lil-gui.root > .title:focus {\n text-decoration: none !important;\n}\n.lil-gui.closed > .title:before {\n content: "▸";\n}\n.lil-gui.closed > .children {\n transform: translateY(-7px);\n opacity: 0;\n}\n.lil-gui.closed:not(.transition) > .children {\n display: none;\n}\n.lil-gui.transition > .children {\n transition-duration: 300ms;\n transition-property: height, opacity, transform;\n transition-timing-function: cubic-bezier(0.2, 0.6, 0.35, 1);\n overflow: hidden;\n pointer-events: none;\n}\n.lil-gui .children:empty:before {\n content: "Empty";\n padding: 0 var(--padding);\n margin: var(--spacing) 0;\n display: block;\n height: var(--widget-height);\n font-style: italic;\n line-height: var(--widget-height);\n opacity: 0.5;\n}\n.lil-gui.root > .children > .lil-gui > .title {\n border: 0 solid var(--widget-color);\n border-width: 1px 0;\n transition: border-color 300ms;\n}\n.lil-gui.root > .children > .lil-gui.closed > .title {\n border-bottom-color: transparent;\n}\n.lil-gui + .controller {\n border-top: 1px solid var(--widget-color);\n margin-top: 0;\n padding-top: var(--spacing);\n}\n.lil-gui .lil-gui .lil-gui > .title {\n border: none;\n}\n.lil-gui .lil-gui .lil-gui > .children {\n border: none;\n margin-left: var(--folder-indent);\n border-left: 2px solid var(--widget-color);\n}\n.lil-gui .lil-gui .controller {\n border: none;\n}\n\n.lil-gui input {\n -webkit-tap-highlight-color: transparent;\n border: 0;\n outline: none;\n font-family: var(--font-family);\n font-size: var(--input-font-size);\n border-radius: var(--widget-border-radius);\n height: var(--widget-height);\n background: var(--widget-color);\n color: var(--text-color);\n width: 100%;\n}\n@media (hover: hover) {\n .lil-gui input:hover {\n background: var(--hover-color);\n }\n .lil-gui input:active {\n background: var(--focus-color);\n }\n}\n.lil-gui input:disabled {\n opacity: 1;\n}\n.lil-gui input[type=text],\n.lil-gui input[type=number] {\n padding: var(--widget-padding);\n}\n.lil-gui input[type=text]:focus,\n.lil-gui input[type=number]:focus {\n background: var(--focus-color);\n}\n.lil-gui input::-webkit-outer-spin-button,\n.lil-gui input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.lil-gui input[type=number] {\n -moz-appearance: textfield;\n}\n.lil-gui input[type=checkbox] {\n appearance: none;\n -webkit-appearance: none;\n height: var(--checkbox-size);\n width: var(--checkbox-size);\n border-radius: var(--widget-border-radius);\n text-align: center;\n cursor: pointer;\n}\n.lil-gui input[type=checkbox]:checked:before {\n font-family: "lil-gui";\n content: "✓";\n font-size: var(--checkbox-size);\n line-height: var(--checkbox-size);\n}\n@media (hover: hover) {\n .lil-gui input[type=checkbox]:focus {\n box-shadow: inset 0 0 0 1px var(--focus-color);\n }\n}\n.lil-gui button {\n -webkit-tap-highlight-color: transparent;\n outline: none;\n cursor: pointer;\n font-family: var(--font-family);\n font-size: var(--font-size);\n color: var(--text-color);\n width: 100%;\n height: var(--widget-height);\n text-transform: none;\n background: var(--widget-color);\n border-radius: var(--widget-border-radius);\n border: 1px solid var(--widget-color);\n text-align: center;\n line-height: calc(var(--widget-height) - 4px);\n}\n@media (hover: hover) {\n .lil-gui button:hover {\n background: var(--hover-color);\n border-color: var(--hover-color);\n }\n .lil-gui button:focus {\n border-color: var(--focus-color);\n }\n}\n.lil-gui button:active {\n background: var(--focus-color);\n}\n\n@font-face {\n font-family: "lil-gui";\n src: url("data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==") format("woff");\n}'
),
(hh = !0)),
n ? n.appendChild(this.domElement) : e && (this.domElement.classList.add("autoPlace"), document.body.appendChild(this.domElement)),
i && this.domElement.style.setProperty("--width", i + "px"),
this.domElement.addEventListener("keydown", (t) => t.stopPropagation()),
this.domElement.addEventListener("keyup", (t) => t.stopPropagation());
}
add(t, e, n, i, r) {
if (Object(n) === n) return new oh(this, t, e, n);
const s = t[e];
switch (typeof s) {
case "number":
return new ah(this, t, e, n, i, r);
case "boolean":
return new Zl(this, t, e);
case "string":
return new lh(this, t, e);
case "function":
return new sh(this, t, e);
}
console.error("gui.add failed\n\tproperty:", e, "\n\tobject:", t, "\n\tvalue:", s);
}
addColor(t, e, n = 1) {
return new rh(this, t, e, n);
}
addFolder(t) {
return new ch({ parent: this, title: t });
}
load(t, e = !0) {
return (
t.controllers &&
this.controllers.forEach((e) => {
e instanceof sh || (e._name in t.controllers && e.load(t.controllers[e._name]));
}),
e &&
t.folders &&
this.folders.forEach((e) => {
e._title in t.folders && e.load(t.folders[e._title]);
}),
this
);
}
save(t = !0) {
const e = { controllers: {}, folders: {} };
return (
this.controllers.forEach((t) => {
if (!(t instanceof sh)) {
if (t._name in e.controllers) throw new Error(`Cannot save GUI with duplicate property "${t._name}"`);
e.controllers[t._name] = t.save();
}
}),
t &&
this.folders.forEach((t) => {
if (t._title in e.folders) throw new Error(`Cannot save GUI with duplicate folder "${t._title}"`);
e.folders[t._title] = t.save();
}),
e
);
}
open(t = !0) {
return (this._closed = !t), this.$title.setAttribute("aria-expanded", !this._closed), this.domElement.classList.toggle("closed", this._closed), this;
}
close() {
return this.open(!1);
}
show(t = !0) {
return (this._hidden = !t), (this.domElement.style.display = this._hidden ? "none" : ""), this;
}
hide() {
return this.show(!1);
}
openAnimated(t = !0) {
return (
(this._closed = !t),
this.$title.setAttribute("aria-expanded", !this._closed),
requestAnimationFrame(() => {
const e = this.$children.clientHeight;
(this.$children.style.height = e + "px"), this.domElement.classList.add("transition");
const n = (t) => {
t.target === this.$children && ((this.$children.style.height = ""), this.domElement.classList.remove("transition"), this.$children.removeEventListener("transitionend", n));
};
this.$children.addEventListener("transitionend", n);
const i = t ? this.$children.scrollHeight : 0;
this.domElement.classList.toggle("closed", !t),
requestAnimationFrame(() => {
this.$children.style.height = i + "px";
});
}),
this
);
}
title(t) {
return (this._title = t), (this.$title.innerHTML = t), this;
}
reset(t = !0) {
return (t ? this.controllersRecursive() : this.controllers).forEach((t) => t.reset()), this;
}
onChange(t) {
return (this._onChange = t), this;
}
_callOnChange(t) {
this.parent && this.parent._callOnChange(t), void 0 !== this._onChange && this._onChange.call(this, { object: t.object, property: t.property, value: t.getValue(), controller: t });
}
onFinishChange(t) {
return (this._onFinishChange = t), this;
}
_callOnFinishChange(t) {
this.parent && this.parent._callOnFinishChange(t), void 0 !== this._onFinishChange && this._onFinishChange.call(this, { object: t.object, property: t.property, value: t.getValue(), controller: t });
}
destroy() {
this.parent && (this.parent.children.splice(this.parent.children.indexOf(this), 1), this.parent.folders.splice(this.parent.folders.indexOf(this), 1)), this.domElement.parentElement && this.domElement.parentElement.removeChild(this.domElement), Array.from(this.children).forEach((t) => t.destroy());
}
controllersRecursive() {
let t = Array.from(this.controllers);
return (
this.folders.forEach((e) => {
t = t.concat(e.controllersRecursive());
}),
t
);
}
foldersRecursive() {
let t = Array.from(this.folders);
return (
this.folders.forEach((e) => {
t = t.concat(e.foldersRecursive());
}),
t
);
}
}
var uh = ch;
new (class {
constructor(t) {
(this.scene = new Ts()), (this.container = t.dom), (this.img = this.container.querySelector("img")), (this.width = this.container.offsetWidth), (this.height = this.container.offsetHeight), (this.renderer = new Ms()), this.renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)), this.renderer.setSize(this.width, this.height), this.renderer.setClearColor(15658734, 1), (this.renderer.physicallyCorrectLights = !0), (this.renderer.outputEncoding = z), this.container.appendChild(this.renderer.domElement), (this.camera = new yn(70, window.innerWidth / window.innerHeight, 0.1, 100));
window.innerWidth, window.innerHeight;
(this.camera = new Gn(-0.5, 0.5, 0.5, -0.5, -1e3, 1e3)), this.camera.position.set(0, 0, 2), (this.time = 0), (this.mouse = { x: 0, y: 0, prevX: 0, prevY: 0, vX: 0, vY: 0 }), (this.isPlaying = !0), this.settings(), this.addObjects(), this.resize(), this.render(), this.setupResize(), this.mouseEvents();
}
getValue(t) {
return parseFloat(this.container.getAttribute("data-" + t));
}
mouseEvents() {
window.addEventListener("mousemove", (t) => {
(this.mouse.x = t.clientX / this.width), (this.mouse.y = t.clientY / this.height), (this.mouse.vX = this.mouse.x - this.mouse.prevX), (this.mouse.vY = this.mouse.y - this.mouse.prevY), (this.mouse.prevX = this.mouse.x), (this.mouse.prevY = this.mouse.y);
});
}
settings() {
(this.settings = { grid: this.getValue("grid") || 34, mouse: this.getValue("mouse") || 0.25, strength: this.getValue("strength") || 1, relaxation: this.getValue("relaxation") || 0.9 }),
(this.gui = new uh()),
this.gui.add(this.settings, "grid", 2, 1e3, 1).onFinishChange(() => {
this.regenerateGrid();
}),
this.gui.add(this.settings, "mouse", 0, 1, 0.01),
this.gui.add(this.settings, "strength", 0, 1, 0.01),
this.gui.add(this.settings, "relaxation", 0, 1, 0.01);
}
setupResize() {
window.addEventListener("resize", this.resize.bind(this));
}
resize() {
let t, e;
(this.width = this.container.offsetWidth), (this.height = this.container.offsetHeight), this.renderer.setSize(this.width, this.height), (this.camera.aspect = this.width / this.height), (this.imageAspect = 1 / 1.5), this.height / this.width > this.imageAspect ? ((t = (this.width / this.height) * this.imageAspect), (e = 1)) : ((t = 1), (e = this.height / this.width / this.imageAspect)), (this.material.uniforms.resolution.value.x = this.width), (this.material.uniforms.resolution.value.y = this.height), (this.material.uniforms.resolution.value.z = t), (this.material.uniforms.resolution.value.w = e), this.camera.updateProjectionMatrix(), this.regenerateGrid();
}
regenerateGrid() {
this.size = this.settings.grid;
const t = this.size,
e = this.size,
n = t * e,
i = new Float32Array(3 * n),
r = new Pe(16777215);
Math.floor(255 * r.r), Math.floor(255 * r.g), Math.floor(255 * r.b);
for (let t = 0; t < n; t++) {
let e = 255 * Math.random() - 125,
n = 255 * Math.random() - 125;
const r = 3 * t;
(i[r] = e), (i[r + 1] = n), (i[r + 2] = e);
}
(this.texture = new Ks(i, t, e, M, _)), (this.texture.magFilter = this.texture.minFilter = d), this.material && ((this.material.uniforms.uDataTexture.value = this.texture), (this.material.uniforms.uDataTexture.value.needsUpdate = !0));
}
addObjects() {
this.regenerateGrid();
let e = new it(this.img);
(e.needsUpdate = !0), (this.material = new vn({ extensions: { derivatives: "#extension GL_OES_standard_derivatives : enable" }, side: 2, uniforms: { time: { value: 0 }, resolution: { value: new st() }, uTexture: { value: e }, uDataTexture: { value: this.texture } }, vertexShader: t("#define GLSLIFY 1\nuniform float time;\nvarying vec2 vUv;\nvarying vec3 vPosition;\nuniform vec2 pixels;\nfloat PI = 3.141592653589793238;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"), fragmentShader: t("#define GLSLIFY 1\nuniform float time;\nuniform float progress;\nuniform sampler2D uDataTexture;\nuniform sampler2D uTexture;\n\nuniform vec4 resolution;\nvarying vec2 vUv;\nvarying vec3 vPosition;\nfloat PI = 3.141592653589793238;\nvoid main()\t{\n\tvec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\tvec4 color = texture2D(uTexture,newUV);\n\tvec4 offset = texture2D(uDataTexture,vUv);\n\tgl_FragColor = vec4(vUv,0.0,1.);\n\tgl_FragColor = vec4(offset.r,0.,0.,1.);\n\tgl_FragColor = color;\n\tgl_FragColor = texture2D(uTexture,newUV - 0.02*offset.rg);\n\t// gl_FragColor = offset;\n\n}") })), (this.geometry = new In(1, 1, 1, 1)), (this.plane = new un(this.geometry, this.material)), this.scene.add(this.plane);
}
updateDataTexture() {
let t = this.texture.image.data;
for (let e = 0; e < t.length; e += 3) (t[e] *= this.settings.relaxation), (t[e + 1] *= this.settings.relaxation);
let e = this.size * this.mouse.x,
n = this.size * (1 - this.mouse.y),
i = this.size * this.settings.mouse,
r = this.height / this.width;
for (let l = 0; l < this.size; l++)
for (let h = 0; h < this.size; h++) {
let c = (e - l) ** 2 / r + (n - h) ** 2;
if (c < i ** 2) {
let e = 3 * (l + this.size * h),
n = i / Math.sqrt(c);
(s = n), (a = 0), (o = 10), (n = Math.max(a, Math.min(s, o))), (t[e] += 100 * this.settings.strength * this.mouse.vX * n), (t[e + 1] -= 100 * this.settings.strength * this.mouse.vY * n);
}
}
var s, a, o;
(this.mouse.vX *= 0.9), (this.mouse.vY *= 0.9), (this.texture.needsUpdate = !0);
}
render() {
this.isPlaying && ((this.time += 0.05), this.updateDataTexture(), (this.material.uniforms.time.value = this.time), requestAnimationFrame(this.render.bind(this)), this.renderer.render(this.scene, this.camera));
}
})({ dom: document.getElementById("canvasContainer") });
//# sourceMappingURL=index.8046886f.js.map
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment