Skip to content

Instantly share code, notes, and snippets.

@mateitudor
Created February 25, 2023 18:20
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/40e0a07c3893806386bf4fd3b3366862 to your computer and use it in GitHub Desktop.
Save mateitudor/40e0a07c3893806386bf4fd3b3366862 to your computer and use it in GitHub Desktop.
Temporary
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", .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 = .01,
a = .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 = .707106781, r = .707106781) : (n = Math.sqrt(t), i = x / n, r = y / n) : o > v ? o < s ? (n = .707106781, i = 0, r = .707106781) : (i = Math.sqrt(o), n = x / i, r = _ / i) : v < s ? (n = .707106781, i = .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) < .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 = .5 / Math.sqrt(u + 1);
this._w = .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 = .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 = .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 = .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() - .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(.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(.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 = .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 = .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(.5), Nt.copy(e).sub(t).normalize(), zt.copy(this.origin).sub(It);
const r = .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) < .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) < .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) < .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) < .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) < .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) < .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), .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 < .5 ? e : n < 2 / 3 ? t + 6 * (e - t) * (2 / 3 - n) : t
}
function Ce(t) {
return t < .04045 ? .0773993808 * t : Math.pow(.9478672986 * t + .0521327014, 2.4)
}
function Re(t) {
return t < .0031308 ? 12.92 * t : 1.055 * Math.pow(t, .41666) - .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 <= .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 <= .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 = .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 = .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 = .5 * this.getFilmHeight() / t;
this.fov = 2 * G * Math.atan(e), this.updateProjectionMatrix()
}
getFocalLength() {
const t = Math.tan(.5 * k * this.fov);
return .5 * this.getFilmHeight() / t
}
getEffectiveFOV() {
return 2 * G * Math.atan(Math.tan(.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(.5 * k * this.fov) / this.zoom,
n = 2 * e,
i = this.aspect * n,
r = -.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 = .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: .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 $(.5, .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 = .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 = [.125, .215, .35, .446, .526, .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 = .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(.5 * e.width, 0, 0), t.halfHeight.set(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(.5 * d.width, 0, 0), t.halfHeight.set(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, .5, 3, -1, .5, -1, 3, .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 = .02,
h = .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 = .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([-.5, -.5, 0, 0, 0, .5, -.5, 0, 1, 0, .5, .5, 0, 1, 1, -.5, .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 $(.5, .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(-.5, -.5, 0), Ns, s, Is, i, r), js(Us.set(.5, -.5, 0), Ns, s, Is, i, r), js(Hs.set(.5, .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(-.5, .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(.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 = .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 ? .5 : .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 = .5 * (i - e),
a = .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 .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 $(.5, .5), new $(-.5, .5), new $(-.5, -.5), new $(.5, -.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 : .2,
u = void 0 !== e.bevelSize ? e.bevelSize : c - .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, .5), new $(-.5, -.5), new $(.5, -.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 = .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 + .4 * t) / (1 - .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 = .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 = .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 = .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 + (-.5 + u) * p + 1,
x = (-1 - d) * f + (1.5 + d) * m + .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(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .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, .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, .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, .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(.282095), e.addScaledVector(s[1], .488603 * i), e.addScaledVector(s[2], .488603 * r), e.addScaledVector(s[3], .488603 * n), e.addScaledVector(s[4], n * i * 1.092548), e.addScaledVector(s[5], i * r * 1.092548), e.addScaledVector(s[6], .315392 * (3 * r * r - 1)), e.addScaledVector(s[7], n * r * 1.092548), e.addScaledVector(s[8], .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(.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], .858086 * n * i), e.addScaledVector(s[5], .858086 * i * r), e.addScaledVector(s[6], .743125 * r * r - .247708), e.addScaledVector(s[7], .858086 * n * r), e.addScaledVector(s[8], .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] = .282095, e[1] = .488603 * i, e[2] = .488603 * r, e[3] = .488603 * n, e[4] = 1.092548 * n * i, e[5] = 1.092548 * i * r, e[6] = .315392 * (3 * r * r - 1), e[7] = 1.092548 * n * r, e[8] = .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(.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, .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, .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, .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 >= .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(.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(.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("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 : .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, .1, 100);
window.innerWidth, window.innerHeight;
this.camera = new Gn(-.5, .5, .5, -.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") || .25,
strength: this.getValue("strength") || 1,
relaxation: this.getValue("relaxation") || .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, .01), this.gui.add(this.settings, "strength", 0, 1, .01), this.gui.add(this.settings, "relaxation", 0, 1, .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 *= .9, this.mouse.vY *= .9, this.texture.needsUpdate = !0
}
render() {
this.isPlaying && (this.time += .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")
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment