Files
animated_wallpaper/background-final.html
T
Richard Zink 4145fbdd58 Fix night sky too bright after sunset
Three fixes:
1. getColor() switched from 'sunPos.altitude > 0' to
   '> sunPalettes[0].alt' (-pi/2). The day palette interpolates
   through twilight to deep-below-horizon, so an hour after sunset
   (sunAlt ~ -15deg) we now stay on the day palette and get the
   intended dark 'panel' colour instead of switching to the moon
   palette immediately.
2. getNightColor() now actually applies MIN_NIGHT_BRIGHTNESS via
   shiftColor toward black (the old 'brightness' var was unused
   dead code).
3. applyWeatherTheme() cuts the weather tint by up to 70% at
   night, so a 'cloudy' theme no longer washes the night sky with
   the brighter weather sky colour.
2026-10-07 19:21:24 +02:00

2831 lines
1.0 MiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Background Vanta Clouds2</title>
<script>
/* Application configuration
*
* debug - Show debug panel (0/1)
*
* theme - Color palette. Pick one of the keys defined in window.THEMES
* below. To add a new theme, drop a new *.css file in the same
* directory and add an entry to window.THEMES.
*
* renderer - Background renderer: 'vanta' (default, GPU 3D volumetric
* clouds, heavy) or 'clouds2d' (lightweight 2D WebGL shader,
* very low GPU usage, similar visual style).
*
* units - Measurement units for the weather widget.
* 'metric' (°C, km/h) or 'imperial' (°F, mph)
*
* language - UI language code. Add a new language by extending
* window.TRANSLATIONS in i18n.js. English ('en') is the base;
* if a key is missing in the current language, English is used.
*
* location - Geographic coordinates for sun/moon calculations. Used
* by the SunCalc library (SunCalc.getTimes, getMoonTimes,
* getPosition). Object with 'lat' (latitude, -90 to +90)
* and 'lon' (longitude, -180 to +180). Positive lat = north,
* positive lon = east. Optionally add 'label' (string) to
* set a custom place name (skips reverse-geocoding).
*
* timeFormat - Format string for the digital clock, using strict
* ISO 8601 tokens (case-sensitive). Any other character is
* treated as a literal (including whitespace).
*
* YYYY 4-digit year (2026)
* MM month 01-12 (10) - always month
* DD day 01-31 (07)
* HH hour 00-23 (24h) (14)
* mm minute 00-59 (35) - lowercase!
* ss second 00-59 (22) - lowercase!
* sss millisecond 000-999 (456)
* a am/pm (lowercase) (pm)
* A AM/PM (uppercase) (PM)
* aaaa am/pm lowercase (pm) - long form
* AAAA AM/PM uppercase (PM) - long form
* T literal 'T'
*
* Non-standard extension tokens (localized via i18n):
* MMM month short name (Oct, Okt, Ott, ...)
* MMMM month full name (October, Oktober, ...)
* DDD weekday short name (Mon, Mo, Lu, ...)
* DDDD weekday full name (Monday, Montag, ...)
*
* Date-only forms: YYYY, YYYY-MM, YYYY-MM-DD
* Date-time forms: above + T + HH:mm, HH:mm:ss, HH:mm:ss.sss
* Any other character is a literal (incl. spaces, tabs, \n).
*
* Escape sequences (parsed in literal section):
* \n newline
* \t tab
* \\ literal backslash
*
* Note: MM is ALWAYS month (ISO). For minutes use mm (lowercase).
*
* Examples:
* 'HH:mm:ss' -> 14:35:22
* 'hh:mm:ss a' -> 02:35:22 PM
* 'YYYY-MM-DD' -> 2026-10-07
* 'YYYY-MM-DDTHH:mm:ss' -> 2026-10-07T14:35:22
* 'YYYY-MM-DDTHH:mm:ss.sss' -> 2026-10-07T14:35:22.456
* 'HH:mm:ss DDD' -> 14:35:22 Mon
* 'HH:mm:ss DDDD' -> 14:35:22 Monday
* 'HH:mm:ss MMM' -> 14:35:22 Oct
* 'HH:mm:ss MMMM' -> 14:35:22 October
* 'YYYY-MM-DD\tHH:mm:ss.sss a\n DDD MMM'
* -> 2026-10-07 14:35:22.456 PM
* Mon Oct
*/
window.CONFIG = {
debug: 0,
theme: 'ash',
units: 'metric',
renderer: 'clouds3d', // 'vanta', 'clouds2d', or 'clouds3d'
language: 'de',
timeFormat: 'DD. MMMM, YYYY ‒ HH:mm:SS',
location: {
// Latitude and longitude for sun/moon calculations
// Default: Passau, Germany
lat: 48.5667,
lon: 13.4319
}
};
// List of available themes. The key is the theme id (used in config.theme),
// the value is the CSS file name. Add a new theme by adding a new entry here
// and dropping the corresponding CSS file in the same directory.
window.THEMES = {
'ash': 'ash.css',
'gruvbox': 'gruvbox.css',
'nord': 'nord.css'
};
</script>
<script>
/* Internationalization dictionary
*
* Each key is the ENGLISH text. To add a new language, just add
* a translation under the language's two-letter code (e.g. de, it, es).
*
* Example:
* TRANSLATIONS['Sunrise'] = { en: 'Sunrise', de: 'Aufgang', it: 'Alba' };
*
* The current language is taken from window.CONFIG.language.
* Fallback order: requested language → 'en' → first available → key.
*/
window.TRANSLATIONS = {
'Sunrise': { en: 'Sunrise', de: 'Aufgang', it: 'Alba', es: 'Amanecer', fr: 'Lever du soleil', ru: 'Восход' },
'Sunset': { en: 'Sunset', de: 'Untergang', it: 'Tramonto', es: 'Atardecer', fr: 'Coucher du soleil', ru: 'Закат' },
'Sun Zenith': { en: 'Sun Zenith', de: 'Zenit Sonne', it: 'Zenit del sole', es: 'Cenit del sol', fr: 'Zénith du soleil', ru: 'Зенит солнца' },
'Moon Phase': { en: 'Moon Phase', de: 'Mondphase', it: 'Fase lunare', es: 'Fase lunar', fr: 'Phase lunaire', ru: 'Фаза луны' },
'Moonrise': { en: 'Moonrise', de: 'Mond auf', it: 'Sorgere della luna', es: 'Salida de la luna', fr: 'Lever de lune', ru: 'Восход луны' },
'Moonset': { en: 'Moonset', de: 'Mond unter', it: 'Tramonto della luna', es: 'Puesta de la luna', fr: 'Coucher de lune', ru: 'Закат луны' },
'today': { en: 'today', de: 'heute', it: 'oggi', es: 'hoy', fr: 'aujourd\'hui', ru: 'сегодня' },
'tomorrow': { en: 'tomorrow', de: 'morgen', it: 'domani', es: 'mañana', fr: 'demain', ru: 'завтра' },
'New Moon': { en: 'New Moon', de: 'Neumond', it: 'Luna nuova', es: 'Luna nueva', fr: 'Nouvelle lune', ru: 'Новолуние' },
'Waxing Crescent': { en: 'Waxing Crescent', de: 'Zunehm. Sichel', it: 'Falce crescente', es: 'Creciente', fr: 'Premier croissant', ru: 'Растущий серп' },
'First Quarter': { en: 'First Quarter', de: 'Erstes Viertel', it: 'Primo quarto', es: 'Cuarto creciente', fr: 'Premier quartier', ru: 'Первая четверть' },
'Waxing Gibbous': { en: 'Waxing Gibbous', de: 'Zunehm. Gibbous', it: 'Gibbosa crescente', es: 'Gibosa creciente', fr: 'Gibbeuse croissante', ru: 'Растущая луна' },
'Full Moon': { en: 'Full Moon', de: 'Vollmond', it: 'Luna piena', es: 'Luna llena', fr: 'Pleine lune', ru: 'Полнолуние' },
'Waning Gibbous': { en: 'Waning Gibbous', de: 'Abnehm. Gibbous', it: 'Gibbosa calante', es: 'Gibosa menguante', fr: 'Gibbeuse décroissante', ru: 'Убывающая луна' },
'Last Quarter': { en: 'Last Quarter', de: 'Letztes Viertel', it: 'Ultimo quarto', es: 'Cuarto menguante', fr: 'Dernier quartier', ru: 'Последняя четверть' },
'Waning Crescent': { en: 'Waning Crescent', de: 'Abnehm. Sichel', it: 'Falce calante', es: 'Menguante', fr: 'Dernier croissant', ru: 'Убывающий серп' },
// 2-letter weekday short forms
'Sun': { en: 'Sun', de: 'So', it: 'Do', es: 'Do', fr: 'Di', ru: 'Вс' },
'Mon': { en: 'Mon', de: 'Mo', it: 'Lu', es: 'Lu', fr: 'Lu', ru: 'Пн' },
'Tue': { en: 'Tue', de: 'Di', it: 'Ma', es: 'Ma', fr: 'Ma', ru: 'Вт' },
'Wed': { en: 'Wed', de: 'Mi', it: 'Me', es: 'Mi', fr: 'Me', ru: 'Ср' },
'Thu': { en: 'Thu', de: 'Do', it: 'Gi', es: 'Ju', fr: 'Je', ru: 'Чт' },
'Fri': { en: 'Fri', de: 'Fr', it: 'Ve', es: 'Vi', fr: 'Ve', ru: 'Пт' },
'Sat': { en: 'Sat', de: 'Sa', it: 'Sa', es: 'Sá', fr: 'Sa', ru: 'Сб' },
// Full weekday names
'Sunday': { en: 'Sunday', de: 'Sonntag', it: 'Domenica', es: 'Domingo', fr: 'Dimanche', ru: 'Воскресенье' },
'Monday': { en: 'Monday', de: 'Montag', it: 'Lunedì', es: 'Lunes', fr: 'Lundi', ru: 'Понедельник' },
'Tuesday': { en: 'Tuesday', de: 'Dienstag', it: 'Martedì', es: 'Martes', fr: 'Mardi', ru: 'Вторник' },
'Wednesday': { en: 'Wednesday', de: 'Mittwoch', it: 'Mercoledì', es: 'Miércoles', fr: 'Mercredi', ru: 'Среда' },
'Thursday': { en: 'Thursday', de: 'Donnerstag', it: 'Giovedì', es: 'Jueves', fr: 'Jeudi', ru: 'Четверг' },
'Friday': { en: 'Friday', de: 'Freitag', it: 'Venerdì', es: 'Viernes', fr: 'Vendredi', ru: 'Пятница' },
'Saturday': { en: 'Saturday', de: 'Samstag', it: 'Sabato', es: 'Sábado', fr: 'Samedi', ru: 'Суббота' },
// Full month names
'January': { en: 'January', de: 'Januar', it: 'Gennaio', es: 'Enero', fr: 'Janvier', ru: 'Январь' },
'February': { en: 'February', de: 'Februar', it: 'Febbraio', es: 'Febrero', fr: 'Février', ru: 'Февраль' },
'March': { en: 'March', de: 'März', it: 'Marzo', es: 'Marzo', fr: 'Mars', ru: 'Март' },
'April': { en: 'April', de: 'April', it: 'Aprile', es: 'Abril', fr: 'Avril', ru: 'Апрель' },
'May': { en: 'May', de: 'Mai', it: 'Maggio', es: 'Mayo', fr: 'Mai', ru: 'Май' },
'June': { en: 'June', de: 'Juni', it: 'Giugno', es: 'Junio', fr: 'Juin', ru: 'Июнь' },
'July': { en: 'July', de: 'Juli', it: 'Luglio', es: 'Julio', fr: 'Juillet', ru: 'Июль' },
'August': { en: 'August', de: 'August', it: 'Agosto', es: 'Agosto', fr: 'Août', ru: 'Август' },
// 3-letter month short forms (for MMM token)
'Jan': { en: 'Jan', de: 'Jan', it: 'Gen', es: 'Ene', fr: 'Jan', ru: 'Янв' },
'Feb': { en: 'Feb', de: 'Feb', it: 'Feb', es: 'Feb', fr: 'Fév', ru: 'Фев' },
'Mar': { en: 'Mar', de: 'Mär', it: 'Mar', es: 'Mar', fr: 'Mar', ru: 'Мар' },
'Apr': { en: 'Apr', de: 'Apr', it: 'Apr', es: 'Abr', fr: 'Avr', ru: 'Апр' },
'May': { en: 'May', de: 'Mai', it: 'Mag', es: 'May', fr: 'Mai', ru: 'Май' },
'Jun': { en: 'Jun', de: 'Jun', it: 'Giu', es: 'Jun', fr: 'Jui', ru: 'Июн' },
'Jul': { en: 'Jul', de: 'Jul', it: 'Lug', es: 'Jul', fr: 'Jul', ru: 'Июл' },
'Aug': { en: 'Aug', de: 'Aug', it: 'Ago', es: 'Ago', fr: 'Aoû', ru: 'Авг' },
'September': { en: 'September', de: 'September', it: 'Settembre', es: 'Septiembre', fr: 'Septembre', ru: 'Сентябрь' },
'Oct': { en: 'Oct', de: 'Okt', it: 'Ott', es: 'Oct', fr: 'Oct', ru: 'Окт' },
'Nov': { en: 'Nov', de: 'Nov', it: 'Nov', es: 'Nov', fr: 'Nov', ru: 'Ноя' },
'Dec': { en: 'Dec', de: 'Dez', it: 'Dic', es: 'Dic', fr: 'Déc', ru: 'Дек' },
'October': { en: 'October', de: 'Oktober', it: 'Ottobre', es: 'Octubre', fr: 'Octobre', ru: 'Октябрь' },
'November': { en: 'November', de: 'November', it: 'Novembre', es: 'Noviembre', fr: 'Novembre', ru: 'Ноябрь' },
'December': { en: 'December', de: 'Dezember', it: 'Dicembre', es: 'Diciembre', fr: 'Décembre', ru: 'Декабрь' },
'Humidity': { en: 'Humidity', de: 'Feuchte', it: 'Umidità', es: 'Humedad', fr: 'Humidité', ru: 'Влажность' },
'Wind': { en: 'Wind', de: 'Wind', it: 'Vento', es: 'Viento', fr: 'Vent', ru: 'Ветер' },
// 2-letter time-of-day labels
'Morning': { en: 'Mo', de: 'Mo', it: 'Ma', es: 'Ma', fr: 'Ma', ru: 'Ут' },
'Noon': { en: 'No', de: 'Mi', it: 'Me', es: 'Me', fr: 'Me', ru: 'По' },
'Evening': { en: 'Ev', de: 'Ab', it: 'Se', es: 'Ta', fr: 'So', ru: 'Ве' },
'Night': { en: 'Ni', de: 'Na', it: 'No', es: 'No', fr: 'Nu', ru: 'Но' }
};
window.getTranslation = function(key) {
var lang = (window.CONFIG && window.CONFIG.language) || 'en';
var entry = window.TRANSLATIONS[key];
if (!entry) return key;
// Fallback chain: requested language → 'en' → first available → key
if (entry[lang]) return entry[lang];
if (entry.en) return entry.en;
for (var k in entry) {
if (entry.hasOwnProperty(k) && entry[k]) return entry[k];
}
return key;
};
window.t = window.getTranslation;
</script>
<script>
(function() {
var theme = (window.CONFIG && window.CONFIG.theme) || 'ash';
var cssFile = window.THEMES && window.THEMES[theme];
var css = document.getElementById('theme-css');
if (css) css.href = cssFile || (window.THEMES && window.THEMES.ash) || 'ash.css';
})();
</script>
<link id="theme-css" rel="stylesheet" href="ash.css">
<script>
/*
(c) 2011-2015, Vladimir Agafonkin
SunCalc is a JavaScript library for calculating sun/moon position and light phases.
https://github.com/mourner/suncalc
*/
(function () { 'use strict';
// shortcuts for easier to read formulas
var PI = Math.PI,
sin = Math.sin,
cos = Math.cos,
tan = Math.tan,
asin = Math.asin,
atan = Math.atan2,
acos = Math.acos,
rad = PI / 180;
// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
// date/time constants and conversions
var dayMs = 1000 * 60 * 60 * 24,
J1970 = 2440588,
J2000 = 2451545;
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }
function toDays(date) { return toJulian(date) - J2000; }
// general calculations for position
var e = rad * 23.4397; // obliquity of the Earth
function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
function astroRefraction(h) {
if (h < 0) // the following formula works for positive altitudes only.
h = 0; // if h = -0.08901179 a div/0 would occur.
// formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
// 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
}
// general sun calculations
function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
function eclipticLongitude(M) {
var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
P = rad * 102.9372; // perihelion of the Earth
return M + C + P + PI;
}
function sunCoords(d) {
var M = solarMeanAnomaly(d),
L = eclipticLongitude(M);
return {
dec: declination(L, 0),
ra: rightAscension(L, 0)
};
}
var SunCalc = {};
// calculates sun position for a given date and latitude/longitude
SunCalc.getPosition = function (date, lat, lng) {
var lw = rad * -lng,
phi = rad * lat,
d = toDays(date),
c = sunCoords(d),
H = siderealTime(d, lw) - c.ra;
return {
azimuth: azimuth(H, phi, c.dec),
altitude: altitude(H, phi, c.dec)
};
};
// sun times configuration (angle, morning name, evening name)
var times = SunCalc.times = [
[-0.833, 'sunrise', 'sunset' ],
[ -0.3, 'sunriseEnd', 'sunsetStart' ],
[ -6, 'dawn', 'dusk' ],
[ -12, 'nauticalDawn', 'nauticalDusk'],
[ -18, 'nightEnd', 'night' ],
[ 6, 'goldenHourEnd', 'goldenHour' ]
];
// adds a custom time to the times config
SunCalc.addTime = function (angle, riseName, setName) {
times.push([angle, riseName, setName]);
};
// calculations for sun times
var J0 = 0.0009;
function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }
function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }
function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }
function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }
// returns set time for the given sun altitude
function getSetJ(h, lw, phi, dec, n, M, L) {
var w = hourAngle(h, phi, dec),
a = approxTransit(w, lw, n);
return solarTransitJ(a, M, L);
}
// calculates sun times for a given date, latitude/longitude, and, optionally,
// the observer height (in meters) relative to the horizon
SunCalc.getTimes = function (date, lat, lng, height) {
height = height || 0;
var lw = rad * -lng,
phi = rad * lat,
dh = observerAngle(height),
d = toDays(date),
n = julianCycle(d, lw),
ds = approxTransit(0, lw, n),
M = solarMeanAnomaly(ds),
L = eclipticLongitude(M),
dec = declination(L, 0),
Jnoon = solarTransitJ(ds, M, L),
i, len, time, h0, Jset, Jrise;
var result = {
solarNoon: fromJulian(Jnoon),
nadir: fromJulian(Jnoon - 0.5)
};
for (i = 0, len = times.length; i < len; i += 1) {
time = times[i];
h0 = (time[0] + dh) * rad;
Jset = getSetJ(h0, lw, phi, dec, n, M, L);
Jrise = Jnoon - (Jset - Jnoon);
result[time[1]] = fromJulian(Jrise);
result[time[2]] = fromJulian(Jset);
}
return result;
};
// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
function moonCoords(d) { // geocentric ecliptic coordinates of the moon
var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
M = rad * (134.963 + 13.064993 * d), // mean anomaly
F = rad * (93.272 + 13.229350 * d), // mean distance
l = L + rad * 6.289 * sin(M), // longitude
b = rad * 5.128 * sin(F), // latitude
dt = 385001 - 20905 * cos(M); // distance to the moon in km
return {
ra: rightAscension(l, b),
dec: declination(l, b),
dist: dt
};
}
SunCalc.getMoonPosition = function (date, lat, lng) {
var lw = rad * -lng,
phi = rad * lat,
d = toDays(date),
c = moonCoords(d),
H = siderealTime(d, lw) - c.ra,
h = altitude(H, phi, c.dec),
// formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
h = h + astroRefraction(h); // altitude correction for refraction
return {
azimuth: azimuth(H, phi, c.dec),
altitude: h,
distance: c.dist,
parallacticAngle: pa
};
};
// calculations for illumination parameters of the moon,
// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
SunCalc.getMoonIllumination = function (date) {
var d = toDays(date || new Date()),
s = sunCoords(d),
m = moonCoords(d),
sdist = 149598000, // distance from Earth to Sun in km
phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)),
inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)),
angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) -
cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra));
return {
fraction: (1 + cos(inc)) / 2,
phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI,
angle: angle
};
};
function hoursLater(date, h) {
return new Date(date.valueOf() + h * dayMs / 24);
}
// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
var t = new Date(date);
if (inUTC) t.setUTCHours(0, 0, 0, 0);
else t.setHours(0, 0, 0, 0);
var hc = 0.133 * rad,
h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
// go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
for (var i = 1; i <= 24; i += 2) {
h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
a = (h0 + h2) / 2 - h1;
b = (h2 - h0) / 2;
xe = -b / (2 * a);
ye = (a * xe + b) * xe + h1;
d = b * b - 4 * a * h1;
roots = 0;
if (d >= 0) {
dx = Math.sqrt(d) / (Math.abs(a) * 2);
x1 = xe - dx;
x2 = xe + dx;
if (Math.abs(x1) <= 1) roots++;
if (Math.abs(x2) <= 1) roots++;
if (x1 < -1) x1 = x2;
}
if (roots === 1) {
if (h0 < 0) rise = i + x1;
else set = i + x1;
} else if (roots === 2) {
rise = i + (ye < 0 ? x2 : x1);
set = i + (ye < 0 ? x1 : x2);
}
if (rise && set) break;
h0 = h2;
}
var result = {};
if (rise) result.rise = hoursLater(t, rise);
if (set) result.set = hoursLater(t, set);
if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
return result;
};
// export as Node module / AMD module / browser variable
if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;
else if (typeof define === 'function' && define.amd) define(SunCalc);
else window.SunCalc = SunCalc;
}());
</script>
<style>
html, body { margin: 0; padding: 0; overflow: hidden; width: 100%; height: 100%; font-family: monospace; }
#vanta { width: 100vw; height: 100vh; position: fixed; top: 0; left: 0; }
#debug-panel {
position: fixed;
bottom: 2vh;
left: 2vh;
width: 20vw;
min-width: 200px;
max-width: 320px;
background: rgba(28, 27, 31, 0.85);
border: 1px solid rgba(230, 223, 209, 0.3);
border-radius: 0.6vh;
padding: 1vh 1vw;
color: var(--bone);
font-family: monospace;
font-size: clamp(9px, 1.2vh, 14px);
line-height: 1.4;
z-index: 9999;
max-height: 90vh;
overflow-y: auto;
}
.debug-title {
font-size: 1.2em;
font-weight: bold;
color: var(--orange);
padding-bottom: 4px;
margin-bottom: 6px;
cursor: pointer;
user-select: none;
display: flex;
justify-content: space-between;
align-items: center;
}
.debug-title.expanded {
border-bottom: 1px solid rgba(230, 223, 209, 0.3);
margin-bottom: 6px;
}
.debug-title-toggle {
font-size: 0.8em;
color: var(--icon);
margin-left: 8px;
}
.debug-content.collapsed {
display: none;
}
.debug-controls {
display: flex;
gap: 5px;
margin-bottom: 8px;
}
.debug-select {
background: var(--dark);
color: var(--bone);
border: 1px solid var(--border);
border-radius: 2px;
padding: 2px 4px;
font-family: monospace;
font-size: 0.9em;
}
.debug-section {
font-size: 1em;
color: var(--icon);
margin-top: 6px;
margin-bottom: 2px;
}
.debug-row {
display: flex;
align-items: center;
gap: 6px;
padding: 1px 0;
}
.debug-label {
color: var(--icon);
min-width: 80px;
}
.libel {
color: var(--icon);
min-width: 50px;
}
.hex {
color: var(--bone);
font-size: 0.9em;
font-family: monospace;
}
.swatch {
width: 1.4em;
height: 1.4em;
border: 1px solid var(--stone);
border-radius: 2px;
}
.theme-table {
font-size: 0.9em;
margin-top: 4px;
}
.theme-table-row {
display: grid;
grid-template-columns: 5em 2.4em 2.4em 2.4em 2.4em 2.8em;
gap: 5px;
align-items: center;
padding: 1px 0;
}
.palette-table-row {
display: grid;
grid-template-columns: 7em 1.6em auto;
gap: 5px;
align-items: center;
padding: 1px 0;
}
.palette-table-row .theme-table-name {
text-align: right;
padding-right: 4px;
}
.palette-table-row .theme-table-speed {
text-align: left;
}
.theme-table-header {
color: var(--icon);
font-weight: bold;
border-bottom: 1px solid var(--border);
padding-bottom: 2px;
}
.theme-table-name {
color: var(--bone);
}
.theme-table-mini-swatch {
width: 1.3em;
height: 1.3em;
border: 1px solid var(--border);
border-radius: 1px;
}
.theme-table-speed {
color: var(--icon);
font-size: 0.85em;
}
@media (orientation: portrait) and (max-width: 700px) {
#debug-panel {
display: none;
}
}
#debug-panel.disabled {
display: none !important;
}
#info-panel {
position: fixed;
top: 2vh;
right: 2vh;
bottom: 2vh;
color: var(--bone);
background: rgba(28, 27, 31, 0.7);
padding: 1vh 1vw;
border-radius: 0.6vh;
z-index: 9999;
font-size: clamp(10px, 1.2vh, 14px);
line-height: 1.4;
width: clamp(260px, min(33vh, 28vw), 40vw);
display: flex;
flex-direction: column;
overflow-y: auto;
align-items: stretch;
}
@media (orientation: portrait) and (max-width: 700px) {
#info-panel {
width: 90vw;
}
}
#analog-clock {
width: 100%;
height: auto;
margin: 0 auto 0.4vh auto;
display: block;
flex-shrink: 0;
}
#digital-clock {
text-align: center;
font-size: 1.3em;
letter-spacing: 2px;
margin-bottom: 0.6vh;
padding-bottom: 0.5vh;
border-bottom: 1px solid rgba(230, 223, 209, 0.2);
white-space: pre;
}
.info-row {
display: flex;
align-items: center;
gap: 0.6vw;
padding: 0.05vh 0;
}
.info-icon {
width: 1.4em;
height: 1.4em;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.info-icon svg {
width: 100%;
height: 100%;
}
.info-content {
flex-grow: 1;
display: flex;
justify-content: space-between;
gap: 0.6vw;
}
.info-label {
color: var(--icon);
}
.info-value {
color: var(--bone);
font-weight: bold;
}
.info-sub {
color: var(--stone);
font-size: 0.85em;
margin-left: 4px;
}
.weather-divider {
height: 1px;
background: rgba(230, 223, 209, 0.2);
margin: 0.5vh 0;
}
.weather-current {
display: flex;
align-items: center;
gap: 0.8vw;
padding: 0.8vh 0 1vh 0;
border-bottom: 1px solid rgba(230, 223, 209, 0.2);
margin-bottom: 1vh;
}
.weather-current-icon {
width: 3.5em;
height: 3.5em;
flex-shrink: 0;
}
.weather-current-icon svg { width: 100%; height: 100%; }
.weather-current-temp {
font-size: 2.4em;
font-weight: bold;
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 1vw;
}
.weather-location {
font-size: 0.45em;
font-weight: normal;
color: var(--icon);
text-align: right;
word-break: break-word;
max-width: 60%;
}
.weather-current-detail {
font-size: 1em;
color: var(--icon);
line-height: 1.3;
}
.weather-day {
margin-bottom: 0.6vh;
}
.weather-day-header {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 0.2vh 0;
font-size: 1em;
}
.weather-day-name {
color: var(--bone);
font-weight: bold;
}
.weather-day-minmax {
color: var(--bone);
font-size: 0.85em;
}
.weather-day-slots {
display: flex;
justify-content: space-between;
gap: 0.3vw;
font-size: 0.9em;
margin-top: 0.3vh;
}
.weather-slot {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
gap: 0.3vh;
}
.weather-slot-icon {
width: 2em;
height: 2em;
}
.weather-slot-icon svg { width: 100%; height: 100%; }
.weather-slot-label {
color: var(--stone);
font-size: 0.8em;
}
.weather-slot-temp {
color: var(--bone);
}
</style>
<style>
/* Ash palette by zink (this project)
* Original: https://git.familie-zink.org/zink/omarchy-ash-theme
* License: See repository LICENSE
*
* Generic color system - simple to customize for other themes.
Each color has light/dark variants interpolated from the base color. */
:root {
/* Surface grays (darkest to lightest) */
--black: #100f12;
--black-light: #161320;
--black-dark: #080710;
--dark: #1c1b1f;
--dark-light: #232125;
--dark-dark: #14131a;
--gray-darker: #29282c;
--gray-darker-light: #323035;
--gray-darker-dark: #1e1d22;
--gray-dark: #3a383d;
--gray-dark-light: #47463f;
--gray-dark-dark: #2a282d;
--gray: #54514f;
--gray-light: #605e59;
--gray-dark: #44443f;
--gray-light: #6d6a63;
--gray-light-light: #83807d;
--gray-light-dark: #605e59;
--stone: #999187;
--stone-light: #a59d91;
--stone-dark: #837f7d;
--icon: #b0a89a;
--icon-light: #cac3b9;
--icon-dark: #97908a;
--bone: #e6dfd1;
--bone-light: #ede9d9;
--bone-dark: #c8c2b6;
--chalk: #f3ede1;
--chalk-light: #fbf7eb;
--chalk-dark: #d8d3c8;
/* Accent colors */
--orange: #e0914f;
--orange-light: #e7a76f;
--orange-dark: #b5773b;
--yellow: #d6b46a;
--yellow-light: #e3c483;
--yellow-dark: #b6914d;
--red: #c15c46;
--red-light: #d17661;
--red-dark: #9a4636;
--brown: #a86a48;
--brown-light: #c0856a;
--brown-dark: #834e2f;
--pink: #b47e99;
--pink-light: #cf9eb2;
--pink-dark: #875a76;
--green: #8f9a5c;
--green-light: #a6b27b;
--green-dark: #6b774a;
--blue: #7c9aa1;
--blue-light: #a3bcc1;
--blue-dark: #5b7a83;
--purple: #a585ac;
--purple-light: #c0a7c6;
--purple-dark: #806388;
}
</style>
</head>
<body>
<div id="vanta" style="background: #1c1b1f;"></div>
<div id="debug-panel">
<div class="debug-title expanded" onclick="toggleDebugPanel()">\n<span>DEBUG - Palette: <span id="dbg-palette-name">Ash</span></span><span class="debug-title-toggle" id="debug-toggle-icon">▼</span></div>
<div id="debug-content" class="debug-content">
<div class="debug-controls">
<select id="dbg-theme-select" class="debug-select" onchange="setDebugTheme(this.value)">
<!-- Populated dynamically by populateDebugSelects() -->
</select>
<select id="dbg-units-select" class="debug-select" onchange="setDebugUnits(this.value)">
<!-- Populated dynamically by populateDebugSelects() -->
</select>
<select id="dbg-language-select" class="debug-select" onchange="setDebugLanguage(this.value)">
<!-- Populated dynamically by populateDebugSelects() -->
</select>
</div>
<div class="debug-row"><span class="debug-label">Time:</span> <span id="dbg-time">--</span></div>
<div class="debug-row"><span class="debug-label">Day%:</span> <span id="dbg-day">--</span></div>
<div class="debug-row"><span class="debug-label">Weather:</span> <span id="dbg-weather">--</span></div>
<div class="debug-row"><span class="debug-label">Theme:</span> <span id="dbg-theme">--</span></div>
<div class="debug-row"><span class="debug-label">Speed:</span> <span id="dbg-speed">--</span></div>
<div class="debug-row"><span class="debug-label">Transition:</span> <span id="dbg-trans">--</span></div>
<div class="debug-section">Effective theme</div>
<div class="debug-row"><span class="libel">skyColor</span> <div class="swatch" id="dbg-t-sky"></div> <span class="hex" id="dbg-h-sky">--</span></div>
<div class="debug-row"><span class="libel">cloudColor</span> <div class="swatch" id="dbg-t-cloud"></div> <span class="hex" id="dbg-h-cloud">--</span></div>
<div class="debug-row"><span class="libel">lightColor</span> <div class="swatch" id="dbg-t-sunLight"></div> <span class="hex" id="dbg-h-sunLight">--</span></div>
<div class="debug-row"><span class="libel">bgColor</span> <div class="swatch" id="dbg-t-bg"></div> <span class="hex" id="dbg-h-bg">--</span></div>
<div class="debug-section">Vanta colors</div>
<div class="debug-row"><span class="libel">skyColor</span> <div class="swatch" id="dbg-v-sky"></div> <span class="hex" id="dbg-vh-sky">--</span></div>
<div class="debug-row"><span class="libel">cloudColor</span> <div class="swatch" id="dbg-v-cloud"></div> <span class="hex" id="dbg-vh-cloud">--</span></div>
<div class="debug-row"><span class="libel">lightColor</span> <div class="swatch" id="dbg-v-sunLight"></div> <span class="hex" id="dbg-vh-sunLight">--</span></div>
<div class="debug-row"><span class="libel">bgColor</span> <div class="swatch" id="dbg-v-bg"></div> <span class="hex" id="dbg-vh-bg">--</span></div>
<div class="debug-section">Theme table</div>
<div id="dbg-theme-table" class="theme-table"></div>
<div id="dbg-color-table" class="theme-table"></div>
<div class="debug-section">RPG angles (degrees)</div>
<div class="debug-row"><span class="libel">sun rise</span> <span id="dbg-sun-rise-angle">--</span></div>
<div class="debug-row"><span class="libel">sun set</span> <span id="dbg-sun-set-angle">--</span></div>
<div class="debug-row"><span class="libel">sun now</span> <span id="dbg-sun-now-angle">--</span></div>
<div class="debug-row"><span class="libel">moon rise</span> <span id="dbg-moon-rise-angle">--</span></div>
<div class="debug-row"><span class="libel">moon set</span> <span id="dbg-moon-set-angle">--</span></div>
<div class="debug-row"><span class="libel">moon now</span> <span id="dbg-moon-now-angle">--</span></div>
</div>
</div>
<div id="info-panel">
<svg id="analog-clock" viewBox="0 0 280 280">
<!-- Clock face -->
<circle cx="140" cy="140" r="135" fill="rgba(28,27,31,0.3)" stroke="var(--bone)" stroke-width="2"/>
<!-- Hour marks -->
<g id="hour-marks"></g>
<!-- Sun orbit (radius 65) -->
<circle cx="140" cy="140" r="65" stroke="var(--gray-dark)" stroke-width="1" fill="none" stroke-dasharray="2,3" opacity="0.6"/>
<!-- Moon orbit (radius 88) -->
<circle cx="140" cy="140" r="88" stroke="var(--gray-dark)" stroke-width="1" fill="none" stroke-dasharray="2,3" opacity="0.6"/>
<!-- Sun arc (from sunrise to sunset) -->
<path id="sun-arc" d="" stroke="var(--orange)" stroke-width="2.5" fill="none"/>
<!-- Moon arc (from moonrise to moonset) -->
<path id="moon-arc" d="" stroke="var(--icon)" stroke-width="2.5" fill="none"/>
<!-- Sun rise arrow (pointing in / up at sunrise) -->
<g id="sun-rise-arrow" fill="var(--orange)">
<polygon points="0,-9 8,0 -9,0"/>
</g>
<!-- Sun set arrow (pointing out / down at sunset) -->
<g id="sun-set-arrow" fill="var(--orange)">
<polygon points="0,9 8,0 -9,0"/>
</g>
<!-- Moon rise arrow -->
<g id="moon-rise-arrow" fill="var(--icon)">
<polygon points="0,-9 8,0 -9,0"/>
</g>
<!-- Moon set arrow -->
<g id="moon-set-arrow" fill="var(--icon)">
<polygon points="0,9 8,0 -9,0"/>
</g>
<!-- Sun zenith marker (diamond shape, small) -->
<g id="sun-zenith-marker" fill="var(--orange)">
<polygon points="0,-5 5,0 0,5 -5,0"/>
</g>
<!-- Moon zenith marker removed -->
<!-- Sun position (rendered after arcs/arrows so it's visible) -->
<circle id="rpg-sun-glow" cx="140" cy="140" r="14" fill="var(--orange)" opacity="0.4"/>
<circle id="rpg-sun" cx="140" cy="140" r="8" fill="var(--orange)"/>
<circle id="rpg-sun-core" cx="140" cy="140" r="3.5" fill="var(--chalk)"/>
<!-- Moon position (with phase) -->
<g id="rpg-moon">
<circle id="rpg-moon-bg" cx="0" cy="0" r="10" fill="var(--dark)" stroke="var(--stone)" stroke-width="1"/>
<path id="rpg-moon-lit" d="" fill="var(--bone)"/>
<path id="rpg-moon-dark" d="" fill="var(--gray)"/>
</g>
<!-- Clock hands (on top of everything) -->
<line id="hour-hand" x1="140" y1="140" x2="140" y2="49" stroke="var(--bone)" stroke-width="7" stroke-linecap="round" opacity="0.7"/>
<line id="minute-hand" x1="140" y1="140" x2="140" y2="28" stroke="var(--bone)" stroke-width="5" stroke-linecap="round" opacity="0.7"/>
<line id="second-hand" x1="140" y1="140" x2="140" y2="20" stroke="var(--red)" stroke-width="2.5" stroke-linecap="round"/>
<circle cx="140" cy="140" r="5" fill="var(--red)"/>
</svg>
<div id="digital-clock">00:00:00</div>
<div class="info-row">
<div class="info-icon">
<svg viewBox="0 0 24 24" fill="var(--orange)"><circle cx="12" cy="12" r="4"/><g stroke="var(--orange)" stroke-width="2" stroke-linecap="round"><line x1="12" y1="2" x2="12" y2="5"/><line x1="12" y1="19" x2="12" y2="22"/><line x1="2" y1="12" x2="5" y2="12"/><line x1="19" y1="12" x2="22" y2="12"/><line x1="4.9" y1="4.9" x2="6.9" y2="6.9"/><line x1="17.1" y1="17.1" x2="19.1" y2="19.1"/><line x1="4.9" y1="19.1" x2="6.9" y2="17.1"/><line x1="17.1" y1="6.9" x2="19.1" y2="4.9"/></g></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Sunrise">Sunrise</span><span><span class="info-value" id="sunrise-value">--:--</span><span class="info-sub" id="sunrise-when"></span></span></div>
</div>
<div class="info-row">
<div class="info-icon">
<svg viewBox="0 0 24 24" fill="var(--orange)"><circle cx="12" cy="12" r="4"/><line x1="12" y1="12" x2="12" y2="3" stroke="var(--orange)" stroke-width="2"/></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Sun Zenith">Sun Zenith</span><span><span class="info-value" id="sun-zenith-value">--:--</span><span class="info-sub" id="sun-zenith-when"></span></span></div>
</div>
<div class="info-row">
<div class="info-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="var(--orange)" stroke-width="2"><path d="M3 12 A9 9 0 0 1 21 12 Z"/></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Sunset">Sunset</span><span><span class="info-value" id="sunset-value">--:--</span><span class="info-sub" id="sunset-when"></span></span></div>
</div>
<div class="info-row">
<div class="info-icon">
<svg id="moon-phase-icon" viewBox="0 0 24 24"><circle cx="12" cy="12" r="9" fill="var(--dark)"/></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Moon Phase">Moon Phase</span><span class="info-value" id="moon-phase-text">--</span></div>
</div>
<div class="info-row">
<div class="info-icon">
<svg viewBox="0 0 24 24" fill="var(--icon)"><path d="M12 2 a10 10 0 1 0 0 20 a8 8 0 1 1 0 -16 a6 6 0 1 1 0 8"/></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Moonrise">Moonrise</span><span><span class="info-value" id="moonrise-value">--:--</span><span class="info-sub" id="moonrise-when"></span></span></div>
</div>
<div class="info-row">
<div class="info-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="var(--icon)" stroke-width="2"><path d="M3 12 A9 9 0 0 1 21 22 Z"/></svg>
</div>
<div class="info-content"><span class="info-label" data-i18n="Moonset">Moonset</span><span><span class="info-value" id="moonset-value">--:--</span><span class="info-sub" id="moonset-when"></span></span></div>
</div>
<div id="weather-divider" class="weather-divider"></div>
<div id="weather-current" class="weather-current"></div>
<div id="weather-forecast" class="weather-forecast"></div>
</div>
<script>
/**
* @license
* Copyright 2010-2021 Three.js Authors
* SPDX-License-Identifier: MIT
*/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="128",n=100,i=300,r=301,s=302,a=303,o=304,l=306,c=307,h=1e3,u=1001,d=1002,p=1003,m=1004,f=1005,g=1006,v=1007,y=1008,x=1009,_=1012,w=1014,b=1015,M=1016,S=1020,T=1022,E=1023,A=1026,L=1027,R=33776,C=33777,P=33778,D=33779,I=35840,N=35841,B=35842,z=35843,F=37492,O=37496,H=2300,G=2301,U=2302,k=2400,V=2401,W=2402,j=2500,q=2501,X=3e3,Y=3001,Z=3007,J=3002,Q=3004,K=3005,$=3006,tt=7680,et=35044,nt=35048,it="300 es";class rt{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 st=[];for(let t=0;t<256;t++)st[t]=(t<16?"0":"")+t.toString(16);let at=1234567;const ot=Math.PI/180,lt=180/Math.PI;function ct(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(st[255&t]+st[t>>8&255]+st[t>>16&255]+st[t>>24&255]+"-"+st[255&e]+st[e>>8&255]+"-"+st[e>>16&15|64]+st[e>>24&255]+"-"+st[63&n|128]+st[n>>8&255]+"-"+st[n>>16&255]+st[n>>24&255]+st[255&i]+st[i>>8&255]+st[i>>16&255]+st[i>>24&255]).toUpperCase()}function ht(t,e,n){return Math.max(e,Math.min(n,t))}function ut(t,e){return(t%e+e)%e}function dt(t,e,n){return(1-n)*t+n*e}function pt(t){return 0==(t&t-1)&&0!==t}function mt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ft(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}var gt=Object.freeze({__proto__:null,DEG2RAD:ot,RAD2DEG:lt,generateUUID:ct,clamp:ht,euclideanModulo:ut,mapLinear:function(t,e,n,i,r){return i+(t-e)*(r-i)/(n-e)},inverseLerp:function(t,e,n){return t!==e?(n-t)/(e-t):0},lerp:dt,damp:function(t,e,n,i){return dt(t,e,1-Math.exp(-n*i))},pingpong:function(t,e=1){return e-Math.abs(ut(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(at=t%2147483647),at=16807*at%2147483647,(at-1)/2147483646},degToRad:function(t){return t*ot},radToDeg:function(t){return t*lt},isPowerOfTwo:pt,ceilPowerOfTwo:mt,floorPowerOfTwo:ft,setQuaternionFromProperEuler:function(t,e,n,i,r){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),c=s((e+i)/2),h=a((e+i)/2),u=s((e-i)/2),d=a((e-i)/2),p=s((i-e)/2),m=a((i-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class vt{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}}vt.prototype.isVector2=!0;class yt{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 c=this.elements;return c[0]=t,c[1]=i,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=n,c[7]=s,c[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],c=n[4],h=n[7],u=n[2],d=n[5],p=n[8],m=i[0],f=i[3],g=i[6],v=i[1],y=i[4],x=i[7],_=i[2],w=i[5],b=i[8];return r[0]=s*m+a*v+o*_,r[3]=s*f+a*y+o*w,r[6]=s*g+a*x+o*b,r[1]=l*m+c*v+h*_,r[4]=l*f+c*y+h*w,r[7]=l*g+c*x+h*b,r[2]=u*m+d*v+p*_,r[5]=u*f+d*y+p*w,r[8]=u*g+d*x+p*b,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],c=t[8];return e*s*c-e*a*l-n*r*c+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],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+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]=h*m,t[1]=(i*l-c*n)*m,t[2]=(a*n-i*s)*m,t[3]=u*m,t[4]=(c*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],c=i[7];return i[0]=e*r+n*o,i[3]=e*s+n*l,i[6]=e*a+n*c,i[1]=-n*r+e*o,i[4]=-n*s+e*l,i[7]=-n*a+e*c,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)}}let xt;yt.prototype.isMatrix3=!0;class _t{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===xt&&(xt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),xt.width=t.width,xt.height=t.height;const n=xt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=xt}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 wt=0;class bt extends rt{constructor(t=bt.DEFAULT_IMAGE,e=bt.DEFAULT_MAPPING,n=1001,i=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:wt++}),this.uuid=ct(),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 vt(0,0),this.repeat=new vt(1,1),this.center=new vt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new yt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null}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}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=ct()),!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(Mt(i[t].image)):e.push(Mt(i[t]))}else e=Mt(i);t.images[i.uuid]={uuid:i.uuid,url:e}}n.image=i.uuid}return e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==i)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 u:t.x=t.x<0?0:1;break;case d: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 u:t.y=t.y<0?0:1;break;case d: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 Mt(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?_t.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."),{})}bt.DEFAULT_IMAGE=void 0,bt.DEFAULT_MAPPING=i,bt.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],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)<s&&Math.abs(h-m)<s&&Math.abs(p-f)<s){if(Math.abs(c+u)<a&&Math.abs(h+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,y=(c+u)/4,x=(h+m)/4,_=(p+f)/4;return t>o&&t>v?t<s?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(t),i=y/n,r=x/n):o>v?o<s?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(o),n=y/i,r=_/i):v<s?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(v),n=x/r,i=_/r),this.set(n,i,r,e),this}let v=Math.sqrt((f-p)*(f-p)+(h-m)*(h-m)+(u-c)*(u-c));return Math.abs(v)<.001&&(v=1),this.x=(f-p)/v,this.y=(h-m)/v,this.z=(u-c)/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}}St.prototype.isVector4=!0;class Tt extends rt{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),n=n||{},this.texture=new bt(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.image={},this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=1,this.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,this.texture.minFilter=void 0!==n.minFilter?n.minFilter:g,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.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}Tt.prototype.isWebGLRenderTarget=!0;class Et extends Tt{constructor(t,e,n){super(t,e,n),this.samples=4}copy(t){return super.copy.call(this,t),this.samples=t.samples,this}}Et.prototype.isWebGLMultisampleRenderTarget=!0;class At{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],c=n[i+2],h=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]=c,void(t[e+3]=h);if(1===a)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(h!==m||o!==u||l!==d||c!==p){let t=1-a;const e=o*u+l*d+c*p+h*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,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,n,i,r,s){const a=n[i],o=n[i+1],l=n[i+2],c=n[i+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-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),c=a(i/2),h=a(r/2),u=o(n/2),d=o(i/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+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],c=e[6],h=e[10],u=n+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-i)*t}else if(n>a&&n>h){const t=2*Math.sqrt(1+n-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(i+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-n-h);this._w=(r-l)/t,this._x=(i+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-n-a);this._w=(s-i)/t,this._x=(r+l)/t,this._y=(o+c)/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(ht(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,c=e._w;return this._x=n*c+s*a+i*l-r*o,this._y=i*c+s*o+r*a-n*l,this._z=r*c+s*l+n*o-i*a,this._w=s*c-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),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=n*h+this._x*u,this._y=i*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,n){this.copy(t).slerp(e,n)}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(){}}At.prototype.isQuaternion=!0;class Lt{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(Ct.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Ct.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,c=o*n+a*e-r*i,h=o*i+r*n-s*e,u=-r*e-s*n-a*i;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-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 Rt.copy(this).projectOnVector(t),this.sub(Rt)}reflect(t){return this.sub(Rt.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(ht(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}}Lt.prototype.isVector3=!0;const Rt=new Lt,Ct=new At;class Pt{constructor(t=new Lt(1/0,1/0,1/0),e=new Lt(-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],c=t[o+1],h=t[o+2];l<e&&(e=l),c<n&&(n=c),h<i&&(i=h),l>r&&(r=l),c>s&&(s=c),h>a&&(a=h)}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),c=t.getY(o),h=t.getZ(o);l<e&&(e=l),c<n&&(n=c),h<i&&(i=h),l>r&&(r=l),c>s&&(s=c),h>a&&(a=h)}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=It.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 void 0===t&&(console.warn("THREE.Box3: .getCenter() target is now required"),t=new Lt),this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box3: .getSize() target is now required"),t=new Lt),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(),Nt.copy(e.boundingBox),Nt.applyMatrix4(t.matrixWorld),this.union(Nt));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 void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Lt),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,It),It.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(Ut),kt.subVectors(this.max,Ut),Bt.subVectors(t.a,Ut),zt.subVectors(t.b,Ut),Ft.subVectors(t.c,Ut),Ot.subVectors(zt,Bt),Ht.subVectors(Ft,zt),Gt.subVectors(Bt,Ft);let e=[0,-Ot.z,Ot.y,0,-Ht.z,Ht.y,0,-Gt.z,Gt.y,Ot.z,0,-Ot.x,Ht.z,0,-Ht.x,Gt.z,0,-Gt.x,-Ot.y,Ot.x,0,-Ht.y,Ht.x,0,-Gt.y,Gt.x,0];return!!jt(e,Bt,zt,Ft,kt)&&(e=[1,0,0,0,1,0,0,0,1],!!jt(e,Bt,zt,Ft,kt)&&(Vt.crossVectors(Ot,Ht),e=[Vt.x,Vt.y,Vt.z],jt(e,Bt,zt,Ft,kt)))}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Lt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return It.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(It).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()||(Dt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Dt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Dt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Dt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Dt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Dt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Dt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Dt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Dt)),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)}}Pt.prototype.isBox3=!0;const Dt=[new Lt,new Lt,new Lt,new Lt,new Lt,new Lt,new Lt,new Lt],It=new Lt,Nt=new Pt,Bt=new Lt,zt=new Lt,Ft=new Lt,Ot=new Lt,Ht=new Lt,Gt=new Lt,Ut=new Lt,kt=new Lt,Vt=new Lt,Wt=new Lt;function jt(t,e,n,i,r){for(let s=0,a=t.length-3;s<=a;s+=3){Wt.fromArray(t,s);const a=r.x*Math.abs(Wt.x)+r.y*Math.abs(Wt.y)+r.z*Math.abs(Wt.z),o=e.dot(Wt),l=n.dot(Wt),c=i.dot(Wt);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const qt=new Pt,Xt=new Lt,Yt=new Lt,Zt=new Lt;class Jt{constructor(t=new Lt,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):qt.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 void 0===e&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),e=new Lt),e.copy(t),n>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Pt),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){Zt.subVectors(t,this.center);const e=Zt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.add(Zt.multiplyScalar(n/t)),this.radius+=n}return this}union(t){return Yt.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(Xt.copy(t.center).add(Yt)),this.expandByPoint(Xt.copy(t.center).sub(Yt)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Qt=new Lt,Kt=new Lt,$t=new Lt,te=new Lt,ee=new Lt,ne=new Lt,ie=new Lt;class re{constructor(t=new Lt,e=new Lt(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 void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Lt),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,Qt)),this}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Lt),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=Qt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Qt.copy(this.direction).multiplyScalar(e).add(this.origin),Qt.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){Kt.copy(t).add(e).multiplyScalar(.5),$t.copy(e).sub(t).normalize(),te.copy(this.origin).sub(Kt);const r=.5*t.distanceTo(e),s=-this.direction.dot($t),a=te.dot(this.direction),o=-te.dot($t),l=te.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return n&&n.copy(this.direction).multiplyScalar(h).add(this.origin),i&&i.copy($t).multiplyScalar(u).add(Kt),d}intersectSphere(t,e){Qt.subVectors(t.center,this.origin);const n=Qt.dot(this.direction),i=Qt.dot(Qt)-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,c=1/this.direction.y,h=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),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),n>s||r>i?null:((r>n||n!=n)&&(n=r),(s<i||i!=i)&&(i=s),h>=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),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,Qt)}intersectTriangle(t,e,n,i,r){ee.subVectors(e,t),ne.subVectors(n,t),ie.crossVectors(ee,ne);let s,a=this.direction.dot(ie);if(a>0){if(i)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}te.subVectors(this.origin,t);const o=s*this.direction.dot(ne.crossVectors(te,ne));if(o<0)return null;const l=s*this.direction.dot(ee.cross(te));if(l<0)return null;if(o+l>a)return null;const c=-s*te.dot(ie);return c<0?null:this.at(c/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 se{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,c,h,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]=c,g[10]=h,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 se).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/ae.setFromMatrixColumn(t,0).length(),r=1/ae.setFromMatrixColumn(t,1).length(),s=1/ae.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),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,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*c,n=o*h,i=l*c,r=l*h;e[0]=t+r*a,e[4]=i*a-n,e[8]=s*l,e[1]=s*h,e[5]=s*c,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*c,n=o*h,i=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=i+n*a,e[1]=n+i*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=i*l-n,e[8]=t*l+r,e[1]=o*h,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*c,e[4]=r-t*h,e[8]=i*h+n,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=n*h+i,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=n*h-i,e[2]=i*h-n,e[6]=a*c,e[10]=r*h+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(le,t,ce)}lookAt(t,e,n){const i=this.elements;return de.subVectors(t,e),0===de.lengthSq()&&(de.z=1),de.normalize(),he.crossVectors(n,de),0===he.lengthSq()&&(1===Math.abs(n.z)?de.x+=1e-4:de.z+=1e-4,de.normalize(),he.crossVectors(n,de)),he.normalize(),ue.crossVectors(de,he),i[0]=he.x,i[4]=ue.x,i[8]=de.x,i[1]=he.y,i[5]=ue.y,i[9]=de.y,i[2]=he.z,i[6]=ue.z,i[10]=de.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],c=n[1],h=n[5],u=n[9],d=n[13],p=n[2],m=n[6],f=n[10],g=n[14],v=n[3],y=n[7],x=n[11],_=n[15],w=i[0],b=i[4],M=i[8],S=i[12],T=i[1],E=i[5],A=i[9],L=i[13],R=i[2],C=i[6],P=i[10],D=i[14],I=i[3],N=i[7],B=i[11],z=i[15];return r[0]=s*w+a*T+o*R+l*I,r[4]=s*b+a*E+o*C+l*N,r[8]=s*M+a*A+o*P+l*B,r[12]=s*S+a*L+o*D+l*z,r[1]=c*w+h*T+u*R+d*I,r[5]=c*b+h*E+u*C+d*N,r[9]=c*M+h*A+u*P+d*B,r[13]=c*S+h*L+u*D+d*z,r[2]=p*w+m*T+f*R+g*I,r[6]=p*b+m*E+f*C+g*N,r[10]=p*M+m*A+f*P+g*B,r[14]=p*S+m*L+f*D+g*z,r[3]=v*w+y*T+x*R+_*I,r[7]=v*b+y*E+x*C+_*N,r[11]=v*M+y*A+x*P+_*B,r[15]=v*S+y*L+x*D+_*z,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],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-i*l*h-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*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+n*s*d+r*a*c-n*l*c)+t[15]*(-i*a*c-e*o*h+e*a*u+i*s*h-n*s*u+n*o*c)}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],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,y=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,x=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,_=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,w=e*v+n*y+i*x+r*_;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/w;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*i*d+n*f*d+h*i*g-n*u*g)*b,t[2]=(a*f*r-m*o*r+m*i*l-n*f*l-a*i*g+n*o*g)*b,t[3]=(h*o*r-a*u*r-h*i*l+n*u*l+a*i*d-n*o*d)*b,t[4]=y*b,t[5]=(c*f*r-p*u*r+p*i*d-e*f*d-c*i*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*i*l+e*f*l+s*i*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*i*l-e*u*l-s*i*d+e*o*d)*b,t[8]=x*b,t[9]=(p*h*r-c*m*r-p*n*d+e*m*d+c*n*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*n*l-e*m*l-s*n*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*n*l+e*h*l+s*n*d-e*a*d)*b,t[12]=_*b,t[13]=(c*m*i-p*h*i+p*n*u-e*m*u-c*n*f+e*h*f)*b,t[14]=(p*a*i-s*m*i-p*n*o+e*m*o+s*n*f-e*a*f)*b,t[15]=(s*h*i-c*a*i+c*n*o-e*h*o-s*n*u+e*a*u)*b,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,c=r*a;return this.set(l*s+n,l*a-i*o,l*o+i*a,0,l*a+i*o,c*a+n,c*o-i*s,0,l*o-i*a,c*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){return this.set(1,e,n,0,t,1,n,0,t,e,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,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,y=o*c,x=o*h,_=n.x,w=n.y,b=n.z;return i[0]=(1-(m+g))*_,i[1]=(d+x)*_,i[2]=(p-y)*_,i[3]=0,i[4]=(d-x)*w,i[5]=(1-(u+g))*w,i[6]=(f+v)*w,i[7]=0,i[8]=(p+y)*b,i[9]=(f-v)*b,i[10]=(1-(u+m))*b,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=ae.set(i[0],i[1],i[2]).length();const s=ae.set(i[4],i[5],i[6]).length(),a=ae.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],oe.copy(this);const o=1/r,l=1/s,c=1/a;return oe.elements[0]*=o,oe.elements[1]*=o,oe.elements[2]*=o,oe.elements[4]*=l,oe.elements[5]*=l,oe.elements[6]*=l,oe.elements[8]*=c,oe.elements[9]*=c,oe.elements[10]*=c,e.setFromRotationMatrix(oe),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),c=(e+t)/(e-t),h=(n+i)/(n-i),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,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),c=1/(s-r),h=(e+t)*o,u=(n+i)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,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}}se.prototype.isMatrix4=!0;const ae=new Lt,oe=new se,le=new Lt(0,0,0),ce=new Lt(1,1,1),he=new Lt,ue=new Lt,de=new Lt,pe=new se,me=new At;class fe{constructor(t=0,e=0,n=0,i=fe.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){return this._x=t,this._y=e,this._z=n,this._order=i||this._order,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,n){const i=t.elements,r=i[0],s=i[4],a=i[8],o=i[1],l=i[5],c=i[9],h=i[2],u=i[6],d=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(ht(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-ht(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(ht(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ht(h,-1,1)),Math.abs(h)<.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(ht(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ht(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return pe.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pe,e,n)}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e||this._order)}reorder(t){return me.setFromEuler(this),this.setFromQuaternion(me,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 Lt(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}fe.prototype.isEuler=!0,fe.DefaultOrder="XYZ",fe.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class ge{constructor(){this.mask=1}set(t){this.mask=1<<t|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)}}let ve=0;const ye=new Lt,xe=new At,_e=new se,we=new Lt,be=new Lt,Me=new Lt,Se=new At,Te=new Lt(1,0,0),Ee=new Lt(0,1,0),Ae=new Lt(0,0,1),Le={type:"added"},Re={type:"removed"};class Ce extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:ve++}),this.uuid=ct(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=Ce.DefaultUp.clone();const t=new Lt,e=new fe,n=new At,i=new Lt(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 se},normalMatrix:{value:new yt}}),this.matrix=new se,this.matrixWorld=new se,this.matrixAutoUpdate=Ce.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new ge,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 xe.setFromAxisAngle(t,e),this.quaternion.multiply(xe),this}rotateOnWorldAxis(t,e){return xe.setFromAxisAngle(t,e),this.quaternion.premultiply(xe),this}rotateX(t){return this.rotateOnAxis(Te,t)}rotateY(t){return this.rotateOnAxis(Ee,t)}rotateZ(t){return this.rotateOnAxis(Ae,t)}translateOnAxis(t,e){return ye.copy(t).applyQuaternion(this.quaternion),this.position.add(ye.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(Te,t)}translateY(t){return this.translateOnAxis(Ee,t)}translateZ(t){return this.translateOnAxis(Ae,t)}localToWorld(t){return t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return t.applyMatrix4(_e.copy(this.matrixWorld).invert())}lookAt(t,e,n){t.isVector3?we.copy(t):we.set(t,e,n);const i=this.parent;this.updateWorldMatrix(!0,!1),be.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?_e.lookAt(be,we,this.up):_e.lookAt(we,be,this.up),this.quaternion.setFromRotationMatrix(_e),i&&(_e.extractRotation(i.matrixWorld),xe.setFromRotationMatrix(_e),this.quaternion.premultiply(xe.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(Le)):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(Re)),this}clear(){for(let t=0;t<this.children.length;t++){const e=this.children[t];e.parent=null,e.dispatchEvent(Re)}return this.children.length=0,this}attach(t){return this.updateWorldMatrix(!0,!1),_e.copy(this.matrixWorld).invert(),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),_e.multiply(t.parent.matrixWorld)),t.applyMatrix4(_e),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 void 0===t&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),t=new At),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(be,t,Me),t}getWorldScale(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(be,Se,t),t}getWorldDirection(t){void 0===t&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),t=new Lt),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.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),c=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),c.length>0&&(n.animations=c)}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}}Ce.DefaultUp=new Lt(0,1,0),Ce.DefaultMatrixAutoUpdate=!0,Ce.prototype.isObject3D=!0;const Pe=new Lt,De=new Lt,Ie=new yt;class Ne{constructor(t=new Lt(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=Pe.subVectors(n,e).cross(De.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 void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new Lt),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new Lt);const n=t.delta(Pe),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 void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Lt),t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Ie.getNormalMatrix(t),i=this.coplanarPoint(Pe).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)}}Ne.prototype.isPlane=!0;const Be=new Lt,ze=new Lt,Fe=new Lt,Oe=new Lt,He=new Lt,Ge=new Lt,Ue=new Lt,ke=new Lt,Ve=new Lt,We=new Lt;class je{constructor(t=new Lt,e=new Lt,n=new Lt){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,i){void 0===i&&(console.warn("THREE.Triangle: .getNormal() target is now required"),i=new Lt),i.subVectors(n,e),Be.subVectors(t,e),i.cross(Be);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){Be.subVectors(i,e),ze.subVectors(n,e),Fe.subVectors(t,e);const s=Be.dot(Be),a=Be.dot(ze),o=Be.dot(Fe),l=ze.dot(ze),c=ze.dot(Fe),h=s*l-a*a;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new Lt),0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,Oe),Oe.x>=0&&Oe.y>=0&&Oe.x+Oe.y<=1}static getUV(t,e,n,i,r,s,a,o){return this.getBarycoord(t,e,n,i,Oe),o.set(0,0),o.addScaledVector(r,Oe.x),o.addScaledVector(s,Oe.y),o.addScaledVector(a,Oe.z),o}static isFrontFacing(t,e,n,i){return Be.subVectors(n,e),ze.subVectors(t,e),Be.cross(ze).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}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 Be.subVectors(this.c,this.b),ze.subVectors(this.a,this.b),.5*Be.cross(ze).length()}getMidpoint(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Lt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return je.getNormal(this.a,this.b,this.c,t)}getPlane(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Ne),t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return je.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return je.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return je.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return je.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Lt);const n=this.a,i=this.b,r=this.c;let s,a;He.subVectors(i,n),Ge.subVectors(r,n),ke.subVectors(t,n);const o=He.dot(ke),l=Ge.dot(ke);if(o<=0&&l<=0)return e.copy(n);Ve.subVectors(t,i);const c=He.dot(Ve),h=Ge.dot(Ve);if(c>=0&&h<=c)return e.copy(i);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(n).addScaledVector(He,s);We.subVectors(t,r);const d=He.dot(We),p=Ge.dot(We);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(Ge,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return Ue.subVectors(r,i),a=(h-c)/(h-c+(d-p)),e.copy(i).addScaledVector(Ue,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(n).addScaledVector(He,s).addScaledVector(Ge,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let qe=0;function Xe(){Object.defineProperty(this,"id",{value:qe++}),this.uuid=ct(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,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=tt,this.stencilZFail=tt,this.stencilZPass=tt,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.alphaTest=0,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}Xe.prototype=Object.assign(Object.create(rt.prototype),{constructor:Xe,isMaterial:!0,onBuild:function(){},onBeforeCompile:function(){},customProgramCacheKey:function(){return this.onBeforeCompile.toString()},setValues:function(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:function(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),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),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.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.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.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),!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.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!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:function(){return(new this.constructor).copy(this)},copy:function(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.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:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(Xe.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}});const Ye={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},Ze={h:0,s:0,l:0},Je={h:0,s:0,l:0};function Qe(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 Ke(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function $e(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class tn{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=ut(t,1),e=ht(e,0,1),n=ht(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=Qe(r,i,t+1/3),this.g=Qe(r,i,t),this.b=Qe(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=Ye[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}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=Ke(t.r),this.g=Ke(t.g),this.b=Ke(t.b),this}copyLinearToSRGB(t){return this.r=$e(t.r),this.g=$e(t.g),this.b=$e(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){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});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(Ze),Ze.h+=t,Ze.s+=e,Ze.l+=n,this.setHSL(Ze.h,Ze.s,Ze.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(Ze),t.getHSL(Je);const n=dt(Ze.h,Je.h,e),i=dt(Ze.s,Je.s,e),r=dt(Ze.l,Je.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()}}tn.NAMES=Ye,tn.prototype.isColor=!0,tn.prototype.r=1,tn.prototype.g=1,tn.prototype.b=1;class en extends Xe{constructor(t){super(),this.type="MeshBasicMaterial",this.color=new tn(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.skinning=!1,this.morphTargets=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this}}en.prototype.isMeshBasicMaterial=!0;const nn=new Lt,rn=new vt;class sn{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=et,this.updateRange={offset:0,count:-1},this.version=0,this.onUploadCallback=function(){}}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 tn),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 vt),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 Lt),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++)rn.fromBufferAttribute(this,e),rn.applyMatrix3(t),this.setXY(e,rn.x,rn.y);else if(3===this.itemSize)for(let e=0,n=this.count;e<n;e++)nn.fromBufferAttribute(this,e),nn.applyMatrix3(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}applyMatrix4(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.applyMatrix4(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.applyNormalMatrix(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.transformDirection(t),this.setXYZ(e,nn.x,nn.y,nn.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!==et&&(t.usage=this.usage),0===this.updateRange.offset&&-1===this.updateRange.count||(t.updateRange=this.updateRange),t}}sn.prototype.isBufferAttribute=!0;class an extends sn{constructor(t,e,n){super(new Int8Array(t),e,n)}}class on extends sn{constructor(t,e,n){super(new Uint8Array(t),e,n)}}class ln extends sn{constructor(t,e,n){super(new Uint8ClampedArray(t),e,n)}}class cn extends sn{constructor(t,e,n){super(new Int16Array(t),e,n)}}class hn extends sn{constructor(t,e,n){super(new Uint16Array(t),e,n)}}class un extends sn{constructor(t,e,n){super(new Int32Array(t),e,n)}}class dn extends sn{constructor(t,e,n){super(new Uint32Array(t),e,n)}}class pn extends sn{constructor(t,e,n){super(new Uint16Array(t),e,n)}}pn.prototype.isFloat16BufferAttribute=!0;class mn extends sn{constructor(t,e,n){super(new Float32Array(t),e,n)}}class fn extends sn{constructor(t,e,n){super(new Float64Array(t),e,n)}}function gn(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}const vn={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function yn(t,e){return new vn[t](e)}let xn=0;const _n=new se,wn=new Ce,bn=new Lt,Mn=new Pt,Sn=new Pt,Tn=new Lt;class En extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:xn++}),this.uuid=ct(),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(gn(t)>65535?dn:hn)(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 yt).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}rotateX(t){return _n.makeRotationX(t),this.applyMatrix4(_n),this}rotateY(t){return _n.makeRotationY(t),this.applyMatrix4(_n),this}rotateZ(t){return _n.makeRotationZ(t),this.applyMatrix4(_n),this}translate(t,e,n){return _n.makeTranslation(t,e,n),this.applyMatrix4(_n),this}scale(t,e,n){return _n.makeScale(t,e,n),this.applyMatrix4(_n),this}lookAt(t){return wn.lookAt(t),wn.updateMatrix(),this.applyMatrix4(wn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(bn).negate(),this.translate(bn.x,bn.y,bn.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 mn(e,3)),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Pt);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 Lt(-1/0,-1/0,-1/0),new Lt(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];Mn.setFromBufferAttribute(n),this.morphTargetsRelative?(Tn.addVectors(this.boundingBox.min,Mn.min),this.boundingBox.expandByPoint(Tn),Tn.addVectors(this.boundingBox.max,Mn.max),this.boundingBox.expandByPoint(Tn)):(this.boundingBox.expandByPoint(Mn.min),this.boundingBox.expandByPoint(Mn.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 Jt);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 Lt,1/0);if(t){const n=this.boundingSphere.center;if(Mn.setFromBufferAttribute(t),e)for(let t=0,n=e.length;t<n;t++){const n=e[t];Sn.setFromBufferAttribute(n),this.morphTargetsRelative?(Tn.addVectors(Mn.min,Sn.min),Mn.expandByPoint(Tn),Tn.addVectors(Mn.max,Sn.max),Mn.expandByPoint(Tn)):(Mn.expandByPoint(Sn.min),Mn.expandByPoint(Sn.max))}Mn.getCenter(n);let i=0;for(let e=0,r=t.count;e<r;e++)Tn.fromBufferAttribute(t,e),i=Math.max(i,n.distanceToSquared(Tn));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++)Tn.fromBufferAttribute(s,e),a&&(bn.fromBufferAttribute(t,e),Tn.add(bn)),i=Math.max(i,n.distanceToSquared(Tn))}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)}}computeFaceNormals(){}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 sn(new Float32Array(4*a),4));const o=e.tangent.array,l=[],c=[];for(let t=0;t<a;t++)l[t]=new Lt,c[t]=new Lt;const h=new Lt,u=new Lt,d=new Lt,p=new vt,m=new vt,f=new vt,g=new Lt,v=new Lt;function y(t,e,n){h.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(h),d.sub(h),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),c[t].add(v),c[e].add(v),c[n].add(v))}let x=this.groups;0===x.length&&(x=[{start:0,count:n.length}]);for(let t=0,e=x.length;t<e;++t){const e=x[t],i=e.start;for(let t=i,r=i+e.count;t<r;t+=3)y(n[t+0],n[t+1],n[t+2])}const _=new Lt,w=new Lt,b=new Lt,M=new Lt;function S(t){b.fromArray(r,3*t),M.copy(b);const e=l[t];_.copy(e),_.sub(b.multiplyScalar(b.dot(e))).normalize(),w.crossVectors(M,e);const n=w.dot(c[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=x.length;t<e;++t){const e=x[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 sn(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 Lt,r=new Lt,s=new Lt,a=new Lt,o=new Lt,l=new Lt,c=new Lt,h=new Lt;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),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),a.fromBufferAttribute(n,d),o.fromBufferAttribute(n,p),l.fromBufferAttribute(n,m),a.add(c),o.add(c),l.add(c),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),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),n.setXYZ(t+0,c.x,c.y,c.z),n.setXYZ(t+1,c.x,c.y,c.z),n.setXYZ(t+2,c.x,c.y,c.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++)Tn.fromBufferAttribute(t,e),Tn.normalize(),t.setXYZ(e,Tn.x,Tn.y,Tn.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 t=0,r=e.length;t<r;t++){a=e[t]*i;for(let t=0;t<i;t++)s[o++]=n[a++]}return new sn(s,i,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const e=new En,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 En).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,this}dispose(){this.dispatchEvent({type:"dispose"})}}En.prototype.isBufferGeometry=!0;const An=new se,Ln=new re,Rn=new Jt,Cn=new Lt,Pn=new Lt,Dn=new Lt,In=new Lt,Nn=new Lt,Bn=new Lt,zn=new Lt,Fn=new Lt,On=new Lt,Hn=new vt,Gn=new vt,Un=new vt,kn=new Lt,Vn=new Lt;class Wn extends Ce{constructor(t=new En,e=new en){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(),Rn.copy(n.boundingSphere),Rn.applyMatrix4(r),!1===t.ray.intersectsSphere(Rn))return;if(An.copy(r).invert(),Ln.copy(t.ray).applyMatrix4(An),null!==n.boundingBox&&!1===Ln.intersectsBox(n.boundingBox))return;let s;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position,o=n.morphAttributes.position,l=n.morphTargetsRelative,c=n.attributes.uv,h=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(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=jn(this,m,t,Ln,a,o,l,c,h,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=jn(this,i,t,Ln,a,o,l,c,h,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(r.start+r.count,d.start+d.count);n<i;n+=3){s=jn(this,p,t,Ln,a,o,l,c,h,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=jn(this,i,t,Ln,a,o,l,c,h,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 jn(t,e,n,i,r,s,a,o,l,c,h,u){Cn.fromBufferAttribute(r,c),Pn.fromBufferAttribute(r,h),Dn.fromBufferAttribute(r,u);const d=t.morphTargetInfluences;if(e.morphTargets&&s&&d){zn.set(0,0,0),Fn.set(0,0,0),On.set(0,0,0);for(let t=0,e=s.length;t<e;t++){const e=d[t],n=s[t];0!==e&&(In.fromBufferAttribute(n,c),Nn.fromBufferAttribute(n,h),Bn.fromBufferAttribute(n,u),a?(zn.addScaledVector(In,e),Fn.addScaledVector(Nn,e),On.addScaledVector(Bn,e)):(zn.addScaledVector(In.sub(Cn),e),Fn.addScaledVector(Nn.sub(Pn),e),On.addScaledVector(Bn.sub(Dn),e)))}Cn.add(zn),Pn.add(Fn),Dn.add(On)}t.isSkinnedMesh&&e.skinning&&(t.boneTransform(c,Cn),t.boneTransform(h,Pn),t.boneTransform(u,Dn));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;Vn.copy(o),Vn.applyMatrix4(t.matrixWorld);const c=n.ray.origin.distanceTo(Vn);return c<n.near||c>n.far?null:{distance:c,point:Vn.clone(),object:t}}(t,e,n,i,Cn,Pn,Dn,kn);if(p){o&&(Hn.fromBufferAttribute(o,c),Gn.fromBufferAttribute(o,h),Un.fromBufferAttribute(o,u),p.uv=je.getUV(kn,Cn,Pn,Dn,Hn,Gn,Un,new vt)),l&&(Hn.fromBufferAttribute(l,c),Gn.fromBufferAttribute(l,h),Un.fromBufferAttribute(l,u),p.uv2=je.getUV(kn,Cn,Pn,Dn,Hn,Gn,Un,new vt));const t={a:c,b:h,c:u,normal:new Lt,materialIndex:0};je.getNormal(Cn,Pn,Dn,t.normal),p.face=t}return p}Wn.prototype.isMesh=!0;class qn extends En{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=[],c=[],h=[];let u=0,d=0;function p(t,e,n,i,r,s,p,m,f,g,v){const y=s/f,x=p/g,_=s/2,w=p/2,b=m/2,M=f+1,S=g+1;let T=0,E=0;const A=new Lt;for(let s=0;s<S;s++){const a=s*x-w;for(let o=0;o<M;o++){const u=o*y-_;A[t]=u*i,A[e]=a*r,A[n]=b,l.push(A.x,A.y,A.z),A[t]=0,A[e]=0,A[n]=m>0?1:-1,c.push(A.x,A.y,A.z),h.push(o/f),h.push(1-s/g),T+=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),E+=6}a.addGroup(d,E,v),d+=E,u+=T}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 mn(l,3)),this.setAttribute("normal",new mn(c,3)),this.setAttribute("uv",new mn(h,2))}}function Xn(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 Yn(t){const e={};for(let n=0;n<t.length;n++){const i=Xn(t[n]);for(const t in i)e[t]=i[t]}return e}const Zn={clone:Xn,merge:Yn};class Jn extends Xe{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.skinning=!1,this.morphTargets=!1,this.morphNormals=!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=Xn(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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,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}}Jn.prototype.isShaderMaterial=!0;class Qn extends Ce{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new se,this.projectionMatrix=new se,this.projectionMatrixInverse=new se}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){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Lt),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)}}Qn.prototype.isCamera=!0;class Kn extends Qn{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*lt*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ot*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*lt*Math.atan(Math.tan(.5*ot*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*ot*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}}Kn.prototype.isPerspectiveCamera=!0;const $n=90;class ti extends Ce{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 Kn($n,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new Lt(1,0,0)),this.add(i);const r=new Kn($n,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Lt(-1,0,0)),this.add(r);const s=new Kn($n,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Lt(0,1,0)),this.add(s);const a=new Kn($n,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Lt(0,-1,0)),this.add(a);const o=new Kn($n,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Lt(0,0,1)),this.add(o);const l=new Kn($n,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Lt(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,c=t.xr.enabled,h=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(h),t.xr.enabled=c}}class ei extends bt{constructor(t,e,n,i,s,a,o,l,c,h){super(t=void 0!==t?t:[],e=void 0!==e?e:r,n,i,s,a,o=void 0!==o?o:T,l,c,h),this._needsFlipEnvMap=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}ei.prototype.isCubeTexture=!0;class ni extends Tt{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 ei(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:g,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=E,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 qn(5,5,5),r=new Jn({name:"CubemapFromEquirect",uniforms:Xn(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new Wn(i,r),a=e.minFilter;e.minFilter===y&&(e.minFilter=g);return new ti(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)}}ni.prototype.isWebGLCubeRenderTarget=!0;class ii extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={data:t||null,width:e||1,height:n||1},this.magFilter=void 0!==l?l:p,this.minFilter=void 0!==c?c:p,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}ii.prototype.isDataTexture=!0;const ri=new Jt,si=new Lt;class ai{constructor(t=new Ne,e=new Ne,n=new Ne,i=new Ne,r=new Ne,s=new Ne){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],c=n[6],h=n[7],u=n[8],d=n[9],p=n[10],m=n[11],f=n[12],g=n[13],v=n[14],y=n[15];return e[0].setComponents(a-i,h-o,m-u,y-f).normalize(),e[1].setComponents(a+i,h+o,m+u,y+f).normalize(),e[2].setComponents(a+r,h+l,m+d,y+g).normalize(),e[3].setComponents(a-r,h-l,m-d,y-g).normalize(),e[4].setComponents(a-s,h-c,m-p,y-v).normalize(),e[5].setComponents(a+s,h+c,m+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ri.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSprite(t){return ri.center.set(0,0,0),ri.radius=.7071067811865476,ri.applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}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(si.x=i.normal.x>0?t.max.x:t.min.x,si.y=i.normal.y>0?t.max.y:t.min.y,si.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(si)<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 oi(){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 li(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&&(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 ci extends En{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,c=o+1,h=t/a,u=e/o,d=[],p=[],m=[],f=[];for(let t=0;t<c;t++){const e=t*u-s;for(let n=0;n<l;n++){const i=n*h-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 mn(p,3)),this.setAttribute("normal",new mn(m,3)),this.setAttribute("uv",new mn(f,2))}}const hi={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 ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\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.specularRoughness );\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:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\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\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_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_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * 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}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.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}\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_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\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 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 max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\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 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}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\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 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\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\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\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:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\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}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\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#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#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\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\tuniform int maxMipLevel;\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 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\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\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\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 fogDepth;\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 texture2D( gradientMap, coord ).rgb;\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\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\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 );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\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\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * 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\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * 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\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * 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 );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\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 GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\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 getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.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 getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.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 getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.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 GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_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_Diffuse_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;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, 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_Diffuse_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.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\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 = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\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.specularRoughness;\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(\t\t0, 1,\t\t0 ),\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#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_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_Diffuse_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 CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * 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 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\tgetPointDirectLightIrradiance( 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\tgetSpotDirectLightIrradiance( 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\tgetDirectionalDirectLightIrradiance( 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 );\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 );\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 += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\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\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\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",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 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",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\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.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\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.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(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.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; }",transmissionmap_fragment:"#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif",transmissionmap_pars_fragment:"#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\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 )\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_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}",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}",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}",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}",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 <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}",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}",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 <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}",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}",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}",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}",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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_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}",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 <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\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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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}",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#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\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 <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_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 <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_Diffuse_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_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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 <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#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\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\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\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 <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 <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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\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 <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#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#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\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_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 <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 <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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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 <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#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#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\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#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\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 <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <transmissionmap_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 <lights_physical_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#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\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 <transmissionmap_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 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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#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\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 <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#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\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}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#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\n#include <packing>\n#include <uv_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}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#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\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 <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#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\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}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_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}",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}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_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 <shadowmap_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 <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\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\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}"},ui={common:{diffuse:{value:new tn(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new yt},uv2Transform:{value:new yt},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},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 vt(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 tn(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 tn(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}},sprite:{diffuse:{value:new tn(15658734)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}}},di={basic:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.fog]),vertexShader:hi.meshbasic_vert,fragmentShader:hi.meshbasic_frag},lambert:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.fog,ui.lights,{emissive:{value:new tn(0)}}]),vertexShader:hi.meshlambert_vert,fragmentShader:hi.meshlambert_frag},phong:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,ui.lights,{emissive:{value:new tn(0)},specular:{value:new tn(1118481)},shininess:{value:30}}]),vertexShader:hi.meshphong_vert,fragmentShader:hi.meshphong_frag},standard:{uniforms:Yn([ui.common,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.roughnessmap,ui.metalnessmap,ui.fog,ui.lights,{emissive:{value:new tn(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag},toon:{uniforms:Yn([ui.common,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.gradientmap,ui.fog,ui.lights,{emissive:{value:new tn(0)}}]),vertexShader:hi.meshtoon_vert,fragmentShader:hi.meshtoon_frag},matcap:{uniforms:Yn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,{matcap:{value:null}}]),vertexShader:hi.meshmatcap_vert,fragmentShader:hi.meshmatcap_frag},points:{uniforms:Yn([ui.points,ui.fog]),vertexShader:hi.points_vert,fragmentShader:hi.points_frag},dashed:{uniforms:Yn([ui.common,ui.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:hi.linedashed_vert,fragmentShader:hi.linedashed_frag},depth:{uniforms:Yn([ui.common,ui.displacementmap]),vertexShader:hi.depth_vert,fragmentShader:hi.depth_frag},normal:{uniforms:Yn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,{opacity:{value:1}}]),vertexShader:hi.normal_vert,fragmentShader:hi.normal_frag},sprite:{uniforms:Yn([ui.sprite,ui.fog]),vertexShader:hi.sprite_vert,fragmentShader:hi.sprite_frag},background:{uniforms:{uvTransform:{value:new yt},t2D:{value:null}},vertexShader:hi.background_vert,fragmentShader:hi.background_frag},cube:{uniforms:Yn([ui.envmap,{opacity:{value:1}}]),vertexShader:hi.cube_vert,fragmentShader:hi.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:hi.equirect_vert,fragmentShader:hi.equirect_frag},distanceRGBA:{uniforms:Yn([ui.common,ui.displacementmap,{referencePosition:{value:new Lt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:hi.distanceRGBA_vert,fragmentShader:hi.distanceRGBA_frag},shadow:{uniforms:Yn([ui.lights,ui.fog,{color:{value:new tn(0)},opacity:{value:1}}]),vertexShader:hi.shadow_vert,fragmentShader:hi.shadow_frag}};function pi(t,e,n,i,r){const s=new tn(0);let a,o,c=0,h=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),c=e,p(s,c)},getClearAlpha:function(){return c},setClearAlpha:function(t){c=t,p(s,c)},render:function(n,r,m,f){let g=!0===r.isScene?r.background:null;g&&g.isTexture&&(g=e.get(g));const v=t.xr,y=v.getSession&&v.getSession();y&&"additive"===y.environmentBlendMode&&(g=null),null===g?p(s,c):g&&g.isColor&&(p(g,1),f=!0),(t.autoClear||f)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),g&&(g.isCubeTexture||g.mapping===l)?(void 0===o&&(o=new Wn(new qn(1,1,1),new Jn({name:"BackgroundCubeMaterial",uniforms:Xn(di.cube.uniforms),vertexShader:di.cube.vertexShader,fragmentShader:di.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(o)),o.material.uniforms.envMap.value=g,o.material.uniforms.flipEnvMap.value=g.isCubeTexture&&g._needsFlipEnvMap?-1:1,h===g&&u===g.version&&d===t.toneMapping||(o.material.needsUpdate=!0,h=g,u=g.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):g&&g.isTexture&&(void 0===a&&(a=new Wn(new ci(2,2),new Jn({name:"BackgroundMaterial",uniforms:Xn(di.background.uniforms),vertexShader:di.background.vertexShader,fragmentShader:di.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=g,!0===g.matrixAutoUpdate&&g.updateMatrix(),a.material.uniforms.uvTransform.value.copy(g.matrix),h===g&&u===g.version&&d===t.toneMapping||(a.material.needsUpdate=!0,h=g,u=g.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function mi(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 c=l;function h(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=c.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=c.newAttributes,a=c.enabledAttributes,o=c.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=c.newAttributes,n=c.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 y(){x(),c!==l&&(c=l,h(c.object))}function x(){l.geometry=null,l.program=null,l.wireframe=!1}return{setup:function(r,l,u,y,x){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 c=l[n.id];void 0===c&&(c={},l[n.id]=c);let h=c[a];void 0===h&&(h=d(i.isWebGL2?t.createVertexArray():s.createVertexArrayOES()),c[a]=h);return h}(y,u,l);c!==e&&(c=e,h(c.object)),_=function(t,e){const n=c.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 c.attributesNum!==r||c.index!==e}(y,x),_&&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++}c.attributes=n,c.attributesNum=r,c.index=e}(y,x)}else{const t=!0===l.wireframe;c.geometry===y.id&&c.program===u.id&&c.wireframe===t||(c.geometry=y.id,c.program=u.id,c.wireframe=t,_=!0)}!0===r.isInstancedMesh&&(_=!0),null!==x&&n.update(x,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,c=a.getAttributes(),h=s.defaultAttributeValues;for(const e in c){const i=c[e];if(i>=0){const s=l[e];if(void 0!==s){const e=s.normalized,r=s.itemSize,a=n.get(s);if(void 0===a)continue;const l=a.buffer,c=a.type,h=a.bytesPerElement;if(s.isInterleavedBufferAttribute){const n=s.data,a=n.stride,u=s.offset;n&&n.isInstancedInterleavedBuffer?(f(i,n.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=n.meshPerAttribute*n.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,a*h,u*h)}else s.isInstancedBufferAttribute?(f(i,s.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,0,0)}else if("instanceMatrix"===e){const e=n.get(r.instanceMatrix);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i+0,1),f(i+1,1),f(i+2,1),f(i+3,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i+0,4,a,!1,64,0),t.vertexAttribPointer(i+1,4,a,!1,64,16),t.vertexAttribPointer(i+2,4,a,!1,64,32),t.vertexAttribPointer(i+3,4,a,!1,64,48)}else if("instanceColor"===e){const e=n.get(r.instanceColor);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i,3,a,!1,12,0)}else if(void 0!==h){const n=h[e];if(void 0!==n)switch(n.length){case 2:t.vertexAttrib2fv(i,n);break;case 3:t.vertexAttrib3fv(i,n);break;case 4:t.vertexAttrib4fv(i,n);break;default:t.vertexAttrib1fv(i,n)}}}}g()}(r,l,u,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){y();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 fi(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,c;if(r)l=t,c="drawArraysInstanced";else if(l=e.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===l)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[c](s,i,a,o),n.update(a,s,o)}}function gi(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=!0===n.logarithmicDepthBuffer,c=t.getParameter(34930),h=t.getParameter(35660),u=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),m=t.getParameter(36347),f=t.getParameter(36348),g=t.getParameter(36349),v=h>0,y=s||e.has("OES_texture_float");return{isWebGL2:s,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:l,maxTextures:c,maxVertexTextures:h,maxTextureSize:u,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:m,maxVaryings:f,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:s?t.getParameter(36183):0}}function vi(t){const e=this;let n=null,i=0,r=!1,s=!1;const a=new Ne,o=new yt,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function h(t,n,i,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=i+4*s,r=n.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length<e)&&(c=new Float32Array(e));for(let e=0,n=i;e!==s;++e,n+=4)a.copy(t[e]).applyMatrix4(r,o),a.normal.toArray(c,n),c[n+3]=a.constant}l.value=c,l.needsUpdate=!0}return e.numPlanes=s,e.numIntersection=0,c}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=h(t,s,0),i=t.length,a},this.beginShadows=function(){s=!0,h(null)},this.endShadows=function(){s=!1,c()},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?h(null):c();else{const t=s?0:i,e=4*t;let r=m.clippingState||null;l.value=r,r=h(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 yi(t){let e=new WeakMap;function n(t,e){return e===a?t.mapping=r:e===o&&(t.mapping=s),t}function i(t){const n=t.target;n.removeEventListener("dispose",i);const r=e.get(n);void 0!==r&&(e.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping;if(s===a||s===o){if(e.has(r)){return n(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=t.getRenderTarget(),o=new ni(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}function xi(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")},get:function(t){const e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function _i(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(gn(n)>65535?dn:hn)(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 wi(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,c){if(0===c)return;let h,u;if(r)h=t,u="drawElementsInstanced";else if(h=e.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===h)return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");h[u](s,l,a,i*o,c),n.update(l,s,c)}}function bi(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)}}}}function Mi(t,e){return t[0]-e[0]}function Si(t,e){return Math.abs(e[1])-Math.abs(t[1])}function Ti(t){const e={},n=new Float32Array(8),i=[];for(let t=0;t<8;t++)i[t]=[t,0];return{update:function(r,s,a,o){const l=r.morphTargetInfluences,c=void 0===l?0:l.length;let h=e[s.id];if(void 0===h){h=[];for(let t=0;t<c;t++)h[t]=[t,0];e[s.id]=h}for(let t=0;t<c;t++){const e=h[t];e[0]=t,e[1]=l[t]}h.sort(Si);for(let t=0;t<8;t++)t<c&&h[t][1]?(i[t][0]=h[t][0],i[t][1]=h[t][1]):(i[t][0]=Number.MAX_SAFE_INTEGER,i[t][1]=0);i.sort(Mi);const u=a.morphTargets&&s.morphAttributes.position,d=a.morphNormals&&s.morphAttributes.normal;let p=0;for(let t=0;t<8;t++){const e=i[t],r=e[0],a=e[1];r!==Number.MAX_SAFE_INTEGER&&a?(u&&s.getAttribute("morphTarget"+t)!==u[r]&&s.setAttribute("morphTarget"+t,u[r]),d&&s.getAttribute("morphNormal"+t)!==d[r]&&s.setAttribute("morphNormal"+t,d[r]),n[t]=a,p+=a):(u&&!0===s.hasAttribute("morphTarget"+t)&&s.deleteAttribute("morphTarget"+t),d&&!0===s.hasAttribute("morphNormal"+t)&&s.deleteAttribute("morphNormal"+t),n[t]=0)}const m=s.morphTargetsRelative?1:1-p;o.getUniforms().setValue(t,"morphTargetBaseInfluence",m),o.getUniforms().setValue(t,"morphTargetInfluences",n)}}}function Ei(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}}}di.physical={uniforms:Yn([di.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new vt(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new tn(0)},transmission:{value:0},transmissionMap:{value:null}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag};class Ai extends bt{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=p,this.minFilter=p,this.wrapR=u,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}Ai.prototype.isDataTexture2DArray=!0;class Li extends bt{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=p,this.minFilter=p,this.wrapR=u,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}Li.prototype.isDataTexture3D=!0;const Ri=new bt,Ci=new Ai,Pi=new Li,Di=new ei,Ii=[],Ni=[],Bi=new Float32Array(16),zi=new Float32Array(9),Fi=new Float32Array(4);function Oi(t,e,n){const i=t[0];if(i<=0||i>0)return t;const r=e*n;let s=Ii[r];if(void 0===s&&(s=new Float32Array(r),Ii[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 Hi(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 Gi(t,e){for(let n=0,i=e.length;n<i;n++)t[n]=e[n]}function Ui(t,e){let n=Ni[e];void 0===n&&(n=new Int32Array(e),Ni[e]=n);for(let i=0;i!==e;++i)n[i]=t.allocateTextureUnit();return n}function ki(t,e){const n=this.cache;n[0]!==e&&(t.uniform1f(this.addr,e),n[0]=e)}function Vi(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(Hi(n,e))return;t.uniform2fv(this.addr,e),Gi(n,e)}}function Wi(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(Hi(n,e))return;t.uniform3fv(this.addr,e),Gi(n,e)}}function ji(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(Hi(n,e))return;t.uniform4fv(this.addr,e),Gi(n,e)}}function qi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix2fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;Fi.set(i),t.uniformMatrix2fv(this.addr,!1,Fi),Gi(n,i)}}function Xi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix3fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;zi.set(i),t.uniformMatrix3fv(this.addr,!1,zi),Gi(n,i)}}function Yi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix4fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;Bi.set(i),t.uniformMatrix4fv(this.addr,!1,Bi),Gi(n,i)}}function Zi(t,e){const n=this.cache;n[0]!==e&&(t.uniform1i(this.addr,e),n[0]=e)}function Ji(t,e){const n=this.cache;Hi(n,e)||(t.uniform2iv(this.addr,e),Gi(n,e))}function Qi(t,e){const n=this.cache;Hi(n,e)||(t.uniform3iv(this.addr,e),Gi(n,e))}function Ki(t,e){const n=this.cache;Hi(n,e)||(t.uniform4iv(this.addr,e),Gi(n,e))}function $i(t,e){const n=this.cache;n[0]!==e&&(t.uniform1ui(this.addr,e),n[0]=e)}function tr(t,e){const n=this.cache;Hi(n,e)||(t.uniform2uiv(this.addr,e),Gi(n,e))}function er(t,e){const n=this.cache;Hi(n,e)||(t.uniform3uiv(this.addr,e),Gi(n,e))}function nr(t,e){const n=this.cache;Hi(n,e)||(t.uniform4uiv(this.addr,e),Gi(n,e))}function ir(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTexture2D(e||Ri,r)}function rr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture3D(e||Pi,r)}function sr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTextureCube(e||Di,r)}function ar(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture2DArray(e||Ci,r)}function or(t,e){t.uniform1fv(this.addr,e)}function lr(t,e){const n=Oi(e,this.size,2);t.uniform2fv(this.addr,n)}function cr(t,e){const n=Oi(e,this.size,3);t.uniform3fv(this.addr,n)}function hr(t,e){const n=Oi(e,this.size,4);t.uniform4fv(this.addr,n)}function ur(t,e){const n=Oi(e,this.size,4);t.uniformMatrix2fv(this.addr,!1,n)}function dr(t,e){const n=Oi(e,this.size,9);t.uniformMatrix3fv(this.addr,!1,n)}function pr(t,e){const n=Oi(e,this.size,16);t.uniformMatrix4fv(this.addr,!1,n)}function mr(t,e){t.uniform1iv(this.addr,e)}function fr(t,e){t.uniform2iv(this.addr,e)}function gr(t,e){t.uniform3iv(this.addr,e)}function vr(t,e){t.uniform4iv(this.addr,e)}function yr(t,e){t.uniform1uiv(this.addr,e)}function xr(t,e){t.uniform2uiv(this.addr,e)}function _r(t,e){t.uniform3uiv(this.addr,e)}function wr(t,e){t.uniform4uiv(this.addr,e)}function br(t,e,n){const i=e.length,r=Ui(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTexture2D(e[t]||Ri,r[t])}function Mr(t,e,n){const i=e.length,r=Ui(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTextureCube(e[t]||Di,r[t])}function Sr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.setValue=function(t){switch(t){case 5126:return ki;case 35664:return Vi;case 35665:return Wi;case 35666:return ji;case 35674:return qi;case 35675:return Xi;case 35676:return Yi;case 5124:case 35670:return Zi;case 35667:case 35671:return Ji;case 35668:case 35672:return Qi;case 35669:case 35673:return Ki;case 5125:return $i;case 36294:return tr;case 36295:return er;case 36296:return nr;case 35678:case 36198:case 36298:case 36306:case 35682:return ir;case 35679:case 36299:case 36307:return rr;case 35680:case 36300:case 36308:case 36293:return sr;case 36289:case 36303:case 36311:case 36292:return ar}}(e.type)}function Tr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return or;case 35664:return lr;case 35665:return cr;case 35666:return hr;case 35674:return ur;case 35675:return dr;case 35676:return pr;case 5124:case 35670:return mr;case 35667:case 35671:return fr;case 35668:case 35672:return gr;case 35669:case 35673:return vr;case 5125:return yr;case 36294:return xr;case 36295:return _r;case 36296:return wr;case 35678:case 36198:case 36298:case 36306:case 35682:return br;case 35680:case 36300:case 36308:case 36293:return Mr}}(e.type)}function Er(t){this.id=t,this.seq=[],this.map={}}Tr.prototype.updateCache=function(t){const e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Gi(e,t)},Er.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 Ar=/(\w+)(\])?(\[|\.)?/g;function Lr(t,e){t.seq.push(e),t.map[e.id]=e}function Rr(t,e,n){const i=t.name,r=i.length;for(Ar.lastIndex=0;;){const s=Ar.exec(i),a=Ar.lastIndex;let o=s[1];const l="]"===s[2],c=s[3];if(l&&(o|=0),void 0===c||"["===c&&a+2===r){Lr(n,void 0===c?new Sr(o,t,e):new Tr(o,t,e));break}{let t=n.map[o];void 0===t&&(t=new Er(o),Lr(n,t)),n=t}}}function Cr(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);Rr(n,t.getUniformLocation(e,n.name),this)}}function Pr(t,e,n){const i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),i}Cr.prototype.setValue=function(t,e,n,i){const r=this.map[e];void 0!==r&&r.setValue(t,n,i)},Cr.prototype.setOptional=function(t,e,n){const i=e[n];void 0!==i&&this.setValue(t,n,i)},Cr.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)}},Cr.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 Dr=0;function Ir(t){switch(t){case X:return["Linear","( value )"];case Y:return["sRGB","( value )"];case J:return["RGBE","( value )"];case Q:return["RGBM","( value, 7.0 )"];case K:return["RGBM","( value, 16.0 )"];case $:return["RGBD","( value, 256.0 )"];case Z:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}function Nr(t,e,n){const i=t.getShaderParameter(e,35713),r=t.getShaderInfoLog(e).trim();if(i&&""===r)return"";return"THREE.WebGLShader: gl.getShaderInfoLog() "+n+"\n"+r+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 Br(t,e){const n=Ir(e);return"vec4 "+t+"( vec4 value ) { return "+n[0]+"ToLinear"+n[1]+"; }"}function zr(t,e){const n=Ir(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+n[0]+n[1]+"; }"}function Fr(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 Hr(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 Gr(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 kr(t){return t.replace(Ur,Vr)}function Vr(t,e){const n=hi[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return kr(n)}const Wr=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,jr=/#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 qr(t){return t.replace(jr,Yr).replace(Wr,Xr)}function Xr(t,e,n,i){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Yr(t,e,n,i)}function Yr(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 Zr(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 Jr(t,e,n,i){const a=t.getContext(),o=n.defines;let h=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 r:case s:e="ENVMAP_TYPE_CUBE";break;case l:case c:e="ENVMAP_TYPE_CUBE_UV"}return e}(n),m=function(t){let e="ENVMAP_MODE_REFLECTION";if(t.envMap)switch(t.envMapMode){case s:case c: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=t.gammaFactor>0?t.gammaFactor:1,v=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.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Or).join("\n")}(n),y=function(t){const e=[];for(const n in t){const i=t[n];!1!==i&&e.push("#define "+n+" "+i)}return e.join("\n")}(o),x=a.createProgram();let _,w,b=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?(_=[y].filter(Or).join("\n"),_.length>0&&(_+="\n"),w=[v,y].filter(Or).join("\n"),w.length>0&&(w+="\n")):(_=[Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+g,"#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.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",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.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","#ifdef USE_MORPHTARGETS","\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"),w=[v,Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+g,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.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",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?hi.tonemapping_pars_fragment:"",0!==n.toneMapping?Fr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",hi.encodings_pars_fragment,n.map?Br("mapTexelToLinear",n.mapEncoding):"",n.matcap?Br("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Br("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Br("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Br("lightMapTexelToLinear",n.lightMapEncoding):"",zr("linearToOutputTexel",n.outputEncoding),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Or).join("\n")),h=kr(h),h=Hr(h,n),h=Gr(h,n),u=kr(u),u=Hr(u,n),u=Gr(u,n),h=qr(h),u=qr(u),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(b="#version 300 es\n",_=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,w=["#define varying in",n.glslVersion===it?"":"out highp vec4 pc_fragColor;",n.glslVersion===it?"":"#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"+w);const M=b+w+u,S=Pr(a,35633,b+_+h),T=Pr(a,35632,M);if(a.attachShader(x,S),a.attachShader(x,T),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(T).trim();let i=!0,r=!0;if(!1===a.getProgramParameter(x,35714)){i=!1;const e=Nr(a,S,"vertex"),n=Nr(a,T,"fragment");console.error("THREE.WebGLProgram: shader error: ",a.getError(),"35715",a.getProgramParameter(x,35715),"gl.getProgramInfoLog",t,e,n)}else""!==t?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",t):""!==e&&""!==n||(r=!1);r&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:n,prefix:w}})}let E,A;return a.deleteShader(S),a.deleteShader(T),this.getUniforms=function(){return void 0===E&&(E=new Cr(a,x)),E},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).name;n[i]=t.getAttribLocation(e,i)}return n}(a,x)),A},this.destroy=function(){i.releaseStatesOfProgram(this),a.deleteProgram(x),this.program=void 0},this.name=n.shaderName,this.id=Dr++,this.cacheKey=e,this.usedTimes=1,this.program=x,this.vertexShader=S,this.fragmentShader=T,this}function Qr(t,e,n,i,r,s){const a=[],o=i.isWebGL2,h=i.logarithmicDepthBuffer,u=i.floatVertexTextures,d=i.maxVertexUniforms,p=i.vertexTextures;let m=i.precision;const f={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"},g=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","instancingColor","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","vertexAlphas","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","sheen","transmissionMap"];function v(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=X,e}return{getParameters:function(r,a,g,y,x){const _=y.fog,w=r.isMeshStandardMaterial?y.environment:null,b=e.get(r.envMap||w),M=f[r.type],S=x.isSkinnedMesh?function(t){const e=t.skeleton.bones;if(u)return 1024;{const t=d,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}}(x):0;let T,E;if(null!==r.precision&&(m=i.getMaxPrecision(r.precision),m!==r.precision&&console.warn("THREE.WebGLProgram.getParameters:",r.precision,"not supported, using",m,"instead.")),M){const t=di[M];T=t.vertexShader,E=t.fragmentShader}else T=r.vertexShader,E=r.fragmentShader;const A=t.getRenderTarget();return{isWebGL2:o,shaderID:M,shaderName:r.type,vertexShader:T,fragmentShader:E,defines:r.defines,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:m,instancing:!0===x.isInstancedMesh,instancingColor:!0===x.isInstancedMesh&&null!==x.instanceColor,supportsVertexTextures:p,outputEncoding:null!==A?v(A.texture):t.outputEncoding,map:!!r.map,mapEncoding:v(r.map),matcap:!!r.matcap,matcapEncoding:v(r.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:v(b),envMapCubeUV:!!b&&(b.mapping===l||b.mapping===c),lightMap:!!r.lightMap,lightMapEncoding:v(r.lightMap),aoMap:!!r.aoMap,emissiveMap:!!r.emissiveMap,emissiveMapEncoding:v(r.emissiveMap),bumpMap:!!r.bumpMap,normalMap:!!r.normalMap,objectSpaceNormalMap:1===r.normalMapType,tangentSpaceNormalMap:0===r.normalMapType,clearcoatMap:!!r.clearcoatMap,clearcoatRoughnessMap:!!r.clearcoatRoughnessMap,clearcoatNormalMap:!!r.clearcoatNormalMap,displacementMap:!!r.displacementMap,roughnessMap:!!r.roughnessMap,metalnessMap:!!r.metalnessMap,specularMap:!!r.specularMap,alphaMap:!!r.alphaMap,gradientMap:!!r.gradientMap,sheen:!!r.sheen,transmissionMap:!!r.transmissionMap,combine:r.combine,vertexTangents:r.normalMap&&r.vertexTangents,vertexColors:r.vertexColors,vertexAlphas:!0===r.vertexColors&&x.geometry&&x.geometry.attributes.color&&4===x.geometry.attributes.color.itemSize,vertexUvs:!!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatMap||r.clearcoatRoughnessMap||r.clearcoatNormalMap||r.displacementMap||r.transmissionMap),uvsVertexOnly:!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatNormalMap||r.transmissionMap||!r.displacementMap),fog:!!_,useFog:r.fog,fogExp2:_&&_.isFogExp2,flatShading:!!r.flatShading,sizeAttenuation:r.sizeAttenuation,logarithmicDepthBuffer:h,skinning:r.skinning&&S>0,maxBones:S,useVertexTexture:u,morphTargets:r.morphTargets,morphNormals:r.morphNormals,numDirLights:a.directional.length,numPointLights:a.point.length,numSpotLights:a.spot.length,numRectAreaLights:a.rectArea.length,numHemiLights:a.hemi.length,numDirLightShadows:a.directionalShadowMap.length,numPointLightShadows:a.pointShadowMap.length,numSpotLightShadows:a.spotShadowMap.length,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:r.dithering,shadowMapEnabled:t.shadowMap.enabled&&g.length>0,shadowMapType:t.shadowMap.type,toneMapping:r.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:o||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:o||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:o||n.has("EXT_shader_texture_lod"),customProgramCacheKey:r.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t<g.length;t++)n.push(e[g[t]]);n.push(t.outputEncoding),n.push(t.gammaFactor)}return n.push(e.customProgramCacheKey),n.join()},getUniforms:function(t){const e=f[t.type];let n;if(e){const t=di[e];n=Zn.clone(t.uniforms)}else n=t.uniforms;return n},acquireProgram:function(e,n){let i;for(let t=0,e=a.length;t<e;t++){const e=a[t];if(e.cacheKey===n){i=e,++i.usedTimes;break}}return void 0===i&&(i=new Jr(t,n,e,r),a.push(i)),i},releaseProgram:function(t){if(0==--t.usedTimes){const e=a.indexOf(t);a[e]=a[a.length-1],a.pop(),t.destroy()}},programs:a}}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 $r(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program!==e.program?t.program.id-e.program.id: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 ts(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 es(t){const e=[];let n=0;const i=[],r=[],s={id:-1};function a(i,r,a,o,l,c){let h=e[n];const u=t.get(a);return void 0===h?(h={id:i.id,object:i,geometry:r,material:a,program:u.program||s,groupOrder:o,renderOrder:i.renderOrder,z:l,group:c},e[n]=h):(h.id=i.id,h.object=i,h.geometry=r,h.material=a,h.program=u.program||s,h.groupOrder=o,h.renderOrder=i.renderOrder,h.z=l,h.group=c),n++,h}return{opaque:i,transparent:r,init:function(){n=0,i.length=0,r.length=0},push:function(t,e,n,s,o,l){const c=a(t,e,n,s,o,l);(!0===n.transparent?r:i).push(c)},unshift:function(t,e,n,s,o,l){const c=a(t,e,n,s,o,l);(!0===n.transparent?r:i).unshift(c)},finish:function(){for(let t=n,i=e.length;t<i;t++){const n=e[t];if(null===n.id)break;n.id=null,n.object=null,n.geometry=null,n.material=null,n.program=null,n.group=null}},sort:function(t,e){i.length>1&&i.sort(t||$r),r.length>1&&r.sort(e||ts)}}}function ns(t){let e=new WeakMap;return{get:function(n,i){let r;return!1===e.has(n)?(r=new es(t),e.set(n,[r])):i>=e.get(n).length?(r=new es(t),e.get(n).push(r)):r=e.get(n)[i],r},dispose:function(){e=new WeakMap}}}function is(){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 Lt,color:new tn};break;case"SpotLight":n={position:new Lt,direction:new Lt,color:new tn,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Lt,color:new tn,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Lt,skyColor:new tn,groundColor:new tn};break;case"RectAreaLight":n={color:new tn,position:new Lt,halfWidth:new Lt,halfHeight:new Lt}}return t[e.id]=n,n}}}let rs=0;function ss(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function as(t,e){const n=new is,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 vt};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,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 Lt);const s=new Lt,a=new se,o=new se;return{setup:function(s){let a=0,o=0,l=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let c=0,h=0,u=0,d=0,p=0,m=0,f=0,g=0;s.sort(ss);for(let t=0,e=s.length;t<e;t++){const e=s[t],v=e.color,y=e.intensity,x=e.distance,_=e.shadow&&e.shadow.map?e.shadow.map.texture:null;if(e.isAmbientLight)a+=v.r*y,o+=v.g*y,l+=v.b*y;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),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]=_,r.directionalShadowMatrix[c]=e.shadow.matrix,m++}r.directional[c]=t,c++}else if(e.isSpotLight){const t=n.get(e);if(t.position.setFromMatrixPosition(e.matrixWorld),t.color.copy(v).multiplyScalar(y),t.distance=x,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[u]=n,r.spotShadowMap[u]=_,r.spotShadowMatrix[u]=e.shadow.matrix,g++}r.spot[u]=t,u++}else if(e.isRectAreaLight){const t=n.get(e);t.color.copy(v).multiplyScalar(y),t.halfWidth.set(.5*e.width,0,0),t.halfHeight.set(0,.5*e.height,0),r.rectArea[d]=t,d++}else if(e.isPointLight){const t=n.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity),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[h]=n,r.pointShadowMap[h]=_,r.pointShadowMatrix[h]=e.shadow.matrix,f++}r.point[h]=t,h++}else if(e.isHemisphereLight){const t=n.get(e);t.skyColor.copy(e.color).multiplyScalar(y),t.groundColor.copy(e.groundColor).multiplyScalar(y),r.hemi[p]=t,p++}}d>0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=ui.LTC_FLOAT_1,r.rectAreaLTC2=ui.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=ui.LTC_HALF_1,r.rectAreaLTC2=ui.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=a,r.ambient[1]=o,r.ambient[2]=l;const v=r.hash;v.directionalLength===c&&v.pointLength===h&&v.spotLength===u&&v.rectAreaLength===d&&v.hemiLength===p&&v.numDirectionalShadows===m&&v.numPointShadows===f&&v.numSpotShadows===g||(r.directional.length=c,r.spot.length=u,r.rectArea.length=d,r.point.length=h,r.hemi.length=p,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=f,r.pointShadowMap.length=f,r.spotShadow.length=g,r.spotShadowMap.length=g,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=f,r.spotShadowMatrix.length=g,v.directionalLength=c,v.pointLength=h,v.spotLength=u,v.rectAreaLength=d,v.hemiLength=p,v.numDirectionalShadows=m,v.numPointShadows=f,v.numSpotShadows=g,r.version=rs++)},setupView:function(t,e){let n=0,i=0,l=0,c=0,h=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[c];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),c++}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[h];t.direction.setFromMatrixPosition(d.matrixWorld),t.direction.transformDirection(u),t.direction.normalize(),h++}}},state:r}}function os(t,e){const n=new as(t,e),i=[],r=[];return{init:function(){i.length=0,r.length=0},state:{lightsArray:i,shadowsArray:r,lights:n},setupLights:function(){n.setup(i)},setupLightsView:function(t){n.setupView(i,t)},pushLight:function(t){i.push(t)},pushShadow:function(t){r.push(t)}}}function ls(t,e){let n=new WeakMap;return{get:function(i,r=0){let s;return!1===n.has(i)?(s=new os(t,e),n.set(i,[s])):r>=n.get(i).length?(s=new os(t,e),n.get(i).push(s)):s=n.get(i)[r],s},dispose:function(){n=new WeakMap}}}class cs extends Xe{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,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 hs extends Xe{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Lt,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}hs.prototype.isMeshDistanceMaterial=!0;function us(t,e,n){let i=new ai;const r=new vt,s=new vt,a=new St,o=[],l=[],c={},h=n.maxTextureSize,u={0:1,1:0,2:2},d=new Jn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},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\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 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, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),m=d.clone();m.defines.HORIZONTAL_PASS=1;const f=new En;f.setAttribute("position",new sn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new Wn(f,d),y=this;function x(n,i){const r=e.update(v);d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,r,d,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 _(t,e,n){const i=t<<0|e<<1|n<<2;let r=o[i];return void 0===r&&(r=new cs({depthPacking:3201,morphTargets:t,skinning:e}),o[i]=r),r}function w(t,e,n){const i=t<<0|e<<1|n<<2;let r=l[i];return void 0===r&&(r=new hs({morphTargets:t,skinning:e}),l[i]=r),r}function b(e,n,i,r,s,a,o){let l=null,h=_,d=e.customDepthMaterial;if(!0===r.isPointLight&&(h=w,d=e.customDistanceMaterial),void 0===d){let t=!1;!0===i.morphTargets&&(t=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0);let r=!1;!0===e.isSkinnedMesh&&(!0===i.skinning?r=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e));l=h(t,r,!0===e.isInstancedMesh)}else l=d;if(t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length){const t=l.uuid,e=i.uuid;let n=c[t];void 0===n&&(n={},c[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=3===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===r.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(r.matrixWorld),l.nearDistance=s,l.farDistance=a),l}function M(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,c=e.length;l<c;l++){const c=e[l],h=r[c.materialIndex];if(h&&h.visible){const e=b(n,i,h,a,s.near,s.far,o);t.renderBufferDirect(s,null,i,e,n,c)}}}else if(r.visible){const e=b(n,i,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++)M(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===y.enabled)return;if(!1===y.autoUpdate&&!1===y.needsUpdate)return;if(0===e.length)return;const l=t.getRenderTarget(),c=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),d=t.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let l=0,c=e.length;l<c;l++){const c=e[l],u=c.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",c,"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>h||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:g,magFilter:g,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Tt(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:p,magFilter:p,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t<f;t++){const e=u.getViewport(t);a.set(s.x*e.x,s.y*e.y,s.x*e.z,s.y*e.w),d.viewport(a),u.updateMatrices(c,t),i=u.getFrustum(),M(n,o,u.camera,c,this.type)}u.isPointLightShadow||3!==this.type||x(u,o),u.needsUpdate=!1}y.needsUpdate=!1,t.setRenderTarget(l,c,u)}}function ds(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?z(2929):F(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: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);break;default:t.depthFunc(515)}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,c=null;return{setTest:function(t){e||(t?z(2960):F(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){c!==e&&(t.clearStencil(e),c=e)},reset:function(){e=!1,n=null,i=null,r=null,s=null,a=null,o=null,l=null,c=null}}};let l={},c=null,h={},u=null,d=!1,p=null,m=null,f=null,g=null,v=null,y=null,x=null,_=!1,w=null,b=null,M=null,S=null,T=null;const E=t.getParameter(35661);let A=!1,L=0;const R=t.getParameter(7938);-1!==R.indexOf("WebGL")?(L=parseFloat(/^WebGL (\d)/.exec(R)[1]),A=L>=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);let C=null,P={};const D=new St(0,0,t.canvas.width,t.canvas.height),I=new St(0,0,t.canvas.width,t.canvas.height);function N(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 B={};function z(e){!0!==l[e]&&(t.enable(e),l[e]=!0)}function F(e){!1!==l[e]&&(t.disable(e),l[e]=!1)}B[3553]=N(3553,3553,1),B[34067]=N(34067,34069,6),s.setClear(0,0,0,1),a.setClear(1),o.setClear(0),z(2929),a.setFunc(3),U(!1),k(1),z(2884),G(0);const O={[n]:32774,101:32778,102:32779};if(r)O[103]=32775,O[104]=32776;else{const t=e.get("EXT_blend_minmax");null!==t&&(O[103]=t.MIN_EXT,O[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 G(e,i,r,s,a,o,l,c){if(0!==e){if(!1===d&&(z(3042),d=!0),5===e)a=a||i,o=o||r,l=l||s,i===m&&a===v||(t.blendEquationSeparate(O[i],O[a]),m=i,v=a),r===f&&s===g&&o===y&&l===x||(t.blendFuncSeparate(H[r],H[s],H[o],H[l]),f=r,g=s,y=o,x=l),p=e,_=null;else if(e!==p||c!==_){if(m===n&&v===n||(t.blendEquation(32774),m=n,v=n),c)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)}f=null,g=null,y=null,x=null,p=e,_=c}}else!0===d&&(F(3042),d=!1)}function U(e){w!==e&&(e?t.frontFace(2304):t.frontFace(2305),w=e)}function k(e){0!==e?(z(2884),e!==b&&(1===e?t.cullFace(1029):2===e?t.cullFace(1028):t.cullFace(1032))):F(2884),b=e}function V(e,n,i){e?(z(32823),S===n&&T===i||(t.polygonOffset(n,i),S=n,T=i)):F(32823)}function W(e){void 0===e&&(e=33984+E-1),C!==e&&(t.activeTexture(e),C=e)}return{buffers:{color:s,depth:a,stencil:o},enable:z,disable:F,bindFramebuffer:function(e,n){null===n&&null!==c&&(n=c),h[e]!==n&&(t.bindFramebuffer(e,n),h[e]=n,r&&(36009===e&&(h[36160]=n),36160===e&&(h[36009]=n)))},bindXRFramebuffer:function(e){e!==c&&(t.bindFramebuffer(36160,e),c=e)},useProgram:function(e){return u!==e&&(t.useProgram(e),u=e,!0)},setBlending:G,setMaterial:function(t,e){2===t.side?F(2884):z(2884);let n=1===t.side;e&&(n=!n),U(n),1===t.blending&&!1===t.transparent?G(0):G(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)),V(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits),!0===t.alphaToCoverage?z(32926):F(32926)},setFlipSided:U,setCullFace:k,setLineWidth:function(e){e!==M&&(A&&t.lineWidth(e),M=e)},setPolygonOffset:V,setScissorTest:function(t){t?z(3089):F(3089)},activeTexture:W,bindTexture:function(e,n){null===C&&W();let i=P[C];void 0===i&&(i={type:void 0,texture:void 0},P[C]=i),i.type===e&&i.texture===n||(t.bindTexture(e,n||B[e]),i.type=e,i.texture=n)},unbindTexture:function(){const e=P[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)}},scissor:function(e){!1===D.equals(e)&&(t.scissor(e.x,e.y,e.z,e.w),D.copy(e))},viewport:function(e){!1===I.equals(e)&&(t.viewport(e.x,e.y,e.z,e.w),I.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,P={},c=null,h={},u=null,d=!1,p=null,m=null,f=null,g=null,v=null,y=null,x=null,_=!1,w=null,b=null,M=null,S=null,T=null,D.set(0,0,t.canvas.width,t.canvas.height),I.set(0,0,t.canvas.width,t.canvas.height),s.reset(),a.reset(),o.reset()}}}function ps(t,e,n,i,r,s,a){const o=r.isWebGL2,l=r.maxTextures,c=r.maxCubemapSize,x=r.maxTextureSize,R=r.maxSamples,C=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):document.createElementNS("http://www.w3.org/1999/xhtml","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?ft: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 B(t){return pt(t.width)&&pt(t.height)}function z(t,e){return t.generateMipmaps&&e&&t.minFilter!==p&&t.minFilter!==g}function F(e,n,r,s){t.generateMipmap(e);i.get(n).__maxMipLevel=Math.log2(Math.max(r,s))}function O(n,i,r){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 s=i;return 6403===i&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===i&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===i&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function H(t){return t===p||t===m||t===f?9728:9729}function G(e){const n=e.target;n.removeEventListener("dispose",G),function(e){const n=i.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),i.remove(e)}(n),n.isVideoTexture&&C.delete(n),a.memory.textures--}function U(e){const n=e.target;n.removeEventListener("dispose",U),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);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);i.remove(n),i.remove(e)}(n),a.memory.textures--}let k=0;function V(t,e){const r=i.get(t);if(t.isVideoTexture&&function(t){const e=a.render.frame;C.get(t)!==e&&(C.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 Z(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 W(e,r){const a=i.get(e);e.version>0&&a.__version!==e.version?function(e,i,r){if(6!==i.image.length)return;Y(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,c);const u=h[0],d=B(u)||o,p=s.convert(i.format),m=s.convert(i.type),f=O(i.internalFormat,p,m);let g;if(X(34067,i,d),a){for(let t=0;t<6;t++){g=h[t].mipmaps;for(let e=0;e<g.length;e++){const r=g[e];i.format!==E&&i.format!==T?null!==p?n.compressedTexImage2D(34069+t,e,f,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):n.texImage2D(34069+t,e,f,r.width,r.height,0,p,m,r.data)}}e.__maxMipLevel=g.length-1}else{g=i.mipmaps;for(let t=0;t<6;t++)if(l){n.texImage2D(34069+t,0,f,h[t].width,h[t].height,0,p,m,h[t].data);for(let e=0;e<g.length;e++){const i=g[e].image[t].image;n.texImage2D(34069+t,e+1,f,i.width,i.height,0,p,m,i.data)}}else{n.texImage2D(34069+t,0,f,p,m,h[t]);for(let e=0;e<g.length;e++){const i=g[e];n.texImage2D(34069+t,e+1,f,p,m,i.image[t])}}e.__maxMipLevel=g.length}z(i,d)&&F(34067,i,u.width,u.height);e.__version=i.version,i.onUpdate&&i.onUpdate(i)}(a,e,r):(n.activeTexture(33984+r),n.bindTexture(34067,a.__webglTexture))}const j={[h]:10497,[u]:33071,[d]:33648},q={[p]:9728,[m]:9984,[f]:9986,[g]:9729,[v]:9985,[y]:9987};function X(n,s,a){if(a?(t.texParameteri(n,10242,j[s.wrapS]),t.texParameteri(n,10243,j[s.wrapT]),32879!==n&&35866!==n||t.texParameteri(n,32882,j[s.wrapR]),t.texParameteri(n,10240,q[s.magFilter]),t.texParameteri(n,10241,q[s.minFilter])):(t.texParameteri(n,10242,33071),t.texParameteri(n,10243,33071),32879!==n&&35866!==n||t.texParameteri(n,32882,33071),s.wrapS===u&&s.wrapT===u||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,H(s.magFilter)),t.texParameteri(n,10241,H(s.minFilter)),s.minFilter!==p&&s.minFilter!==g&&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===b&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===M&&!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 Y(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",G),e.__webglTexture=t.createTexture(),a.memory.textures++)}function Z(e,i,r){let a=3553;i.isDataTexture2DArray&&(a=35866),i.isDataTexture3D&&(a=32879),Y(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!==u||t.wrapT!==u||t.minFilter!==p&&t.minFilter!==g)}(i)&&!1===B(i.image),c=N(i.image,l,!1,x),h=B(c)||o,d=s.convert(i.format);let m,f=s.convert(i.type),v=O(i.internalFormat,d,f);X(a,i,h);const y=i.mipmaps;if(i.isDepthTexture)v=6402,o?v=i.type===b?36012:i.type===w?33190:i.type===S?35056:33189:i.type===b&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),i.format===A&&6402===v&&i.type!==_&&i.type!==w&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=_,f=s.convert(i.type)),i.format===L&&6402===v&&(v=34041,i.type!==S&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=S,f=s.convert(i.type))),n.texImage2D(3553,0,v,c.width,c.height,0,d,f,null);else if(i.isDataTexture)if(y.length>0&&h){for(let t=0,e=y.length;t<e;t++)m=y[t],n.texImage2D(3553,t,v,m.width,m.height,0,d,f,m.data);i.generateMipmaps=!1,e.__maxMipLevel=y.length-1}else n.texImage2D(3553,0,v,c.width,c.height,0,d,f,c.data),e.__maxMipLevel=0;else if(i.isCompressedTexture){for(let t=0,e=y.length;t<e;t++)m=y[t],i.format!==E&&i.format!==T?null!==d?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()"):n.texImage2D(3553,t,v,m.width,m.height,0,d,f,m.data);e.__maxMipLevel=y.length-1}else if(i.isDataTexture2DArray)n.texImage3D(35866,0,v,c.width,c.height,c.depth,0,d,f,c.data),e.__maxMipLevel=0;else if(i.isDataTexture3D)n.texImage3D(32879,0,v,c.width,c.height,c.depth,0,d,f,c.data),e.__maxMipLevel=0;else if(y.length>0&&h){for(let t=0,e=y.length;t<e;t++)m=y[t],n.texImage2D(3553,t,v,d,f,m);i.generateMipmaps=!1,e.__maxMipLevel=y.length-1}else n.texImage2D(3553,0,v,d,f,c),e.__maxMipLevel=0;z(i,h)&&F(a,i,c.width,c.height),e.__version=i.version,i.onUpdate&&i.onUpdate(i)}function J(e,r,a,o){const l=r.texture,c=s.convert(l.format),h=s.convert(l.type),u=O(l.internalFormat,c,h);32879===o||35866===o?n.texImage3D(o,0,u,r.width,r.height,r.depth,0,c,h,null):n.texImage2D(o,0,u,r.width,r.height,0,c,h,null),n.bindFramebuffer(36160,e),t.framebufferTexture2D(36160,a,o,i.get(l).__webglTexture,0),n.bindFramebuffer(36160,null)}function Q(e,n,i){if(t.bindRenderbuffer(36161,e),n.depthBuffer&&!n.stencilBuffer){let r=33189;if(i){const e=n.depthTexture;e&&e.isDepthTexture&&(e.type===b?r=36012:e.type===w&&(r=33190));const i=$(n);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){if(i){const e=$(n);t.renderbufferStorageMultisample(36161,e,35056,n.width,n.height)}else t.renderbufferStorage(36161,34041,n.width,n.height);t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=n.texture,r=s.convert(e.format),a=s.convert(e.type),o=O(e.internalFormat,r,a);if(i){const e=$(n);t.renderbufferStorageMultisample(36161,e,o,n.width,n.height)}else t.renderbufferStorage(36161,o,n.width,n.height)}t.bindRenderbuffer(36161,null)}function K(e){const r=i.get(e),s=!0===e.isWebGLCubeRenderTarget;if(e.depthTexture){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),V(r.depthTexture,0);const s=i.get(r.depthTexture).__webglTexture;if(r.depthTexture.format===A)t.framebufferTexture2D(36160,36096,3553,s,0);else{if(r.depthTexture.format!==L)throw new Error("Unknown depthTexture format");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(),Q(r.__webglDepthbuffer[i],e,!1)}else n.bindFramebuffer(36160,r.__webglFramebuffer),r.__webglDepthbuffer=t.createRenderbuffer(),Q(r.__webglDepthbuffer,e,!1);n.bindFramebuffer(36160,null)}function $(t){return o&&t.isWebGLMultisampleRenderTarget?Math.min(R,t.samples):0}let tt=!1,et=!1;this.allocateTextureUnit=function(){const t=k;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),k+=1,t},this.resetTextureUnits=function(){k=0},this.setTexture2D=V,this.setTexture2DArray=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(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?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,r.__webglTexture))},this.setTextureCube=W,this.setupRenderTarget=function(e){const r=e.texture,l=i.get(e),c=i.get(r);e.addEventListener("dispose",U),c.__webglTexture=t.createTexture(),c.__version=r.version,a.memory.textures++;const h=!0===e.isWebGLCubeRenderTarget,u=!0===e.isWebGLMultisampleRenderTarget,d=r.isDataTexture3D||r.isDataTexture2DArray,p=B(e)||o;if(!o||r.format!==T||r.type!==b&&r.type!==M||(r.format=E,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),h){l.__webglFramebuffer=[];for(let e=0;e<6;e++)l.__webglFramebuffer[e]=t.createFramebuffer()}else if(l.__webglFramebuffer=t.createFramebuffer(),u)if(o){l.__webglMultisampledFramebuffer=t.createFramebuffer(),l.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,l.__webglColorRenderbuffer);const i=s.convert(r.format),a=s.convert(r.type),o=O(r.internalFormat,i,a),c=$(e);t.renderbufferStorageMultisample(36161,c,o,e.width,e.height),n.bindFramebuffer(36160,l.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,l.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(l.__webglDepthRenderbuffer=t.createRenderbuffer(),Q(l.__webglDepthRenderbuffer,e,!0)),n.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(h){n.bindTexture(34067,c.__webglTexture),X(34067,r,p);for(let t=0;t<6;t++)J(l.__webglFramebuffer[t],e,36064,34069+t);z(r,p)&&F(34067,r,e.width,e.height),n.bindTexture(34067,null)}else{let t=3553;if(d)if(o){t=r.isDataTexture3D?32879:35866}else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");n.bindTexture(t,c.__webglTexture),X(t,r,p),J(l.__webglFramebuffer,e,36064,t),z(r,p)&&F(3553,r,e.width,e.height),n.bindTexture(3553,null)}e.depthBuffer&&K(e)},this.updateRenderTargetMipmap=function(t){const e=t.texture;if(z(e,B(t)||o)){const r=t.isWebGLCubeRenderTarget?34067:3553,s=i.get(e).__webglTexture;n.bindTexture(r,s),F(r,e,t.width,t.height),n.bindTexture(r,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(o){const r=e.width,s=e.height;let a=16384;e.depthBuffer&&(a|=256),e.stencilBuffer&&(a|=1024);const o=i.get(e);n.bindFramebuffer(36008,o.__webglMultisampledFramebuffer),n.bindFramebuffer(36009,o.__webglFramebuffer),t.blitFramebuffer(0,0,r,s,0,0,r,s,a,9728),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,o.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===tt&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),tt=!0),t=t.texture),V(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===et&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),et=!0),t=t.texture),W(t,e)}}function ms(t,e,n){const i=n.isWebGL2;return{convert:function(t){let n;if(t===x)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===_)return 5123;if(1013===t)return 5124;if(t===w)return 5125;if(t===b)return 5126;if(t===M)return i?5131:(n=e.get("OES_texture_half_float"),null!==n?n.HALF_FLOAT_OES:null);if(1021===t)return 6406;if(t===T)return 6407;if(t===E)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===A)return 6402;if(t===L)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(t===R||t===C||t===P||t===D){if(n=e.get("WEBGL_compressed_texture_s3tc"),null===n)return null;if(t===R)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(t===C)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(t===P)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(t===D)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(t===I||t===N||t===B||t===z){if(n=e.get("WEBGL_compressed_texture_pvrtc"),null===n)return null;if(t===I)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(t===N)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(t===B)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(t===z)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((t===F||t===O)&&(n=e.get("WEBGL_compressed_texture_etc"),null!==n)){if(t===F)return n.COMPRESSED_RGB8_ETC2;if(t===O)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===S?i?34042:(n=e.get("WEBGL_depth_texture"),null!==n?n.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}class fs extends Kn{constructor(t=[]){super(),this.cameras=t}}fs.prototype.isArrayCamera=!0;class gs extends Ce{constructor(){super(),this.type="Group"}}gs.prototype.isGroup=!0;const vs={type:"move"};class ys{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new gs,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 gs,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Lt,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Lt),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new gs,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Lt,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Lt),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(vs))),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 gs;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,c=.005;l.inputState.pinching&&a>o+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(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 xs extends rt{constructor(t,e){super();const n=this,i=t.state;let r=null,s=1,a=null,o="local-floor",l=null;const c=[],h=new Map,u=new Kn;u.layers.enable(1),u.viewport=new St;const d=new Kn;d.layers.enable(2),d.viewport=new St;const p=[u,d],m=new fs;m.layers.enable(1),m.layers.enable(2);let f=null,g=null;function v(t){const e=h.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function y(){h.forEach((function(t,e){t.disconnect(e)})),h.clear(),f=null,g=null,i.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function x(t){const e=r.inputSources;for(let t=0;t<c.length;t++)h.set(e[t],c[t]);for(let e=0;e<t.removed.length;e++){const n=t.removed[e],i=h.get(n);i&&(i.dispatchEvent({type:"disconnected",data:n}),h.delete(n))}for(let e=0;e<t.added.length;e++){const n=t.added[e],i=h.get(n);i&&i.dispatchEvent({type:"connected",data:n})}}this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getGripSpace()},this.getHand=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){s=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){o=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return a},this.getSession=function(){return r},this.setSession=async function(t){if(r=t,null!==r){r.addEventListener("select",v),r.addEventListener("selectstart",v),r.addEventListener("selectend",v),r.addEventListener("squeeze",v),r.addEventListener("squeezestart",v),r.addEventListener("squeezeend",v),r.addEventListener("end",y),r.addEventListener("inputsourceschange",x);const t=e.getContextAttributes();!0!==t.xrCompatible&&await e.makeXRCompatible();const i={antialias:t.antialias,alpha:t.alpha,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:s},l=new XRWebGLLayer(r,e,i);r.updateRenderState({baseLayer:l}),a=await r.requestReferenceSpace(o),S.setContext(r),S.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}};const _=new Lt,w=new Lt;function b(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.getCamera=function(t){m.near=d.near=u.near=t.near,m.far=d.far=u.far=t.far,f===m.near&&g===m.far||(r.updateRenderState({depthNear:m.near,depthFar:m.far}),f=m.near,g=m.far);const e=t.parent,n=m.cameras;b(m,e);for(let t=0;t<n.length;t++)b(n[t],e);t.matrixWorld.copy(m.matrixWorld),t.matrix.copy(m.matrix),t.matrix.decompose(t.position,t.quaternion,t.scale);const i=t.children;for(let t=0,e=i.length;t<e;t++)i[t].updateMatrixWorld(!0);return 2===n.length?function(t,e,n){_.setFromMatrixPosition(e.matrixWorld),w.setFromMatrixPosition(n.matrixWorld);const i=_.distanceTo(w),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],c=(r[9]-1)/r[5],h=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=a*h,p=a*u,m=i/(-h+u),f=m*-h;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,y=d-f,x=p+(i-f),b=l*o/v*g,M=c*o/v*g;t.projectionMatrix.makePerspective(y,x,b,M,g,v)}(m,u,d):m.projectionMatrix.copy(u.projectionMatrix),m};let M=null;const S=new oi;S.setAnimationLoop((function(t,e){if(l=e.getViewerPose(a),null!==l){const t=l.views,e=r.renderState.baseLayer;i.bindXRFramebuffer(e.framebuffer);let n=!1;t.length!==m.cameras.length&&(m.cameras.length=0,n=!0);for(let i=0;i<t.length;i++){const r=t[i],s=e.getViewport(r),a=p[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&&m.matrix.copy(a.matrix),!0===n&&m.cameras.push(a)}}const n=r.inputSources;for(let t=0;t<c.length;t++){const i=c[t],r=n[t];i.update(r,e,a)}M&&M(t,e)})),this.setAnimationLoop=function(t){M=t},this.dispose=function(){}}}function _s(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);const i=t.get(n).envMap;if(i){e.envMap.value=i,e.flipEnvMap.value=i.isCubeTexture&&i._needsFlipEnvMap?-1:1,e.reflectivity.value=n.reflectivity,e.refractionRatio.value=n.refractionRatio;const r=t.get(i).__maxMipLevel;void 0!==r&&(e.maxMipLevel.value=r)}let r,s;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),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){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){n(t,e),t.reflectivity.value=e.reflectivity,t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&t.sheen.value.copy(e.sheen);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());t.transmission.value=e.transmission,e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap)}(t,i):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);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);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 ws(t){const e=void 0!==(t=t||{}).canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),n=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],m=[];this.domElement=e,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.gammaFactor=2,this.outputEncoding=X,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const f=this;let g=!1,v=0,y=0,_=null,w=-1,S=null;const T=new St,A=new St;let L=null,R=e.width,C=e.height,P=1,D=null,I=null;const N=new St(0,0,R,C),B=new St(0,0,R,C);let z=!1;const F=new ai;let O=!1,H=!1;const G=new se,U=new Lt,k={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function V(){return null===_?P:1}let W,j,q,Y,Z,J,Q,K,$,tt,et,nt,it,rt,st,at,ot,lt,ct,ht,ut,dt,pt=n;function ft(t,n){for(let i=0;i<t.length;i++){const r=t[i],s=e.getContext(r,n);if(null!==s)return s}return null}try{const t={alpha:i,depth:r,stencil:s,antialias:a,premultipliedAlpha:o,preserveDrawingBuffer:l,powerPreference:c,failIfMajorPerformanceCaveat:h};if(e.addEventListener("webglcontextlost",xt,!1),e.addEventListener("webglcontextrestored",_t,!1),null===pt){const e=["webgl2","webgl","experimental-webgl"];if(!0===f.isWebGL1Renderer&&e.shift(),pt=ft(e,t),null===pt)throw ft(e)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===pt.getShaderPrecisionFormat&&(pt.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){throw console.error("THREE.WebGLRenderer: "+t.message),t}function gt(){W=new xi(pt),j=new gi(pt,W,t),W.init(j),ut=new ms(pt,W,j),q=new ds(pt,W,j),Y=new bi(pt),Z=new Kr,J=new ps(pt,W,q,Z,j,ut,Y),Q=new yi(f),K=new li(pt,j),dt=new mi(pt,W,K,j),$=new _i(pt,K,Y,dt),tt=new Ei(pt,$,K,Y),lt=new Ti(pt),st=new vi(Z),et=new Qr(f,Q,W,j,dt,st),nt=new _s(Z),it=new ns(Z),rt=new ls(W,j),ot=new pi(f,Q,q,tt,o),at=new us(f,tt,j),ct=new fi(pt,W,Y,j),ht=new wi(pt,W,Y,j),Y.programs=et.programs,f.capabilities=j,f.extensions=W,f.properties=Z,f.renderLists=it,f.shadowMap=at,f.state=q,f.info=Y}gt();const yt=new xs(f,pt);function xt(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),g=!0}function _t(){console.log("THREE.WebGLRenderer: Context Restored."),g=!1;const t=Y.autoReset,e=at.enabled,n=at.autoUpdate,i=at.needsUpdate,r=at.type;gt(),Y.autoReset=t,at.enabled=e,at.autoUpdate=n,at.needsUpdate=i,at.type=r}function wt(t){const e=t.target;e.removeEventListener("dispose",wt),function(t){(function(t){const e=Z.get(t).programs;void 0!==e&&e.forEach((function(t){et.releaseProgram(t)}))})(t),Z.remove(t)}(e)}this.xr=yt,this.getContext=function(){return pt},this.getContextAttributes=function(){return pt.getContextAttributes()},this.forceContextLoss=function(){const t=W.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){const t=W.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return P},this.setPixelRatio=function(t){void 0!==t&&(P=t,this.setSize(R,C,!1))},this.getSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),t=new vt),t.set(R,C)},this.setSize=function(t,n,i){yt.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(R=t,C=n,e.width=Math.floor(t*P),e.height=Math.floor(n*P),!1!==i&&(e.style.width=t+"px",e.style.height=n+"px"),this.setViewport(0,0,t,n))},this.getDrawingBufferSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),t=new vt),t.set(R*P,C*P).floor()},this.setDrawingBufferSize=function(t,n,i){R=t,C=n,P=i,e.width=Math.floor(t*i),e.height=Math.floor(n*i),this.setViewport(0,0,t,n)},this.getCurrentViewport=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),t=new St),t.copy(T)},this.getViewport=function(t){return t.copy(N)},this.setViewport=function(t,e,n,i){t.isVector4?N.set(t.x,t.y,t.z,t.w):N.set(t,e,n,i),q.viewport(T.copy(N).multiplyScalar(P).floor())},this.getScissor=function(t){return t.copy(B)},this.setScissor=function(t,e,n,i){t.isVector4?B.set(t.x,t.y,t.z,t.w):B.set(t,e,n,i),q.scissor(A.copy(B).multiplyScalar(P).floor())},this.getScissorTest=function(){return z},this.setScissorTest=function(t){q.setScissorTest(z=t)},this.setOpaqueSort=function(t){D=t},this.setTransparentSort=function(t){I=t},this.getClearColor=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getClearColor() now requires a Color as an argument"),t=new tn),t.copy(ot.getClearColor())},this.setClearColor=function(){ot.setClearColor.apply(ot,arguments)},this.getClearAlpha=function(){return ot.getClearAlpha()},this.setClearAlpha=function(){ot.setClearAlpha.apply(ot,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),pt.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(){e.removeEventListener("webglcontextlost",xt,!1),e.removeEventListener("webglcontextrestored",_t,!1),it.dispose(),rt.dispose(),Z.dispose(),Q.dispose(),tt.dispose(),dt.dispose(),yt.dispose(),yt.removeEventListener("sessionstart",Mt),yt.removeEventListener("sessionend",Tt),Et.stop()},this.renderBufferImmediate=function(t,e){dt.initAttributes();const n=Z.get(t);t.hasPositions&&!n.position&&(n.position=pt.createBuffer()),t.hasNormals&&!n.normal&&(n.normal=pt.createBuffer()),t.hasUvs&&!n.uv&&(n.uv=pt.createBuffer()),t.hasColors&&!n.color&&(n.color=pt.createBuffer());const i=e.getAttributes();t.hasPositions&&(pt.bindBuffer(34962,n.position),pt.bufferData(34962,t.positionArray,35048),dt.enableAttribute(i.position),pt.vertexAttribPointer(i.position,3,5126,!1,0,0)),t.hasNormals&&(pt.bindBuffer(34962,n.normal),pt.bufferData(34962,t.normalArray,35048),dt.enableAttribute(i.normal),pt.vertexAttribPointer(i.normal,3,5126,!1,0,0)),t.hasUvs&&(pt.bindBuffer(34962,n.uv),pt.bufferData(34962,t.uvArray,35048),dt.enableAttribute(i.uv),pt.vertexAttribPointer(i.uv,2,5126,!1,0,0)),t.hasColors&&(pt.bindBuffer(34962,n.color),pt.bufferData(34962,t.colorArray,35048),dt.enableAttribute(i.color),pt.vertexAttribPointer(i.color,3,5126,!1,0,0)),dt.disableUnusedAttributes(),pt.drawArrays(4,0,t.count),t.count=0},this.renderBufferDirect=function(t,e,n,i,r,s){null===e&&(e=k);const a=r.isMesh&&r.matrixWorld.determinant()<0,o=It(t,e,i,r);q.setMaterial(i,a);let l=n.index;const c=n.attributes.position;if(null===l){if(void 0===c||0===c.count)return}else if(0===l.count)return;let h,u=1;!0===i.wireframe&&(l=$.getWireframeAttribute(n),u=2),(i.morphTargets||i.morphNormals)&&lt.update(r,n,i,o),dt.setup(r,i,o,n,l);let d=ct;null!==l&&(h=K.get(l),d=ht,d.setIndex(h));const p=null!==l?l.count:c.count,m=n.drawRange.start*u,f=n.drawRange.count*u,g=null!==s?s.start*u:0,v=null!==s?s.count*u:1/0,y=Math.max(m,g),x=Math.min(p,m+f,g+v)-1,_=Math.max(0,x-y+1);if(0!==_){if(r.isMesh)!0===i.wireframe?(q.setLineWidth(i.wireframeLinewidth*V()),d.setMode(1)):d.setMode(4);else if(r.isLine){let t=i.linewidth;void 0===t&&(t=1),q.setLineWidth(t*V()),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,_,r.count);else if(n.isInstancedBufferGeometry){const t=Math.min(n.instanceCount,n._maxInstanceCount);d.renderInstances(y,_,t)}else d.render(y,_)}},this.compile=function(t,e){d=rt.get(t),d.init(),t.traverseVisible((function(t){t.isLight&&t.layers.test(e.layers)&&(d.pushLight(t),t.castShadow&&d.pushShadow(t))})),d.setupLights(),t.traverse((function(e){const n=e.material;if(n)if(Array.isArray(n))for(let i=0;i<n.length;i++){Pt(n[i],t,e)}else Pt(n,t,e)}))};let bt=null;function Mt(){Et.stop()}function Tt(){Et.start()}const Et=new oi;function At(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)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||F.intersectsSprite(t)){i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G);const e=tt.update(t),r=t.material;r.visible&&u.push(t,e,r,n,U.z,null)}}else if(t.isImmediateRenderObject)i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G),u.push(t,null,t.material,n,U.z,null);else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==Y.render.frame&&(t.skeleton.update(),t.skeleton.frame=Y.render.frame),!t.frustumCulled||F.intersectsObject(t))){i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G);const e=tt.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&&u.push(t,e,o,n,U.z,a)}}else r.visible&&u.push(t,e,r,n,U.z,null)}const r=t.children;for(let t=0,s=r.length;t<s;t++)At(r[t],e,n,i)}function Rt(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,c=s.group;if(n.isArrayCamera){const t=n.cameras;for(let n=0,i=t.length;n<i;n++){const i=t[n];a.layers.test(i.layers)&&(q.viewport(T.copy(i.viewport)),d.setupLightsView(i),Ct(a,e,i,o,l,c))}}else Ct(a,e,n,o,l,c)}}function Ct(t,e,n,i,r,s){if(t.onBeforeRender(f,e,n,i,r,s),t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),t.isImmediateRenderObject){const i=It(n,e,r,t);q.setMaterial(r),dt.reset(),function(t,e){t.render((function(t){f.renderBufferImmediate(t,e)}))}(t,i)}else f.renderBufferDirect(n,e,i,r,t,s);t.onAfterRender(f,e,n,i,r,s)}function Pt(t,e,n){!0!==e.isScene&&(e=k);const i=Z.get(t),r=d.state.lights,s=d.state.shadowsArray,a=r.state.version,o=et.getParameters(t,r.state,s,e,n),l=et.getProgramCacheKey(o);let c=i.programs;i.environment=t.isMeshStandardMaterial?e.environment:null,i.fog=e.fog,i.envMap=Q.get(t.envMap||i.environment),void 0===c&&(t.addEventListener("dispose",wt),c=new Map,i.programs=c);let h=c.get(l);if(void 0!==h){if(i.currentProgram===h&&i.lightsStateVersion===a)return Dt(t,o),h}else o.uniforms=et.getUniforms(t),t.onBuild(o,f),t.onBeforeCompile(o,f),h=et.acquireProgram(o,l),c.set(l,h),i.uniforms=o.uniforms;const u=i.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(u.clippingPlanes=st.uniform),Dt(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 p=h.getUniforms(),m=Cr.seqWithValue(p.seq,u);return i.currentProgram=h,i.uniformsList=m,h}function Dt(t,e){const n=Z.get(t);n.outputEncoding=e.outputEncoding,n.instancing=e.instancing,n.numClippingPlanes=e.numClippingPlanes,n.numIntersection=e.numClipIntersection,n.vertexAlphas=e.vertexAlphas}function It(t,e,n,i){!0!==e.isScene&&(e=k),J.resetTextureUnits();const r=e.fog,s=n.isMeshStandardMaterial?e.environment:null,a=null===_?f.outputEncoding:_.texture.encoding,o=Q.get(n.envMap||s),l=!0===n.vertexColors&&i.geometry&&i.geometry.attributes.color&&4===i.geometry.attributes.color.itemSize,c=Z.get(n),h=d.state.lights;if(!0===O&&(!0===H||t!==S)){const e=t===S&&n.id===w;st.setState(n,t,e)}let u=!1;n.version===c.__version?c.needsLights&&c.lightsStateVersion!==h.state.version||c.outputEncoding!==a||i.isInstancedMesh&&!1===c.instancing?u=!0:i.isInstancedMesh||!0!==c.instancing?c.envMap!==o||n.fog&&c.fog!==r?u=!0:void 0===c.numClippingPlanes||c.numClippingPlanes===st.numPlanes&&c.numIntersection===st.numIntersection?c.vertexAlphas!==l&&(u=!0):u=!0:u=!0:(u=!0,c.__version=n.version);let p=c.currentProgram;!0===u&&(p=Pt(n,e,i));let m=!1,g=!1,v=!1;const y=p.getUniforms(),x=c.uniforms;if(q.useProgram(p.program)&&(m=!0,g=!0,v=!0),n.id!==w&&(w=n.id,g=!0),m||S!==t){if(y.setValue(pt,"projectionMatrix",t.projectionMatrix),j.logarithmicDepthBuffer&&y.setValue(pt,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),S!==t&&(S=t,g=!0,v=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){const e=y.map.cameraPosition;void 0!==e&&e.setValue(pt,U.setFromMatrixPosition(t.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&y.setValue(pt,"isOrthographic",!0===t.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.isShadowMaterial||n.skinning)&&y.setValue(pt,"viewMatrix",t.matrixWorldInverse)}if(n.skinning){y.setOptional(pt,i,"bindMatrix"),y.setOptional(pt,i,"bindMatrixInverse");const t=i.skeleton;if(t){const e=t.bones;if(j.floatVertexTextures){if(null===t.boneTexture){let n=Math.sqrt(4*e.length);n=mt(n),n=Math.max(n,4);const i=new Float32Array(n*n*4);i.set(t.boneMatrices);const r=new ii(i,n,n,E,b);t.boneMatrices=i,t.boneTexture=r,t.boneTextureSize=n}y.setValue(pt,"boneTexture",t.boneTexture,J),y.setValue(pt,"boneTextureSize",t.boneTextureSize)}else y.setOptional(pt,t,"boneMatrices")}}var M,T;return(g||c.receiveShadow!==i.receiveShadow)&&(c.receiveShadow=i.receiveShadow,y.setValue(pt,"receiveShadow",i.receiveShadow)),g&&(y.setValue(pt,"toneMappingExposure",f.toneMappingExposure),c.needsLights&&(T=v,(M=x).ambientLightColor.needsUpdate=T,M.lightProbe.needsUpdate=T,M.directionalLights.needsUpdate=T,M.directionalLightShadows.needsUpdate=T,M.pointLights.needsUpdate=T,M.pointLightShadows.needsUpdate=T,M.spotLights.needsUpdate=T,M.spotLightShadows.needsUpdate=T,M.rectAreaLights.needsUpdate=T,M.hemisphereLights.needsUpdate=T),r&&n.fog&&nt.refreshFogUniforms(x,r),nt.refreshMaterialUniforms(x,n,P,C),Cr.upload(pt,c.uniformsList,x,J)),n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(Cr.upload(pt,c.uniformsList,x,J),n.uniformsNeedUpdate=!1),n.isSpriteMaterial&&y.setValue(pt,"center",i.center),y.setValue(pt,"modelViewMatrix",i.modelViewMatrix),y.setValue(pt,"normalMatrix",i.normalMatrix),y.setValue(pt,"modelMatrix",i.matrixWorld),p}Et.setAnimationLoop((function(t){bt&&bt(t)})),"undefined"!=typeof window&&Et.setContext(window),this.setAnimationLoop=function(t){bt=t,yt.setAnimationLoop(t),null===t?Et.stop():Et.start()},yt.addEventListener("sessionstart",Mt),yt.addEventListener("sessionend",Tt),this.render=function(t,e){let n,i;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),n=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),i=arguments[3]),void 0!==e&&!0!==e.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===g)return;!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),!0===yt.enabled&&!0===yt.isPresenting&&(e=yt.getCamera(e)),!0===t.isScene&&t.onBeforeRender(f,t,e,n||_),d=rt.get(t,m.length),d.init(),m.push(d),G.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),F.setFromProjectionMatrix(G),H=this.localClippingEnabled,O=st.init(this.clippingPlanes,H,e),u=it.get(t,p.length),u.init(),p.push(u),At(t,e,0,f.sortObjects),u.finish(),!0===f.sortObjects&&u.sort(D,I),!0===O&&st.beginShadows();const r=d.state.shadowsArray;at.render(r,t,e),d.setupLights(),d.setupLightsView(e),!0===O&&st.endShadows(),!0===this.info.autoReset&&this.info.reset(),void 0!==n&&this.setRenderTarget(n),ot.render(u,t,e,i);const s=u.opaque,a=u.transparent;s.length>0&&Rt(s,t,e),a.length>0&&Rt(a,t,e),null!==_&&(J.updateRenderTargetMipmap(_),J.updateMultisampleRenderTarget(_)),!0===t.isScene&&t.onAfterRender(f,t,e),q.buffers.depth.setTest(!0),q.buffers.depth.setMask(!0),q.buffers.color.setMask(!0),q.setPolygonOffset(!1),dt.resetDefaultState(),w=-1,S=null,m.pop(),d=m.length>0?m[m.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return v},this.getActiveMipmapLevel=function(){return y},this.getRenderTarget=function(){return _},this.setRenderTarget=function(t,e=0,n=0){_=t,v=e,y=n,t&&void 0===Z.get(t).__webglFramebuffer&&J.setupRenderTarget(t);let i=null,r=!1,s=!1;if(t){const n=t.texture;(n.isDataTexture3D||n.isDataTexture2DArray)&&(s=!0);const a=Z.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(i=a[e],r=!0):i=t.isWebGLMultisampleRenderTarget?Z.get(t).__webglMultisampledFramebuffer:a,T.copy(t.viewport),A.copy(t.scissor),L=t.scissorTest}else T.copy(N).multiplyScalar(P).floor(),A.copy(B).multiplyScalar(P).floor(),L=z;if(q.bindFramebuffer(36160,i),q.viewport(T),q.scissor(A),q.setScissorTest(L),r){const i=Z.get(t.texture);pt.framebufferTexture2D(36160,36064,34069+e,i.__webglTexture,n)}else if(s){const i=Z.get(t.texture),r=e||0;pt.framebufferTextureLayer(36160,36064,i.__webglTexture,n||0,r)}},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=Z.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){q.bindFramebuffer(36160,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==E&&ut.convert(o)!==pt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===M&&(W.has("EXT_color_buffer_half_float")||j.isWebGL2&&W.has("EXT_color_buffer_float"));if(!(l===x||ut.convert(l)===pt.getParameter(35738)||l===b&&(j.isWebGL2||W.has("OES_texture_float")||W.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===pt.checkFramebufferStatus(36160)?e>=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&pt.readPixels(e,n,i,r,ut.convert(o),ut.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==_?Z.get(_).__webglFramebuffer:null;q.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i),a=ut.convert(e.format);J.setTexture2D(e,0),pt.copyTexImage2D(3553,n,a,t.x,t.y,r,s,0),q.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,s=e.image.height,a=ut.convert(n.format),o=ut.convert(n.type);J.setTexture2D(n,0),pt.pixelStorei(37440,n.flipY),pt.pixelStorei(37441,n.premultiplyAlpha),pt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?pt.texSubImage2D(3553,i,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?pt.compressedTexSubImage2D(3553,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):pt.texSubImage2D(3553,i,t.x,t.y,a,o,e.image),0===i&&n.generateMipmaps&&pt.generateMipmap(3553),q.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(f.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const{width:s,height:a,data:o}=n.image,l=ut.convert(i.format),c=ut.convert(i.type);let h;if(i.isDataTexture3D)J.setTexture3D(i,0),h=32879;else{if(!i.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");J.setTexture2DArray(i,0),h=35866}pt.pixelStorei(37440,i.flipY),pt.pixelStorei(37441,i.premultiplyAlpha),pt.pixelStorei(3317,i.unpackAlignment);const u=pt.getParameter(3314),d=pt.getParameter(32878),p=pt.getParameter(3316),m=pt.getParameter(3315),g=pt.getParameter(32877);pt.pixelStorei(3314,s),pt.pixelStorei(32878,a),pt.pixelStorei(3316,t.min.x),pt.pixelStorei(3315,t.min.y),pt.pixelStorei(32877,t.min.z),pt.texSubImage3D(h,r,e.x,e.y,e.z,t.max.x-t.min.x+1,t.max.y-t.min.y+1,t.max.z-t.min.z+1,l,c,o),pt.pixelStorei(3314,u),pt.pixelStorei(32878,d),pt.pixelStorei(3316,p),pt.pixelStorei(3315,m),pt.pixelStorei(32877,g),0===r&&i.generateMipmaps&&pt.generateMipmap(h),q.unbindTexture()},this.initTexture=function(t){J.setTexture2D(t,0),q.unbindTexture()},this.resetState=function(){v=0,y=0,_=null,q.reset(),dt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}class bs extends ws{}bs.prototype.isWebGL1Renderer=!0;class Ms{constructor(t,e=25e-5){this.name="",this.color=new tn(t),this.density=e}clone(){return new Ms(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}Ms.prototype.isFogExp2=!0;class Ss{constructor(t,e=1,n=1e3){this.name="",this.color=new tn(t),this.near=e,this.far=n}clone(){return new Ss(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}Ss.prototype.isFog=!0;class Ts extends Ce{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.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}Ts.prototype.isScene=!0;class Es{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=et,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=ct(),this.onUploadCallback=function(){}}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=ct()),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 Es(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=ct()),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}}}Es.prototype.isInterleavedBuffer=!0;const As=new Lt;class Ls{constructor(t,e,n,i){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++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.applyMatrix4(t),this.setXYZ(e,As.x,As.y,As.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.applyNormalMatrix(t),this.setXYZ(e,As.x,As.y,As.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.transformDirection(t),this.setXYZ(e,As.x,As.y,As.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 sn(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 Ls(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}}}Ls.prototype.isInterleavedBufferAttribute=!0;class Rs extends Xe{constructor(t){super(),this.type="SpriteMaterial",this.color=new tn(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 Cs;Rs.prototype.isSpriteMaterial=!0;const Ps=new Lt,Ds=new Lt,Is=new Lt,Ns=new vt,Bs=new vt,zs=new se,Fs=new Lt,Os=new Lt,Hs=new Lt,Gs=new vt,Us=new vt,ks=new vt;class Vs extends Ce{constructor(t){if(super(),this.type="Sprite",void 0===Cs){Cs=new En;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 Es(t,5);Cs.setIndex([0,1,2,0,2,3]),Cs.setAttribute("position",new Ls(e,3,0,!1)),Cs.setAttribute("uv",new Ls(e,2,3,!1))}this.geometry=Cs,this.material=void 0!==t?t:new Rs,this.center=new vt(.5,.5)}raycast(t,e){null===t.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Ds.setFromMatrixScale(this.matrixWorld),zs.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),Is.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&Ds.multiplyScalar(-Is.z);const n=this.material.rotation;let i,r;0!==n&&(r=Math.cos(n),i=Math.sin(n));const s=this.center;Ws(Fs.set(-.5,-.5,0),Is,s,Ds,i,r),Ws(Os.set(.5,-.5,0),Is,s,Ds,i,r),Ws(Hs.set(.5,.5,0),Is,s,Ds,i,r),Gs.set(0,0),Us.set(1,0),ks.set(1,1);let a=t.ray.intersectTriangle(Fs,Os,Hs,!1,Ps);if(null===a&&(Ws(Os.set(-.5,.5,0),Is,s,Ds,i,r),Us.set(0,1),a=t.ray.intersectTriangle(Fs,Hs,Os,!1,Ps),null===a))return;const o=t.ray.origin.distanceTo(Ps);o<t.near||o>t.far||e.push({distance:o,point:Ps.clone(),uv:je.getUV(Ps,Fs,Os,Hs,Gs,Us,ks,new vt),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 Ws(t,e,n,i,r,s){Ns.subVectors(t,n).addScalar(.5).multiply(i),void 0!==r?(Bs.x=s*Ns.x-r*Ns.y,Bs.y=r*Ns.x+s*Ns.y):Bs.copy(Ns),t.copy(e),t.x+=Bs.x,t.y+=Bs.y,t.applyMatrix4(zs)}Vs.prototype.isSprite=!0;const js=new Lt,qs=new Lt;class Xs extends Ce{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,n=e.length;t<n;t++){const n=e[t];this.addLevel(n.object.clone(),n.distance)}return this.autoUpdate=t.autoUpdate,this}addLevel(t,e=0){e=Math.abs(e);const n=this.levels;let i;for(i=0;i<n.length&&!(e<n[i].distance);i++);return n.splice(i,0,{distance:e,object:t}),this.add(t),this}getCurrentLevel(){return this._currentLevel}getObjectForDistance(t){const e=this.levels;if(e.length>0){let n,i;for(n=1,i=e.length;n<i&&!(t<e[n].distance);n++);return e[n-1].object}return null}raycast(t,e){if(this.levels.length>0){js.setFromMatrixPosition(this.matrixWorld);const n=t.ray.origin.distanceTo(js);this.getObjectForDistance(n).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){js.setFromMatrixPosition(t.matrixWorld),qs.setFromMatrixPosition(this.matrixWorld);const n=js.distanceTo(qs)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i<r&&n>=e[i].distance;i++)e[i-1].object.visible=!1,e[i].object.visible=!0;for(this._currentLevel=i-1;i<r;i++)e[i].object.visible=!1}}toJSON(t){const e=super.toJSON(t);!1===this.autoUpdate&&(e.object.autoUpdate=!1),e.object.levels=[];const n=this.levels;for(let t=0,i=n.length;t<i;t++){const i=n[t];e.object.levels.push({object:i.object.uuid,distance:i.distance})}return e}}const Ys=new Lt,Zs=new St,Js=new St,Qs=new Lt,Ks=new se;class $s extends Wn{constructor(t,e){super(t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new se,this.bindMatrixInverse=new se}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;Zs.fromBufferAttribute(i.attributes.skinIndex,t),Js.fromBufferAttribute(i.attributes.skinWeight,t),Ys.fromBufferAttribute(i.attributes.position,t).applyMatrix4(this.bindMatrix),e.set(0,0,0);for(let t=0;t<4;t++){const i=Js.getComponent(t);if(0!==i){const r=Zs.getComponent(t);Ks.multiplyMatrices(n.bones[r].matrixWorld,n.boneInverses[r]),e.addScaledVector(Qs.copy(Ys).applyMatrix4(Ks),i)}}return e.applyMatrix4(this.bindMatrixInverse)}}$s.prototype.isSkinnedMesh=!0;class ta extends Ce{constructor(){super(),this.type="Bone"}}ta.prototype.isBone=!0;const ea=new se,na=new se;class ia{constructor(t=[],e=[]){this.uuid=ct(),this.bones=t.slice(0),this.boneInverses=e,this.boneMatrices=null,this.boneTexture=null,this.boneTextureSize=0,this.frame=-1,this.init()}init(){const t=this.bones,e=this.boneInverses;if(this.boneMatrices=new Float32Array(16*t.length),0===e.length)this.calculateInverses();else if(t.length!==e.length){console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."),this.boneInverses=[];for(let t=0,e=this.bones.length;t<e;t++)this.boneInverses.push(new se)}}calculateInverses(){this.boneInverses.length=0;for(let t=0,e=this.bones.length;t<e;t++){const e=new se;this.bones[t]&&e.copy(this.bones[t].matrixWorld).invert(),this.boneInverses.push(e)}}pose(){for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&e.matrixWorld.copy(this.boneInverses[t]).invert()}for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&(e.parent&&e.parent.isBone?(e.matrix.copy(e.parent.matrixWorld).invert(),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))}}update(){const t=this.bones,e=this.boneInverses,n=this.boneMatrices,i=this.boneTexture;for(let i=0,r=t.length;i<r;i++){const r=t[i]?t[i].matrixWorld:na;ea.multiplyMatrices(r,e[i]),ea.toArray(n,16*i)}null!==i&&(i.needsUpdate=!0)}clone(){return new ia(this.bones,this.boneInverses)}getBoneByName(t){for(let e=0,n=this.bones.length;e<n;e++){const n=this.bones[e];if(n.name===t)return n}}dispose(){null!==this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=null)}fromJSON(t,e){this.uuid=t.uuid;for(let n=0,i=t.bones.length;n<i;n++){const i=t.bones[n];let r=e[i];void 0===r&&(console.warn("THREE.Skeleton: No bone found with UUID:",i),r=new ta),this.bones.push(r),this.boneInverses.push((new se).fromArray(t.boneInverses[n]))}return this.init(),this}toJSON(){const t={metadata:{version:4.5,type:"Skeleton",generator:"Skeleton.toJSON"},bones:[],boneInverses:[]};t.uuid=this.uuid;const e=this.bones,n=this.boneInverses;for(let i=0,r=e.length;i<r;i++){const r=e[i];t.bones.push(r.uuid);const s=n[i];t.boneInverses.push(s.toArray())}return t}}const ra=new se,sa=new se,aa=[],oa=new Wn;class la extends Wn{constructor(t,e,n){super(t,e),this.instanceMatrix=new sn(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(oa.geometry=this.geometry,oa.material=this.material,void 0!==oa.material)for(let r=0;r<i;r++){this.getMatrixAt(r,ra),sa.multiplyMatrices(n,ra),oa.matrixWorld=sa,oa.raycast(t,aa);for(let t=0,n=aa.length;t<n;t++){const n=aa[t];n.instanceId=r,n.object=this,e.push(n)}aa.length=0}}setColorAt(t,e){null===this.instanceColor&&(this.instanceColor=new sn(new Float32Array(3*this.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"})}}la.prototype.isInstancedMesh=!0;class ca extends Xe{constructor(t){super(),this.type="LineBasicMaterial",this.color=new tn(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.morphTargets=!1,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.morphTargets=t.morphTargets,this}}ca.prototype.isLineBasicMaterial=!0;const ha=new Lt,ua=new Lt,da=new se,pa=new re,ma=new Jt;class fa extends Ce{constructor(t=new En,e=new ca){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++)ha.fromBufferAttribute(e,t-1),ua.fromBufferAttribute(e,t),n[t]=n[t-1],n[t]+=ha.distanceTo(ua);t.setAttribute("lineDistance",new mn(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(),ma.copy(n.boundingSphere),ma.applyMatrix4(i),ma.radius+=r,!1===t.ray.intersectsSphere(ma))return;da.copy(i).invert(),pa.copy(t.ray).applyMatrix4(da);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a,l=new Lt,c=new Lt,h=new Lt,u=new Lt,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),c.fromBufferAttribute(r,a);if(pa.distanceSqToSegment(l,c,u,h)>o)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);d<t.near||d>t.far||e.push({distance:d,point:h.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),c.fromBufferAttribute(r,n+1);if(pa.distanceSqToSegment(l,c,u,h)>o)continue;u.applyMatrix4(this.matrixWorld);const i=t.ray.origin.distanceTo(u);i<t.near||i>t.far||e.push({distance:i,point:h.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.")}}}fa.prototype.isLine=!0;const ga=new Lt,va=new Lt;class ya extends fa{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)ga.fromBufferAttribute(e,t),va.fromBufferAttribute(e,t+1),n[t]=0===t?0:n[t-1],n[t+1]=n[t]+ga.distanceTo(va);t.setAttribute("lineDistance",new mn(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}}ya.prototype.isLineSegments=!0;class xa extends fa{constructor(t,e){super(t,e),this.type="LineLoop"}}xa.prototype.isLineLoop=!0;class _a extends Xe{constructor(t){super(),this.type="PointsMaterial",this.color=new tn(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,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.morphTargets=t.morphTargets,this}}_a.prototype.isPointsMaterial=!0;const wa=new se,ba=new re,Ma=new Jt,Sa=new Lt;class Ta extends Ce{constructor(t=new En,e=new _a){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(),Ma.copy(n.boundingSphere),Ma.applyMatrix4(i),Ma.radius+=r,!1===t.ray.intersectsSphere(Ma))return;wa.copy(i).invert(),ba.copy(t.ray).applyMatrix4(wa);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);Sa.fromBufferAttribute(a,s),Ea(Sa,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++)Sa.fromBufferAttribute(a,n),Ea(Sa,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 Ea(t,e,n,i,r,s,a){const o=ba.distanceSqToPoint(t);if(o<n){const n=new Lt;ba.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})}}Ta.prototype.isPoints=!0;class Aa extends bt{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:T,this.minFilter=void 0!==s?s:g,this.magFilter=void 0!==r?r:g,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.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)}}Aa.prototype.isVideoTexture=!0;class La extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={width:e,height:n},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}La.prototype.isCompressedTexture=!0;class Ra extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.needsUpdate=!0}}Ra.prototype.isCanvasTexture=!0;class Ca extends bt{constructor(t,e,n,i,r,s,a,o,l,c){if((c=void 0!==c?c:A)!==A&&c!==L)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===A&&(n=_),void 0===n&&c===L&&(n=S),super(null,i,r,s,a,o,c,n,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:p,this.minFilter=void 0!==o?o:p,this.flipY=!1,this.generateMipmaps=!1}}Ca.prototype.isDepthTexture=!0;class Pa extends En{constructor(t=1,e=8,n=0,i=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:n,thetaLength:i},e=Math.max(3,e);const r=[],s=[],a=[],o=[],l=new Lt,c=new vt;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,h=3;r<=e;r++,h+=3){const u=n+r/e*i;l.x=t*Math.cos(u),l.y=t*Math.sin(u),s.push(l.x,l.y,l.z),a.push(0,0,1),c.x=(s[h]/t+1)/2,c.y=(s[h+1]/t+1)/2,o.push(c.x,c.y)}for(let t=1;t<=e;t++)r.push(t,t+1,0);this.setIndex(r),this.setAttribute("position",new mn(s,3)),this.setAttribute("normal",new mn(a,3)),this.setAttribute("uv",new mn(o,2))}}class Da extends En{constructor(t=1,e=1,n=1,i=8,r=1,s=!1,a=0,o=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:n,radialSegments:i,heightSegments:r,openEnded:s,thetaStart:a,thetaLength:o};const l=this;i=Math.floor(i),r=Math.floor(r);const c=[],h=[],u=[],d=[];let p=0;const m=[],f=n/2;let g=0;function v(n){const r=p,s=new vt,m=new Lt;let v=0;const y=!0===n?t:e,x=!0===n?1:-1;for(let t=1;t<=i;t++)h.push(0,f*x,0),u.push(0,x,0),d.push(.5,.5),p++;const _=p;for(let t=0;t<=i;t++){const e=t/i*o+a,n=Math.cos(e),r=Math.sin(e);m.x=y*r,m.y=f*x,m.z=y*n,h.push(m.x,m.y,m.z),u.push(0,x,0),s.x=.5*n+.5,s.y=.5*r*x+.5,d.push(s.x,s.y),p++}for(let t=0;t<i;t++){const e=r+t,i=_+t;!0===n?c.push(i,i+1,e):c.push(i+1,i,e),v+=3}l.addGroup(g,v,!0===n?1:2),g+=v}!function(){const s=new Lt,v=new Lt;let y=0;const x=(e-t)/n;for(let l=0;l<=r;l++){const c=[],g=l/r,y=g*(e-t)+t;for(let t=0;t<=i;t++){const e=t/i,r=e*o+a,l=Math.sin(r),m=Math.cos(r);v.x=y*l,v.y=-g*n+f,v.z=y*m,h.push(v.x,v.y,v.z),s.set(l,x,m).normalize(),u.push(s.x,s.y,s.z),d.push(e,1-g),c.push(p++)}m.push(c)}for(let t=0;t<i;t++)for(let e=0;e<r;e++){const n=m[e][t],i=m[e+1][t],r=m[e+1][t+1],s=m[e][t+1];c.push(n,i,s),c.push(i,r,s),y+=6}l.addGroup(g,y,0),g+=y}(),!1===s&&(t>0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new mn(h,3)),this.setAttribute("normal",new mn(u,3)),this.setAttribute("uv",new mn(d,2))}}class Ia extends Da{constructor(t=1,e=1,n=8,i=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,n,i,r,s,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:s,thetaLength:a}}}class Na extends En{constructor(t,e,n=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:n,detail:i};const r=[],s=[];function a(t,e,n,i){const r=i+1,s=[];for(let i=0;i<=r;i++){s[i]=[];const a=t.clone().lerp(n,i/r),o=e.clone().lerp(n,i/r),l=r-i;for(let t=0;t<=l;t++)s[i][t]=0===t&&i===r?a:a.clone().lerp(o,t/l)}for(let t=0;t<r;t++)for(let e=0;e<2*(r-t)-1;e++){const n=Math.floor(e/2);e%2==0?(o(s[t][n+1]),o(s[t+1][n]),o(s[t][n])):(o(s[t][n+1]),o(s[t+1][n+1]),o(s[t+1][n]))}}function o(t){r.push(t.x,t.y,t.z)}function l(e,n){const i=3*e;n.x=t[i+0],n.y=t[i+1],n.z=t[i+2]}function c(t,e,n,i){i<0&&1===t.x&&(s[e]=t.x-1),0===n.x&&0===n.z&&(s[e]=i/2/Math.PI+.5)}function h(t){return Math.atan2(t.z,-t.x)}!function(t){const n=new Lt,i=new Lt,r=new Lt;for(let s=0;s<e.length;s+=3)l(e[s+0],n),l(e[s+1],i),l(e[s+2],r),a(n,i,r,t)}(i),function(t){const e=new Lt;for(let n=0;n<r.length;n+=3)e.x=r[n+0],e.y=r[n+1],e.z=r[n+2],e.normalize().multiplyScalar(t),r[n+0]=e.x,r[n+1]=e.y,r[n+2]=e.z}(n),function(){const t=new Lt;for(let n=0;n<r.length;n+=3){t.x=r[n+0],t.y=r[n+1],t.z=r[n+2];const i=h(t)/2/Math.PI+.5,a=(e=t,Math.atan2(-e.y,Math.sqrt(e.x*e.x+e.z*e.z))/Math.PI+.5);s.push(i,1-a)}var e;(function(){const t=new Lt,e=new Lt,n=new Lt,i=new Lt,a=new vt,o=new vt,l=new vt;for(let u=0,d=0;u<r.length;u+=9,d+=6){t.set(r[u+0],r[u+1],r[u+2]),e.set(r[u+3],r[u+4],r[u+5]),n.set(r[u+6],r[u+7],r[u+8]),a.set(s[d+0],s[d+1]),o.set(s[d+2],s[d+3]),l.set(s[d+4],s[d+5]),i.copy(t).add(e).add(n).divideScalar(3);const p=h(i);c(a,d+0,t,p),c(o,d+2,e,p),c(l,d+4,n,p)}})(),function(){for(let t=0;t<s.length;t+=6){const e=s[t+0],n=s[t+2],i=s[t+4],r=Math.max(e,n,i),a=Math.min(e,n,i);r>.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),i<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new mn(r,3)),this.setAttribute("normal",new mn(r.slice(),3)),this.setAttribute("uv",new mn(s,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}}class Ba extends Na{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2,i=1/n;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}}const za=new Lt,Fa=new Lt,Oa=new Lt,Ha=new je;class Ga extends En{constructor(t,e){if(super(),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1,!0===t.isGeometry)return void console.error("THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const n=Math.pow(10,4),i=Math.cos(ot*e),r=t.getIndex(),s=t.getAttribute("position"),a=r?r.count:s.count,o=[0,0,0],l=["a","b","c"],c=new Array(3),h={},u=[];for(let t=0;t<a;t+=3){r?(o[0]=r.getX(t),o[1]=r.getX(t+1),o[2]=r.getX(t+2)):(o[0]=t,o[1]=t+1,o[2]=t+2);const{a:e,b:a,c:d}=Ha;if(e.fromBufferAttribute(s,o[0]),a.fromBufferAttribute(s,o[1]),d.fromBufferAttribute(s,o[2]),Ha.getNormal(Oa),c[0]=`${Math.round(e.x*n)},${Math.round(e.y*n)},${Math.round(e.z*n)}`,c[1]=`${Math.round(a.x*n)},${Math.round(a.y*n)},${Math.round(a.z*n)}`,c[2]=`${Math.round(d.x*n)},${Math.round(d.y*n)},${Math.round(d.z*n)}`,c[0]!==c[1]&&c[1]!==c[2]&&c[2]!==c[0])for(let t=0;t<3;t++){const e=(t+1)%3,n=c[t],r=c[e],s=Ha[l[t]],a=Ha[l[e]],d=`${n}_${r}`,p=`${r}_${n}`;p in h&&h[p]?(Oa.dot(h[p].normal)<=i&&(u.push(s.x,s.y,s.z),u.push(a.x,a.y,a.z)),h[p]=null):d in h||(h[d]={index0:o[t],index1:o[e],normal:Oa.clone()})}}for(const t in h)if(h[t]){const{index0:e,index1:n}=h[t];za.fromBufferAttribute(s,e),Fa.fromBufferAttribute(s,n),u.push(za.x,za.y,za.z),u.push(Fa.x,Fa.y,Fa.z)}this.setAttribute("position",new mn(u,3))}}const Ua=function(t,e,n){n=n||2;const i=e&&e.length,r=i?e[0]*n:t.length;let s=ka(t,0,r,n,!0);const a=[];if(!s||s.next===s.prev)return a;let o,l,c,h,u,d,p;if(i&&(s=function(t,e,n,i){const r=[];let s,a,o,l,c;for(s=0,a=e.length;s<a;s++)o=e[s]*i,l=s<a-1?e[s+1]*i:t.length,c=ka(t,o,l,i,!1),c===c.next&&(c.steiner=!0),r.push($a(c));for(r.sort(Za),s=0;s<r.length;s++)Ja(r[s],n),n=Va(n,n.next);return n}(t,e,s,n)),t.length>80*n){o=c=t[0],l=h=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>c&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return Wa(s,a,n,o,l,p),a};function ka(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=co(s,t[s],t[s+1],a);else for(s=n-i;s>=e;s-=i)a=co(s,t[s],t[s+1],a);return a&&io(a,a.next)&&(ho(a),a=a.next),a}function Va(t,e){if(!t)return t;e||(e=t);let n,i=t;do{if(n=!1,i.steiner||!io(i,i.next)&&0!==no(i.prev,i,i.next))i=i.next;else{if(ho(i),i=e=i.prev,i===i.next)break;n=!0}}while(n||i!==e);return e}function Wa(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=Ka(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,c=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,i=n,o=0,e=0;e<c&&(o++,i=i.nextZ,i);e++);for(l=c;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,c*=2}while(a>1)}(r)}(t,i,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?qa(t,i,r,s):ja(t))e.push(o.i/n),e.push(t.i/n),e.push(l.i/n),ho(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?Wa(t=Xa(Va(t),e,n),e,n,i,r,s,2):2===a&&Ya(t,e,n,i,r,s):Wa(Va(t),e,n,i,r,s,1);break}}function ja(t){const e=t.prev,n=t,i=t.next;if(no(e,n,i)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(to(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&no(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(no(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,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Ka(o,l,e,n,i),d=Ka(c,h,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&&to(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&no(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==t.prev&&m!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&no(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&no(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==t.prev&&m!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&no(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Xa(t,e,n){let i=t;do{const r=i.prev,s=i.next.next;!io(r,s)&&ro(r,i,i.next,s)&&oo(r,s)&&oo(s,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(s.i/n),ho(i),ho(i.next),i=t=s),i=i.next}while(i!==t);return Va(i)}function Ya(t,e,n,i,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&eo(a,t)){let o=lo(a,t);return a=Va(a,a.next),o=Va(o,o.next),Wa(a,e,n,i,r,s),void Wa(o,e,n,i,r,s)}t=t.next}a=a.next}while(a!==t)}function Za(t,e){return t.x-e.x}function Ja(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,c=s.y;let h,u=1/0;n=s;do{i>=n.x&&n.x>=l&&i!==n.x&&to(r<c?i:a,r,l,c,r<c?a:i,r,n.x,n.y)&&(h=Math.abs(r-n.y)/(i-n.x),oo(n,t)&&(h<u||h===u&&(n.x>s.x||n.x===s.x&&Qa(s,n)))&&(s=n,u=h)),n=n.next}while(n!==o);return s}(t,e)){const n=lo(e,t);Va(e,e.next),Va(n,n.next)}}function Qa(t,e){return no(t.prev,t,e.prev)<0&&no(e.next,t,t.next)<0}function Ka(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 $a(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 to(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 eo(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&&ro(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(oo(t,e)&&oo(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)&&(no(t.prev,t,e.prev)||no(t,e.prev,e))||io(t,e)&&no(t.prev,t,t.next)>0&&no(e.prev,e,e.next)>0)}function no(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function io(t,e){return t.x===e.x&&t.y===e.y}function ro(t,e,n,i){const r=ao(no(t,e,n)),s=ao(no(t,e,i)),a=ao(no(n,i,t)),o=ao(no(n,i,e));return r!==s&&a!==o||(!(0!==r||!so(t,n,e))||(!(0!==s||!so(t,i,e))||(!(0!==a||!so(n,t,i))||!(0!==o||!so(n,e,i)))))}function so(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 ao(t){return t>0?1:t<0?-1:0}function oo(t,e){return no(t.prev,t,t.next)<0?no(t,e,t.next)>=0&&no(t,t.prev,e)>=0:no(t,e,t.prev)<0||no(t,t.next,e)<0}function lo(t,e){const n=new uo(t.i,t.x,t.y),i=new uo(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 co(t,e,n,i){const r=new uo(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 ho(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 uo(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 po{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 po.area(t)<0}static triangulateShape(t,e){const n=[],i=[],r=[];mo(t),fo(n,t);let s=t.length;e.forEach(mo);for(let t=0;t<e.length;t++)i.push(s),s+=e[t].length,fo(n,e[t]);const a=Ua(n,i);for(let t=0;t<a.length;t+=3)r.push(a.slice(t,t+3));return r}}function mo(t){const e=t.length;e>2&&t[e-1].equals(t[0])&&t.pop()}function fo(t,e){for(let n=0;n<e.length;n++)t.push(e[n].x),t.push(e[n].y)}class go extends En{constructor(t,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:100,c=void 0===e.bevelEnabled||e.bevelEnabled,h=void 0!==e.bevelThickness?e.bevelThickness:6,u=void 0!==e.bevelSize?e.bevelSize:h-2,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:vo;void 0!==e.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),l=e.amount);let g,v,y,x,_,w=!1;m&&(g=m.getSpacedPoints(o),w=!0,c=!1,v=m.computeFrenetFrames(o,!1),y=new Lt,x=new Lt,_=new Lt),c||(p=0,h=0,u=0,d=0);const b=t.extractPoints(a);let M=b.shape;const S=b.holes;if(!po.isClockWise(M)){M=M.reverse();for(let t=0,e=S.length;t<e;t++){const e=S[t];po.isClockWise(e)&&(S[t]=e.reverse())}}const T=po.triangulateShape(M,S),E=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,R=T.length;function C(t,e,n){let i,r,s;const a=t.x-e.x,o=t.y-e.y,l=n.x-t.x,c=n.y-t.y,h=a*a+o*o,u=a*c-o*l;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((n.x-c/d-p)*c-(n.y+l/d-m)*l)/(a*c-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 vt(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(c)&&(t=!0),t?(i=-o,r=a,s=Math.sqrt(h)):(i=a,r=o,s=Math.sqrt(h/2))}return new vt(i/s,r/s)}const P=[];for(let t=0,e=E.length,n=e-1,i=t+1;t<e;t++,n++,i++)n===e&&(n=0),i===e&&(i=0),P[t]=C(E[t],E[n],E[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]=C(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=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t<e;t++){const e=A(E[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 B=u+d;for(let t=0;t<L;t++){const e=c?A(M[t],N[t],B):M[t];w?(x.copy(v.normals[0]).multiplyScalar(e.x),y.copy(v.binormals[0]).multiplyScalar(e.y),_.copy(g[0]).add(x).add(y),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=c?A(M[e],N[e],B):M[e];w?(x.copy(v.normals[t]).multiplyScalar(n.x),y.copy(v.binormals[t]).multiplyScalar(n.y),_.copy(g[t]).add(x).add(y),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=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t<e;t++){const e=A(E[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);w?F(r.x,r.y+g[o-1].y,g[o-1].x+n):F(r.x,r.y,l+n)}}}function z(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);H(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 O(t,e,r){G(t),G(e),G(r);const s=i.length/3,a=f.generateTopUV(n,i,s-3,s-2,s-1);U(a[0]),U(a[1]),U(a[2])}function H(t,e,r,s){G(t),G(e),G(s),G(e),G(r),G(s);const a=i.length/3,o=f.generateSideWallUV(n,i,a-6,a-3,a-2,a-1);U(o[0]),U(o[1]),U(o[3]),U(o[1]),U(o[2]),U(o[3])}function G(t){i.push(s[3*t+0]),i.push(s[3*t+1]),i.push(s[3*t+2])}function U(t){r.push(t.x),r.push(t.y)}!function(){const t=i.length/3;if(c){let t=0,e=L*t;for(let t=0;t<R;t++){const n=T[t];O(n[2]+e,n[1]+e,n[0]+e)}t=o+2*p,e=L*t;for(let t=0;t<R;t++){const n=T[t];O(n[0]+e,n[1]+e,n[2]+e)}}else{for(let t=0;t<R;t++){const e=T[t];O(e[2],e[1],e[0])}for(let t=0;t<R;t++){const e=T[t];O(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;z(E,e),e+=E.length;for(let t=0,n=S.length;t<n;t++){const n=S[t];z(n,e),e+=n.length}n.addGroup(t,i.length/3-t,1)}()}this.setAttribute("position",new mn(i,3)),this.setAttribute("uv",new mn(r,2)),this.computeVertexNormals()}toJSON(){const t=En.prototype.toJSON.call(this);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)}}const vo={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],c=e[3*r],h=e[3*r+1];return[new vt(s,a),new vt(o,l),new vt(c,h)]},generateSideWallUV:function(t,e,n,i,r,s){const a=e[3*n],o=e[3*n+1],l=e[3*n+2],c=e[3*i],h=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-h)<.01?[new vt(a,1-l),new vt(c,1-u),new vt(d,1-m),new vt(f,1-v)]:[new vt(o,1-l),new vt(h,1-u),new vt(p,1-m),new vt(g,1-v)]}};class yo extends Na{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2;super([-1,n,0,1,n,0,-1,-n,0,1,-n,0,0,-1,n,0,1,n,0,-1,-n,0,1,-n,n,0,-1,n,0,1,-n,0,-1,-n,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],t,e),this.type="IcosahedronGeometry",this.parameters={radius:t,detail:e}}}class xo extends En{constructor(t,e=12,n=0,i=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:n,phiLength:i},e=Math.floor(e),i=ht(i,0,2*Math.PI);const r=[],s=[],a=[],o=1/e,l=new Lt,c=new vt;for(let r=0;r<=e;r++){const h=n+r*o*i,u=Math.sin(h),d=Math.cos(h);for(let n=0;n<=t.length-1;n++)l.x=t[n].x*u,l.y=t[n].y,l.z=t[n].x*d,s.push(l.x,l.y,l.z),c.x=r/e,c.y=n/(t.length-1),a.push(c.x,c.y)}for(let n=0;n<e;n++)for(let e=0;e<t.length-1;e++){const i=e+n*t.length,s=i,a=i+t.length,o=i+t.length+1,l=i+1;r.push(s,a,l),r.push(a,o,l)}if(this.setIndex(r),this.setAttribute("position",new mn(s,3)),this.setAttribute("uv",new mn(a,2)),this.computeVertexNormals(),i===2*Math.PI){const n=this.attributes.normal.array,i=new Lt,r=new Lt,s=new Lt,a=e*t.length*3;for(let e=0,o=0;e<t.length;e++,o+=3)i.x=n[o+0],i.y=n[o+1],i.z=n[o+2],r.x=n[a+o+0],r.y=n[a+o+1],r.z=n[a+o+2],s.addVectors(i,r).normalize(),n[o+0]=n[a+o+0]=s.x,n[o+1]=n[a+o+1]=s.y,n[o+2]=n[a+o+2]=s.z}}}class _o extends Na{constructor(t=1,e=0){super([1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],t,e),this.type="OctahedronGeometry",this.parameters={radius:t,detail:e}}}class wo extends En{constructor(t,e,n){super(),this.type="ParametricGeometry",this.parameters={func:t,slices:e,stacks:n};const i=[],r=[],s=[],a=[],o=1e-5,l=new Lt,c=new Lt,h=new Lt,u=new Lt,d=new Lt;t.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");const p=e+1;for(let i=0;i<=n;i++){const p=i/n;for(let n=0;n<=e;n++){const i=n/e;t(i,p,c),r.push(c.x,c.y,c.z),i-o>=0?(t(i-o,p,h),u.subVectors(c,h)):(t(i+o,p,h),u.subVectors(h,c)),p-o>=0?(t(i,p-o,h),d.subVectors(c,h)):(t(i,p+o,h),d.subVectors(h,c)),l.crossVectors(u,d).normalize(),s.push(l.x,l.y,l.z),a.push(i,p)}}for(let t=0;t<n;t++)for(let n=0;n<e;n++){const e=t*p+n,r=t*p+n+1,s=(t+1)*p+n+1,a=(t+1)*p+n;i.push(e,r,a),i.push(r,s,a)}this.setIndex(i),this.setAttribute("position",new mn(r,3)),this.setAttribute("normal",new mn(s,3)),this.setAttribute("uv",new mn(a,2))}}class bo extends En{constructor(t=.5,e=1,n=8,i=1,r=0,s=2*Math.PI){super(),this.type="RingGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:n,phiSegments:i,thetaStart:r,thetaLength:s},n=Math.max(3,n);const a=[],o=[],l=[],c=[];let h=t;const u=(e-t)/(i=Math.max(1,i)),d=new Lt,p=new vt;for(let t=0;t<=i;t++){for(let t=0;t<=n;t++){const i=r+t/n*s;d.x=h*Math.cos(i),d.y=h*Math.sin(i),o.push(d.x,d.y,d.z),l.push(0,0,1),p.x=(d.x/e+1)/2,p.y=(d.y/e+1)/2,c.push(p.x,p.y)}h+=u}for(let t=0;t<i;t++){const e=t*(n+1);for(let t=0;t<n;t++){const i=t+e,r=i,s=i+n+1,o=i+n+2,l=i+1;a.push(r,s,l),a.push(s,o,l)}}this.setIndex(a),this.setAttribute("position",new mn(o,3)),this.setAttribute("normal",new mn(l,3)),this.setAttribute("uv",new mn(c,2))}}class Mo extends En{constructor(t,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 c=l.shape;const h=l.holes;!1===po.isClockWise(c)&&(c=c.reverse());for(let t=0,e=h.length;t<e;t++){const e=h[t];!0===po.isClockWise(e)&&(h[t]=e.reverse())}const u=po.triangulateShape(c,h);for(let t=0,e=h.length;t<e;t++){const e=h[t];c=c.concat(e)}for(let t=0,e=c.length;t<e;t++){const e=c[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 mn(i,3)),this.setAttribute("normal",new mn(r,3)),this.setAttribute("uv",new mn(s,2))}toJSON(){const t=En.prototype.toJSON.call(this);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)}}class So extends En{constructor(t=1,e=8,n=6,i=0,r=2*Math.PI,s=0,a=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:n,phiStart:i,phiLength:r,thetaStart:s,thetaLength:a},e=Math.max(3,Math.floor(e)),n=Math.max(2,Math.floor(n));const o=Math.min(s+a,Math.PI);let l=0;const c=[],h=new Lt,u=new Lt,d=[],p=[],m=[],f=[];for(let d=0;d<=n;d++){const g=[],v=d/n;let y=0;0==d&&0==s?y=.5/e:d==n&&o==Math.PI&&(y=-.5/e);for(let n=0;n<=e;n++){const o=n/e;h.x=-t*Math.cos(i+o*r)*Math.sin(s+v*a),h.y=t*Math.cos(s+v*a),h.z=t*Math.sin(i+o*r)*Math.sin(s+v*a),p.push(h.x,h.y,h.z),u.copy(h).normalize(),m.push(u.x,u.y,u.z),f.push(o+y,1-v),g.push(l++)}c.push(g)}for(let t=0;t<n;t++)for(let i=0;i<e;i++){const e=c[t][i+1],r=c[t][i],a=c[t+1][i],l=c[t+1][i+1];(0!==t||s>0)&&d.push(e,r,l),(t!==n-1||o<Math.PI)&&d.push(r,a,l)}this.setIndex(d),this.setAttribute("position",new mn(p,3)),this.setAttribute("normal",new mn(m,3)),this.setAttribute("uv",new mn(f,2))}}class To extends Na{constructor(t=1,e=0){super([1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],t,e),this.type="TetrahedronGeometry",this.parameters={radius:t,detail:e}}}class Eo extends go{constructor(t,e={}){const n=e.font;if(!n||!n.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new En;const i=n.generateShapes(t,e.size);e.depth=void 0!==e.height?e.height:50,void 0===e.bevelThickness&&(e.bevelThickness=10),void 0===e.bevelSize&&(e.bevelSize=8),void 0===e.bevelEnabled&&(e.bevelEnabled=!1),super(i,e),this.type="TextGeometry"}}class Ao extends En{constructor(t=1,e=.4,n=8,i=6,r=2*Math.PI){super(),this.type="TorusGeometry",this.parameters={radius:t,tube:e,radialSegments:n,tubularSegments:i,arc:r},n=Math.floor(n),i=Math.floor(i);const s=[],a=[],o=[],l=[],c=new Lt,h=new Lt,u=new Lt;for(let s=0;s<=n;s++)for(let d=0;d<=i;d++){const p=d/i*r,m=s/n*Math.PI*2;h.x=(t+e*Math.cos(m))*Math.cos(p),h.y=(t+e*Math.cos(m))*Math.sin(p),h.z=e*Math.sin(m),a.push(h.x,h.y,h.z),c.x=t*Math.cos(p),c.y=t*Math.sin(p),u.subVectors(h,c).normalize(),o.push(u.x,u.y,u.z),l.push(d/i),l.push(s/n)}for(let t=1;t<=n;t++)for(let e=1;e<=i;e++){const n=(i+1)*t+e-1,r=(i+1)*(t-1)+e-1,a=(i+1)*(t-1)+e,o=(i+1)*t+e;s.push(n,r,o),s.push(r,a,o)}this.setIndex(s),this.setAttribute("position",new mn(a,3)),this.setAttribute("normal",new mn(o,3)),this.setAttribute("uv",new mn(l,2))}}class Lo extends En{constructor(t=1,e=.4,n=64,i=8,r=2,s=3){super(),this.type="TorusKnotGeometry",this.parameters={radius:t,tube:e,tubularSegments:n,radialSegments:i,p:r,q:s},n=Math.floor(n),i=Math.floor(i);const a=[],o=[],l=[],c=[],h=new Lt,u=new Lt,d=new Lt,p=new Lt,m=new Lt,f=new Lt,g=new Lt;for(let a=0;a<=n;++a){const y=a/n*r*Math.PI*2;v(y,r,s,t,d),v(y+.01,r,s,t,p),f.subVectors(p,d),g.addVectors(p,d),m.crossVectors(f,g),g.crossVectors(m,f),m.normalize(),g.normalize();for(let t=0;t<=i;++t){const r=t/i*Math.PI*2,s=-e*Math.cos(r),p=e*Math.sin(r);h.x=d.x+(s*g.x+p*m.x),h.y=d.y+(s*g.y+p*m.y),h.z=d.z+(s*g.z+p*m.z),o.push(h.x,h.y,h.z),u.subVectors(h,d).normalize(),l.push(u.x,u.y,u.z),c.push(a/n),c.push(t/i)}}for(let t=1;t<=n;t++)for(let e=1;e<=i;e++){const n=(i+1)*(t-1)+(e-1),r=(i+1)*t+(e-1),s=(i+1)*t+e,o=(i+1)*(t-1)+e;a.push(n,r,o),a.push(r,s,o)}function v(t,e,n,i,r){const s=Math.cos(t),a=Math.sin(t),o=n/e*t,l=Math.cos(o);r.x=i*(2+l)*.5*s,r.y=i*(2+l)*a*.5,r.z=i*Math.sin(o)*.5}this.setIndex(a),this.setAttribute("position",new mn(o,3)),this.setAttribute("normal",new mn(l,3)),this.setAttribute("uv",new mn(c,2))}}class Ro extends En{constructor(t,e=64,n=1,i=8,r=!1){super(),this.type="TubeGeometry",this.parameters={path:t,tubularSegments:e,radius:n,radialSegments:i,closed:r};const s=t.computeFrenetFrames(e,r);this.tangents=s.tangents,this.normals=s.normals,this.binormals=s.binormals;const a=new Lt,o=new Lt,l=new vt;let c=new Lt;const h=[],u=[],d=[],p=[];function m(r){c=t.getPointAt(r/e,c);const l=s.normals[r],d=s.binormals[r];for(let t=0;t<=i;t++){const e=t/i*Math.PI*2,r=Math.sin(e),s=-Math.cos(e);o.x=s*l.x+r*d.x,o.y=s*l.y+r*d.y,o.z=s*l.z+r*d.z,o.normalize(),u.push(o.x,o.y,o.z),a.x=c.x+n*o.x,a.y=c.y+n*o.y,a.z=c.z+n*o.z,h.push(a.x,a.y,a.z)}}!function(){for(let t=0;t<e;t++)m(t);m(!1===r?e:0),function(){for(let t=0;t<=e;t++)for(let n=0;n<=i;n++)l.x=t/e,l.y=n/i,d.push(l.x,l.y)}(),function(){for(let t=1;t<=e;t++)for(let e=1;e<=i;e++){const n=(i+1)*(t-1)+(e-1),r=(i+1)*t+(e-1),s=(i+1)*t+e,a=(i+1)*(t-1)+e;p.push(n,r,a),p.push(r,s,a)}}()}(),this.setIndex(p),this.setAttribute("position",new mn(h,3)),this.setAttribute("normal",new mn(u,3)),this.setAttribute("uv",new mn(d,2))}toJSON(){const t=En.prototype.toJSON.call(this);return t.path=this.parameters.path.toJSON(),t}}class Co extends En{constructor(t){if(super(),this.type="WireframeGeometry",!0===t.isGeometry)return void console.error("THREE.WireframeGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const e=[],n=[0,0],i={},r=new Lt;if(null!==t.index){const s=t.attributes.position,a=t.index;let o=t.groups;0===o.length&&(o=[{start:0,count:a.count,materialIndex:0}]);for(let t=0,e=o.length;t<e;++t){const e=o[t],r=e.start;for(let t=r,s=r+e.count;t<s;t+=3)for(let e=0;e<3;e++){const r=a.getX(t+e),s=a.getX(t+(e+1)%3);n[0]=Math.min(r,s),n[1]=Math.max(r,s);const o=n[0]+","+n[1];void 0===i[o]&&(i[o]={index1:n[0],index2:n[1]})}}for(const t in i){const n=i[t];r.fromBufferAttribute(s,n.index1),e.push(r.x,r.y,r.z),r.fromBufferAttribute(s,n.index2),e.push(r.x,r.y,r.z)}}else{const n=t.attributes.position;for(let t=0,i=n.count/3;t<i;t++)for(let i=0;i<3;i++){const s=3*t+i;r.fromBufferAttribute(n,s),e.push(r.x,r.y,r.z);const a=3*t+(i+1)%3;r.fromBufferAttribute(n,a),e.push(r.x,r.y,r.z)}}this.setAttribute("position",new mn(e,3))}}var Po=Object.freeze({__proto__:null,BoxGeometry:qn,BoxBufferGeometry:qn,CircleGeometry:Pa,CircleBufferGeometry:Pa,ConeGeometry:Ia,ConeBufferGeometry:Ia,CylinderGeometry:Da,CylinderBufferGeometry:Da,DodecahedronGeometry:Ba,DodecahedronBufferGeometry:Ba,EdgesGeometry:Ga,ExtrudeGeometry:go,ExtrudeBufferGeometry:go,IcosahedronGeometry:yo,IcosahedronBufferGeometry:yo,LatheGeometry:xo,LatheBufferGeometry:xo,OctahedronGeometry:_o,OctahedronBufferGeometry:_o,ParametricGeometry:wo,ParametricBufferGeometry:wo,PlaneGeometry:ci,PlaneBufferGeometry:ci,PolyhedronGeometry:Na,PolyhedronBufferGeometry:Na,RingGeometry:bo,RingBufferGeometry:bo,ShapeGeometry:Mo,ShapeBufferGeometry:Mo,SphereGeometry:So,SphereBufferGeometry:So,TetrahedronGeometry:To,TetrahedronBufferGeometry:To,TextGeometry:Eo,TextBufferGeometry:Eo,TorusGeometry:Ao,TorusBufferGeometry:Ao,TorusKnotGeometry:Lo,TorusKnotBufferGeometry:Lo,TubeGeometry:Ro,TubeBufferGeometry:Ro,WireframeGeometry:Co});class Do extends Xe{constructor(t){super(),this.type="ShadowMaterial",this.color=new tn(0),this.transparent=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this}}Do.prototype.isShadowMaterial=!0;class Io extends Jn{constructor(t){super(t),this.type="RawShaderMaterial"}}Io.prototype.isRawShaderMaterial=!0;class No extends Xe{constructor(t){super(),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new tn(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 tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(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.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.flatShading=!1,this.vertexTangents=!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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this.vertexTangents=t.vertexTangents,this}}No.prototype.isMeshStandardMaterial=!0;class Bo extends No{constructor(t){super(),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoat=0,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new vt(1,1),this.clearcoatNormalMap=null,this.reflectivity=.5,Object.defineProperty(this,"ior",{get:function(){return(1+.4*this.reflectivity)/(1-.4*this.reflectivity)},set:function(t){this.reflectivity=ht(2.5*(t-1)/(t+1),0,1)}}),this.sheen=null,this.transmission=0,this.transmissionMap=null,this.setValues(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.reflectivity=t.reflectivity,t.sheen?this.sheen=(this.sheen||new tn).copy(t.sheen):this.sheen=null,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this}}Bo.prototype.isMeshPhysicalMaterial=!0;class zo extends Xe{constructor(t){super(),this.type="MeshPhongMaterial",this.color=new tn(16777215),this.specular=new tn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(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.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}zo.prototype.isMeshPhongMaterial=!0;class Fo extends Xe{constructor(t){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new tn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(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.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this}}Fo.prototype.isMeshToonMaterial=!0;class Oo extends Xe{constructor(t){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}Oo.prototype.isMeshNormalMaterial=!0;class Ho extends Xe{constructor(t){super(),this.type="MeshLambertMaterial",this.color=new tn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(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.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this}}Ho.prototype.isMeshLambertMaterial=!0;class Go extends Xe{constructor(t){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new tn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,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.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}Go.prototype.isMeshMatcapMaterial=!0;class Uo extends ca{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}}Uo.prototype.isLineDashedMaterial=!0;var ko=Object.freeze({__proto__:null,ShadowMaterial:Do,SpriteMaterial:Rs,RawShaderMaterial:Io,ShaderMaterial:Jn,PointsMaterial:_a,MeshPhysicalMaterial:Bo,MeshStandardMaterial:No,MeshPhongMaterial:zo,MeshToonMaterial:Fo,MeshNormalMaterial:Oo,MeshLambertMaterial:Ho,MeshDepthMaterial:cs,MeshDistanceMaterial:hs,MeshBasicMaterial:en,MeshMatcapMaterial:Go,LineDashedMaterial:Uo,LineBasicMaterial:ca,Material:Xe});const Vo={arraySlice:function(t,e,n){return Vo.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=[],c=[];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)c.push(e.values[t*o+n])}}0!==l.length&&(e.times=Vo.convertArray(l,e.times.constructor),e.values=Vo.convertArray(c,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 c=0;const h=a.getValueSize();a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(c=h/3);const u=i.times.length-1;let d;if(s<=i.times[0]){const t=o,e=l-o;d=Vo.arraySlice(i.values,t,e)}else if(s>=i.times[u]){const t=u*l+o,e=t+l-o;d=Vo.arraySlice(i.values,t,e)}else{const t=i.createInterpolant(),e=o,n=l-o;t.evaluate(s),d=Vo.arraySlice(t.resultBuffer,e,n)}if("quaternion"===r){(new At).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t<p;++t){const e=t*h+c;if("quaternion"===r)At.multiplyQuaternionsFlat(a.values,e,d,0,a.values,e);else{const t=h-2*c;for(let n=0;n<t;++n)a.values[e+n]-=d[n]}}}return t.blendMode=q,t}};class Wo{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_(){}}Wo.prototype.beforeStart_=Wo.prototype.copySampleValue_,Wo.prototype.afterEnd_=Wo.prototype.copySampleValue_;class jo extends Wo{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:k,endingEnd:k}}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 V:r=t,a=2*e-n;break;case W: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 V:s=t,o=2*n-e;break;case W:s=1,o=n+i[1]-i[0];break;default:s=t-1,o=e}const l=.5*(n-e),c=this.valueSize;this._weightPrev=l/(e-a),this._weightNext=l/(o-n),this._offsetPrev=r*c,this._offsetNext=s*c}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=t*a,l=o-a,c=this._offsetPrev,h=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,y=(-1-d)*f+(1.5+d)*m+.5*p,x=d*f-d*m;for(let t=0;t!==a;++t)r[t]=g*s[c+t]+v*s[l+t]+y*s[o+t]+x*s[h+t];return r}}class qo extends Wo{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,c=(n-e)/(i-e),h=1-c;for(let t=0;t!==a;++t)r[t]=s[l+t]*h+s[o+t]*c;return r}}class Xo extends Wo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t){return this.copySampleValue_(t-1)}}class Yo{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=Vo.convertArray(e,this.TimeBufferType),this.values=Vo.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:Vo.convertArray(t.times,Array),values:Vo.convertArray(t.values,Array)};const e=t.getInterpolation();e!==t.DefaultInterpolation&&(n.interpolation=e)}return n.type=t.ValueTypeName,n}InterpolantFactoryMethodDiscrete(t){return new Xo(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodLinear(t){return new qo(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodSmooth(t){return new jo(this.times,this.values,this.getValueSize(),t)}setInterpolation(t){let e;switch(t){case H:e=this.InterpolantFactoryMethodDiscrete;break;case G:e=this.InterpolantFactoryMethodLinear;break;case U: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 H;case this.InterpolantFactoryMethodLinear:return G;case this.InterpolantFactoryMethodSmooth:return U}}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=Vo.arraySlice(n,r,s),this.values=Vo.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&&Vo.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=Vo.arraySlice(this.times),e=Vo.arraySlice(this.values),n=this.getValueSize(),i=this.getInterpolation()===U,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=Vo.arraySlice(t,0,s),this.values=Vo.arraySlice(e,0,s*n)):(this.times=t,this.values=e),this}clone(){const t=Vo.arraySlice(this.times,0),e=Vo.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n}}Yo.prototype.TimeBufferType=Float32Array,Yo.prototype.ValueBufferType=Float32Array,Yo.prototype.DefaultInterpolation=G;class Zo extends Yo{}Zo.prototype.ValueTypeName="bool",Zo.prototype.ValueBufferType=Array,Zo.prototype.DefaultInterpolation=H,Zo.prototype.InterpolantFactoryMethodLinear=void 0,Zo.prototype.InterpolantFactoryMethodSmooth=void 0;class Jo extends Yo{}Jo.prototype.ValueTypeName="color";class Qo extends Yo{}Qo.prototype.ValueTypeName="number";class Ko extends Wo{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)At.slerpFlat(r,0,s,l-a,s,l,o);return r}}class $o extends Yo{InterpolantFactoryMethodLinear(t){return new Ko(this.times,this.values,this.getValueSize(),t)}}$o.prototype.ValueTypeName="quaternion",$o.prototype.DefaultInterpolation=G,$o.prototype.InterpolantFactoryMethodSmooth=void 0;class tl extends Yo{}tl.prototype.ValueTypeName="string",tl.prototype.ValueBufferType=Array,tl.prototype.DefaultInterpolation=H,tl.prototype.InterpolantFactoryMethodLinear=void 0,tl.prototype.InterpolantFactoryMethodSmooth=void 0;class el extends Yo{}el.prototype.ValueTypeName="vector";class nl{constructor(t,e=-1,n,i=2500){this.name=t,this.tracks=n,this.duration=e,this.blendMode=i,this.uuid=ct(),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(il(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(Yo.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=Vo.getKeyframeOrder(a);a=Vo.sortedArray(a,1,l),o=Vo.sortedArray(o,1,l),i||0!==a[0]||(a.push(r),o.push(o[0])),s.push(new Qo(".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=[];Vo.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 Qo(".morphTargetInfluence["+n+"]",t,s))}o=t.length*(s||1)}else{const s=".bones["+e[t].name+"]";n(el,s+".position",r,"pos",i),n($o,s+".quaternion",r,"rot",i),n(el,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 il(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 Qo;case"vector":case"vector2":case"vector3":case"vector4":return el;case"color":return Jo;case"quaternion":return $o;case"bool":case"boolean":return Zo;case"string":return tl}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){const e=[],n=[];Vo.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 rl={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 sl{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 al=new sl;class ol{constructor(t){this.manager=void 0!==t?t:al,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 ll={};class cl extends ol{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=this,s=rl.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;if(void 0!==ll[t])return void ll[t].push({onLoad:e,onProgress:n,onError:i});const a=t.match(/^data:(.*?)(;base64)?,(.*)$/);let o;if(a){const n=a[1],s=!!a[2];let o=a[3];o=decodeURIComponent(o),s&&(o=atob(o));try{let i;const s=(this.responseType||"").toLowerCase();switch(s){case"arraybuffer":case"blob":const t=new Uint8Array(o.length);for(let e=0;e<o.length;e++)t[e]=o.charCodeAt(e);i="blob"===s?new Blob([t.buffer],{type:n}):t.buffer;break;case"document":const e=new DOMParser;i=e.parseFromString(o,n);break;case"json":i=JSON.parse(o);break;default:i=o}setTimeout((function(){e&&e(i),r.manager.itemEnd(t)}),0)}catch(e){setTimeout((function(){i&&i(e),r.manager.itemError(t),r.manager.itemEnd(t)}),0)}}else{ll[t]=[],ll[t].push({onLoad:e,onProgress:n,onError:i}),o=new XMLHttpRequest,o.open("GET",t,!0),o.addEventListener("load",(function(e){const n=this.response,i=ll[t];if(delete ll[t],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),rl.add(t,n);for(let t=0,e=i.length;t<e;t++){const e=i[t];e.onLoad&&e.onLoad(n)}r.manager.itemEnd(t)}else{for(let t=0,n=i.length;t<n;t++){const n=i[t];n.onError&&n.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}}),!1),o.addEventListener("progress",(function(e){const n=ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onProgress&&i.onProgress(e)}}),!1),o.addEventListener("error",(function(e){const n=ll[t];delete ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onError&&i.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),o.addEventListener("abort",(function(e){const n=ll[t];delete ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onError&&i.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),void 0!==this.responseType&&(o.responseType=this.responseType),void 0!==this.withCredentials&&(o.withCredentials=this.withCredentials),o.overrideMimeType&&o.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(const t in this.requestHeader)o.setRequestHeader(t,this.requestHeader[t]);o.send(null)}return r.manager.itemStart(t),o}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class hl extends ol{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=rl.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a=document.createElementNS("http://www.w3.org/1999/xhtml","img");function o(){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1),rl.add(t,this),e&&e(this),r.manager.itemEnd(t)}function l(e){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1),i&&i(e),r.manager.itemError(t),r.manager.itemEnd(t)}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 ul extends ol{constructor(t){super(t)}load(t,e,n,i){const r=new ei,s=new hl(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 dl extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new ii,a=new cl(this.manager);return a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setPath(this.path),a.setWithCredentials(r.withCredentials),a.load(t,(function(t){const n=r.parse(t);n&&(void 0!==n.image?s.image=n.image:void 0!==n.data&&(s.image.width=n.width,s.image.height=n.height,s.image.data=n.data),s.wrapS=void 0!==n.wrapS?n.wrapS:u,s.wrapT=void 0!==n.wrapT?n.wrapT:u,s.magFilter=void 0!==n.magFilter?n.magFilter:g,s.minFilter=void 0!==n.minFilter?n.minFilter:g,s.anisotropy=void 0!==n.anisotropy?n.anisotropy:1,void 0!==n.encoding&&(s.encoding=n.encoding),void 0!==n.flipY&&(s.flipY=n.flipY),void 0!==n.format&&(s.format=n.format),void 0!==n.type&&(s.type=n.type),void 0!==n.mipmaps&&(s.mipmaps=n.mipmaps,s.minFilter=y),1===n.mipmapCount&&(s.minFilter=g),void 0!==n.generateMipmaps&&(s.generateMipmaps=n.generateMipmaps),s.needsUpdate=!0,e&&e(s,n))}),n,i),s}}class pl extends ol{constructor(t){super(t)}load(t,e,n,i){const r=new bt,s=new hl(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(t,(function(n){r.image=n;const i=t.search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/);r.format=i?T:E,r.needsUpdate=!0,void 0!==e&&e(r)}),n,i),r}}class ml{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 c=n[i];return(i+(s-c)/(n[i+1]-c))/(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 vt:new Lt);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 Lt,i=[],r=[],s=[],a=new Lt,o=new se;for(let e=0;e<=t;e++){const n=e/t;i[e]=this.getTangentAt(n,new Lt),i[e].normalize()}r[0]=new Lt,s[0]=new Lt;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),h=Math.abs(i[0].y),u=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),h<=l&&(l=h,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(ht(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(ht(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 fl extends ml{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 vt,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}}fl.prototype.isEllipseCurve=!0;class gl extends fl{constructor(t,e,n,i,r,s){super(t,e,n,n,i,r,s),this.type="ArcCurve"}}function vl(){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,c=(n-e)/a-(i-e)/(a+o)+(i-n)/o;l*=a,c*=a,r(e,n,l,c)},calc:function(r){const s=r*r;return t+e*r+n*s+i*(s*r)}}}gl.prototype.isArcCurve=!0;const yl=new Lt,xl=new vl,_l=new vl,wl=new vl;class bl extends ml{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 Lt){const n=e,i=this.points,r=i.length,s=(r-(this.closed?0:1))*t;let a,o,l=Math.floor(s),c=s-l;this.closed?l+=l>0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=i[(l-1)%r]:(yl.subVectors(i[0],i[1]).add(i[0]),a=yl);const h=i[l%r],u=i[(l+1)%r];if(this.closed||l+2<r?o=i[(l+2)%r]:(yl.subVectors(i[r-1],i[r-2]).add(i[r-1]),o=yl),"centripetal"===this.curveType||"chordal"===this.curveType){const t="chordal"===this.curveType?.5:.25;let e=Math.pow(a.distanceToSquared(h),t),n=Math.pow(h.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),xl.initNonuniformCatmullRom(a.x,h.x,u.x,o.x,e,n,i),_l.initNonuniformCatmullRom(a.y,h.y,u.y,o.y,e,n,i),wl.initNonuniformCatmullRom(a.z,h.z,u.z,o.z,e,n,i)}else"catmullrom"===this.curveType&&(xl.initCatmullRom(a.x,h.x,u.x,o.x,this.tension),_l.initCatmullRom(a.y,h.y,u.y,o.y,this.tension),wl.initCatmullRom(a.z,h.z,u.z,o.z,this.tension));return n.set(xl.calc(c),_l.calc(c),wl.calc(c)),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 Lt).fromArray(n))}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this}}function Ml(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 Sl(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 Tl(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)}bl.prototype.isCatmullRomCurve3=!0;class El extends ml{constructor(t=new vt,e=new vt,n=new vt,i=new vt){super(),this.type="CubicBezierCurve",this.v0=t,this.v1=e,this.v2=n,this.v3=i}getPoint(t,e=new vt){const n=e,i=this.v0,r=this.v1,s=this.v2,a=this.v3;return n.set(Tl(t,i.x,r.x,s.x,a.x),Tl(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}}El.prototype.isCubicBezierCurve=!0;class Al extends ml{constructor(t=new Lt,e=new Lt,n=new Lt,i=new Lt){super(),this.type="CubicBezierCurve3",this.v0=t,this.v1=e,this.v2=n,this.v3=i}getPoint(t,e=new Lt){const n=e,i=this.v0,r=this.v1,s=this.v2,a=this.v3;return n.set(Tl(t,i.x,r.x,s.x,a.x),Tl(t,i.y,r.y,s.y,a.y),Tl(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}}Al.prototype.isCubicBezierCurve3=!0;class Ll extends ml{constructor(t=new vt,e=new vt){super(),this.type="LineCurve",this.v1=t,this.v2=e}getPoint(t,e=new vt){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 vt;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}}Ll.prototype.isLineCurve=!0;class Rl extends ml{constructor(t=new Lt,e=new Lt){super(),this.type="LineCurve3",this.isLineCurve3=!0,this.v1=t,this.v2=e}getPoint(t,e=new Lt){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}}class Cl extends ml{constructor(t=new vt,e=new vt,n=new vt){super(),this.type="QuadraticBezierCurve",this.v0=t,this.v1=e,this.v2=n}getPoint(t,e=new vt){const n=e,i=this.v0,r=this.v1,s=this.v2;return n.set(Sl(t,i.x,r.x,s.x),Sl(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}}Cl.prototype.isQuadraticBezierCurve=!0;class Pl extends ml{constructor(t=new Lt,e=new Lt,n=new Lt){super(),this.type="QuadraticBezierCurve3",this.v0=t,this.v1=e,this.v2=n}getPoint(t,e=new Lt){const n=e,i=this.v0,r=this.v1,s=this.v2;return n.set(Sl(t,i.x,r.x,s.x),Sl(t,i.y,r.y,s.y),Sl(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}}Pl.prototype.isQuadraticBezierCurve3=!0;class Dl extends ml{constructor(t=[]){super(),this.type="SplineCurve",this.points=t}getPoint(t,e=new vt){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],c=i[s>i.length-2?i.length-1:s+1],h=i[s>i.length-3?i.length-1:s+2];return n.set(Ml(a,o.x,l.x,c.x,h.x),Ml(a,o.y,l.y,c.y,h.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 vt).fromArray(n))}return this}}Dl.prototype.isSplineCurve=!0;var Il=Object.freeze({__proto__:null,ArcCurve:gl,CatmullRomCurve3:bl,CubicBezierCurve:El,CubicBezierCurve3:Al,EllipseCurve:fl,LineCurve:Ll,LineCurve3:Rl,QuadraticBezierCurve:Cl,QuadraticBezierCurve3:Pl,SplineCurve:Dl});class Nl extends ml{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 Ll(e,t))}getPoint(t){const e=t*this.getLength(),n=this.getCurveLengths();let i=0;for(;i<n.length;){if(n[i]>=e){const t=n[i]-e,r=this.curves[i],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}i++}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 Il[n.type]).fromJSON(n))}return this}}class Bl extends Nl{constructor(t){super(),this.type="Path",this.currentPoint=new vt,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 Ll(this.currentPoint.clone(),new vt(t,e));return this.curves.push(n),this.currentPoint.set(t,e),this}quadraticCurveTo(t,e,n,i){const r=new Cl(this.currentPoint.clone(),new vt(t,e),new vt(n,i));return this.curves.push(r),this.currentPoint.set(n,i),this}bezierCurveTo(t,e,n,i,r,s){const a=new El(this.currentPoint.clone(),new vt(t,e),new vt(n,i),new vt(r,s));return this.curves.push(a),this.currentPoint.set(r,s),this}splineThru(t){const e=[this.currentPoint.clone()].concat(t),n=new Dl(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,c=this.currentPoint.y;return this.absellipse(t+l,e+c,n,i,r,s,a,o),this}absellipse(t,e,n,i,r,s,a,o){const l=new fl(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 c=l.getPoint(1);return this.currentPoint.copy(c),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 zl extends Bl{constructor(t){super(t),this.uuid=ct(),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 Bl).fromJSON(n))}return this}}class Fl extends Ce{constructor(t,e=1){super(),this.type="Light",this.color=new tn(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}}Fl.prototype.isLight=!0;class Ol extends Fl{constructor(t,e,n){super(t,n),this.type="HemisphereLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.groundColor=new tn(e)}copy(t){return Fl.prototype.copy.call(this,t),this.groundColor.copy(t.groundColor),this}}Ol.prototype.isHemisphereLight=!0;const Hl=new se,Gl=new Lt,Ul=new Lt;class kl{constructor(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.mapSize=new vt(512,512),this.map=null,this.mapPass=null,this.matrix=new se,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new ai,this._frameExtents=new vt(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;Gl.setFromMatrixPosition(t.matrixWorld),e.position.copy(Gl),Ul.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(Ul),e.updateMatrixWorld(),Hl.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Hl),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 Vl extends kl{constructor(){super(new Kn(50,1,.5,500)),this.focus=1}updateMatrices(t){const e=this.camera,n=2*lt*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}}Vl.prototype.isSpotLightShadow=!0;class Wl extends Fl{constructor(t,e,n=0,i=Math.PI/3,r=0,s=1){super(t,e),this.type="SpotLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.target=new Ce,this.distance=n,this.angle=i,this.penumbra=r,this.decay=s,this.shadow=new Vl}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}}Wl.prototype.isSpotLight=!0;const jl=new se,ql=new Lt,Xl=new Lt;class Yl extends kl{constructor(){super(new Kn(90,1,.5,500)),this._frameExtents=new vt(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 Lt(1,0,0),new Lt(-1,0,0),new Lt(0,0,1),new Lt(0,0,-1),new Lt(0,1,0),new Lt(0,-1,0)],this._cubeUps=[new Lt(0,1,0),new Lt(0,1,0),new Lt(0,1,0),new Lt(0,1,0),new Lt(0,0,1),new Lt(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()),ql.setFromMatrixPosition(t.matrixWorld),n.position.copy(ql),Xl.copy(n.position),Xl.add(this._cubeDirections[e]),n.up.copy(this._cubeUps[e]),n.lookAt(Xl),n.updateMatrixWorld(),i.makeTranslation(-ql.x,-ql.y,-ql.z),jl.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse),this._frustum.setFromProjectionMatrix(jl)}}Yl.prototype.isPointLightShadow=!0;class Zl extends Fl{constructor(t,e,n=0,i=1){super(t,e),this.type="PointLight",this.distance=n,this.decay=i,this.shadow=new Yl}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}}Zl.prototype.isPointLight=!0;class Jl extends Qn{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}}Jl.prototype.isOrthographicCamera=!0;class Ql extends kl{constructor(){super(new Jl(-5,5,5,-5,.5,500))}}Ql.prototype.isDirectionalLightShadow=!0;class Kl extends Fl{constructor(t,e){super(t,e),this.type="DirectionalLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.target=new Ce,this.shadow=new Ql}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}Kl.prototype.isDirectionalLight=!0;class $l extends Fl{constructor(t,e){super(t,e),this.type="AmbientLight"}}$l.prototype.isAmbientLight=!0;class tc extends Fl{constructor(t,e,n=10,i=10){super(t,e),this.type="RectAreaLight",this.width=n,this.height=i}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}}tc.prototype.isRectAreaLight=!0;class ec{constructor(){this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new Lt)}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)}}ec.prototype.isSphericalHarmonics3=!0;class nc extends Fl{constructor(t=new ec,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}}nc.prototype.isLightProbe=!0;class ic extends ol{constructor(t){super(t),this.textures={}}load(t,e,n,i){const r=this,s=new cl(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=this.textures;function n(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const i=new ko[t.type];if(void 0!==t.uuid&&(i.uuid=t.uuid),void 0!==t.name&&(i.name=t.name),void 0!==t.color&&void 0!==i.color&&i.color.setHex(t.color),void 0!==t.roughness&&(i.roughness=t.roughness),void 0!==t.metalness&&(i.metalness=t.metalness),void 0!==t.sheen&&(i.sheen=(new tn).setHex(t.sheen)),void 0!==t.emissive&&void 0!==i.emissive&&i.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==i.specular&&i.specular.setHex(t.specular),void 0!==t.shininess&&(i.shininess=t.shininess),void 0!==t.clearcoat&&(i.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(i.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.fog&&(i.fog=t.fog),void 0!==t.flatShading&&(i.flatShading=t.flatShading),void 0!==t.blending&&(i.blending=t.blending),void 0!==t.combine&&(i.combine=t.combine),void 0!==t.side&&(i.side=t.side),void 0!==t.shadowSide&&(i.shadowSide=t.shadowSide),void 0!==t.opacity&&(i.opacity=t.opacity),void 0!==t.transparent&&(i.transparent=t.transparent),void 0!==t.alphaTest&&(i.alphaTest=t.alphaTest),void 0!==t.depthTest&&(i.depthTest=t.depthTest),void 0!==t.depthWrite&&(i.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(i.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(i.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(i.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(i.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(i.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(i.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(i.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(i.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(i.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(i.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(i.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(i.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(i.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(i.rotation=t.rotation),1!==t.linewidth&&(i.linewidth=t.linewidth),void 0!==t.dashSize&&(i.dashSize=t.dashSize),void 0!==t.gapSize&&(i.gapSize=t.gapSize),void 0!==t.scale&&(i.scale=t.scale),void 0!==t.polygonOffset&&(i.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(i.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(i.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.skinning&&(i.skinning=t.skinning),void 0!==t.morphTargets&&(i.morphTargets=t.morphTargets),void 0!==t.morphNormals&&(i.morphNormals=t.morphNormals),void 0!==t.dithering&&(i.dithering=t.dithering),void 0!==t.alphaToCoverage&&(i.alphaToCoverage=t.alphaToCoverage),void 0!==t.premultipliedAlpha&&(i.premultipliedAlpha=t.premultipliedAlpha),void 0!==t.vertexTangents&&(i.vertexTangents=t.vertexTangents),void 0!==t.visible&&(i.visible=t.visible),void 0!==t.toneMapped&&(i.toneMapped=t.toneMapped),void 0!==t.userData&&(i.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?i.vertexColors=t.vertexColors>0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=n(r.value);break;case"c":i.uniforms[e].value=(new tn).setHex(r.value);break;case"v2":i.uniforms[e].value=(new vt).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Lt).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new St).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new yt).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new se).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.shading&&(i.flatShading=1===t.shading),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=n(t.map)),void 0!==t.matcap&&(i.matcap=n(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new vt).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=n(t.specularMap)),void 0!==t.envMap&&(i.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new vt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmission&&(i.transmission=t.transmission),void 0!==t.transmissionMap&&(i.transmissionMap=n(t.transmissionMap)),i}setTextures(t){return this.textures=t,this}}class rc{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)}}class sc extends En{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}}sc.prototype.isInstancedBufferGeometry=!0;class ac extends sn{constructor(t,e,n,i){"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||1}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}}ac.prototype.isInstancedBufferAttribute=!0;class oc extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e={},n={};function i(t,i){if(void 0!==e[i])return e[i];const r=t.interleavedBuffers[i],s=function(t,e){if(void 0!==n[e])return n[e];const i=t.arrayBuffers[e],r=new Uint32Array(i).buffer;return n[e]=r,r}(t,r.buffer),a=yn(r.type,s),o=new Es(a,r.stride);return o.uuid=r.uuid,e[i]=o,o}const r=t.isInstancedBufferGeometry?new sc:new En,s=t.data.index;if(void 0!==s){const t=yn(s.type,s.array);r.setIndex(new sn(t,1))}const a=t.data.attributes;for(const e in a){const n=a[e];let s;if(n.isInterleavedBufferAttribute){const e=i(t.data,n.data);s=new Ls(e,n.itemSize,n.offset,n.normalized)}else{const t=yn(n.type,n.array);s=new(n.isInstancedBufferAttribute?ac:sn)(t,n.itemSize,n.normalized)}void 0!==n.name&&(s.name=n.name),void 0!==n.usage&&s.setUsage(n.usage),void 0!==n.updateRange&&(s.updateRange.offset=n.updateRange.offset,s.updateRange.count=n.updateRange.count),r.setAttribute(e,s)}const o=t.data.morphAttributes;if(o)for(const e in o){const n=o[e],s=[];for(let e=0,r=n.length;e<r;e++){const r=n[e];let a;if(r.isInterleavedBufferAttribute){const e=i(t.data,r.data);a=new Ls(e,r.itemSize,r.offset,r.normalized)}else{const t=yn(r.type,r.array);a=new sn(t,r.itemSize,r.normalized)}void 0!==r.name&&(a.name=r.name),s.push(a)}r.morphAttributes[e]=s}t.data.morphTargetsRelative&&(r.morphTargetsRelative=!0);const l=t.data.groups||t.data.drawcalls||t.data.offsets;if(void 0!==l)for(let t=0,e=l.length;t!==e;++t){const e=l[t];r.addGroup(e.start,e.count,e.materialIndex)}const c=t.data.boundingSphere;if(void 0!==c){const t=new Lt;void 0!==c.center&&t.fromArray(c.center),r.boundingSphere=new Jt(t,c.radius)}return t.name&&(r.name=t.name),t.userData&&(r.userData=t.userData),r}}const lc={UVMapping:i,CubeReflectionMapping:r,CubeRefractionMapping:s,EquirectangularReflectionMapping:a,EquirectangularRefractionMapping:o,CubeUVReflectionMapping:l,CubeUVRefractionMapping:c},cc={RepeatWrapping:h,ClampToEdgeWrapping:u,MirroredRepeatWrapping:d},hc={NearestFilter:p,NearestMipmapNearestFilter:m,NearestMipmapLinearFilter:f,LinearFilter:g,LinearMipmapNearestFilter:v,LinearMipmapLinearFilter:y};class uc extends ol{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=rl.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){rl.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)}}uc.prototype.isImageBitmapLoader=!0;class dc{constructor(){this.type="ShapePath",this.color=new tn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new Bl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,n,i){return this.currentPath.quadraticCurveTo(t,e,n,i),this}bezierCurveTo(t,e,n,i,r,s){return this.currentPath.bezierCurveTo(t,e,n,i,r,s),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t,e){function n(t){const e=[];for(let n=0,i=t.length;n<i;n++){const i=t[n],r=new zl;r.curves=i.curves,e.push(r)}return e}function i(t,e){const n=e.length;let i=!1;for(let r=n-1,s=0;s<n;r=s++){let n=e[r],a=e[s],o=a.x-n.x,l=a.y-n.y;if(Math.abs(l)>Number.EPSILON){if(l<0&&(n=e[s],o=-o,a=e[r],l=-l),t.y<n.y||t.y>a.y)continue;if(t.y===n.y){if(t.x===n.x)return!0}else{const e=l*(t.x-n.x)-o*(t.y-n.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==n.y)continue;if(a.x<=t.x&&t.x<=n.x||n.x<=t.x&&t.x<=a.x)return!0}}return i}const r=po.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return n(s);let a,o,l;const c=[];if(1===s.length)return o=s[0],l=new zl,l.curves=o.curves,c.push(l),c;let h=!r(s[0].getPoints());h=t?!h:h;const u=[],d=[];let p,m,f=[],g=0;d[g]=void 0,f[g]=[];for(let e=0,n=s.length;e<n;e++)o=s[e],p=o.getPoints(),a=r(p),a=t?!a:a,a?(!h&&d[g]&&g++,d[g]={s:new zl,p:p},d[g].s.curves=o.curves,h&&g++,f[g]=[]):f[g].push({h:o,p:p[0]});if(!d[0])return n(s);if(d.length>1){let t=!1;const e=[];for(let t=0,e=d.length;t<e;t++)u[t]=[];for(let n=0,r=d.length;n<r;n++){const r=f[n];for(let s=0;s<r.length;s++){const a=r[s];let o=!0;for(let r=0;r<d.length;r++)i(a.p,d[r].p)&&(n!==r&&e.push({froms:n,tos:r,hole:s}),o?(o=!1,u[r].push(a)):t=!0);o&&u[n].push(a)}}e.length>0&&(t||(f=u))}for(let t=0,e=d.length;t<e;t++){l=d[t].s,c.push(l),m=f[t];for(let t=0,e=m.length;t<e;t++)l.holes.push(m[t].h)}return c}}class pc{constructor(t){this.type="Font",this.data=t}generateShapes(t,e=100){const n=[],i=function(t,e,n){const i=Array.from(t),r=e/n.resolution,s=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*r,a=[];let o=0,l=0;for(let t=0;t<i.length;t++){const e=i[t];if("\n"===e)o=0,l-=s;else{const t=mc(e,r,o,l,n);o+=t.offsetX,a.push(t.path)}}return a}(t,e,this.data);for(let t=0,e=i.length;t<e;t++)Array.prototype.push.apply(n,i[t].toShapes());return n}}function mc(t,e,n,i,r){const s=r.glyphs[t]||r.glyphs["?"];if(!s)return void console.error('THREE.Font: character "'+t+'" does not exists in font family '+r.familyName+".");const a=new dc;let o,l,c,h,u,d,p,m;if(s.o){const t=s._cachedOutline||(s._cachedOutline=s.o.split(" "));for(let r=0,s=t.length;r<s;){switch(t[r++]){case"m":o=t[r++]*e+n,l=t[r++]*e+i,a.moveTo(o,l);break;case"l":o=t[r++]*e+n,l=t[r++]*e+i,a.lineTo(o,l);break;case"q":c=t[r++]*e+n,h=t[r++]*e+i,u=t[r++]*e+n,d=t[r++]*e+i,a.quadraticCurveTo(u,d,c,h);break;case"b":c=t[r++]*e+n,h=t[r++]*e+i,u=t[r++]*e+n,d=t[r++]*e+i,p=t[r++]*e+n,m=t[r++]*e+i,a.bezierCurveTo(u,d,p,m,c,h)}}}return{offsetX:s.ha*e,path:a}}pc.prototype.isFont=!0;let fc;const gc={getContext:function(){return void 0===fc&&(fc=new(window.AudioContext||window.webkitAudioContext)),fc},setContext:function(t){fc=t}};class vc extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(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);gc.getContext().decodeAudioData(t,(function(t){e(t)}))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}}class yc extends nc{constructor(t,e,n=1){super(void 0,n);const i=(new tn).set(t),r=(new tn).set(e),s=new Lt(i.r,i.g,i.b),a=new Lt(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)}}yc.prototype.isHemisphereLightProbe=!0;class xc extends nc{constructor(t,e=1){super(void 0,e);const n=(new tn).set(t);this.sh.coefficients[0].set(n.r,n.g,n.b).multiplyScalar(2*Math.sqrt(Math.PI))}}xc.prototype.isAmbientLightProbe=!0;const _c=new se,wc=new se;class bc{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Mc(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=Mc();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function Mc(){return("undefined"==typeof performance?Date:performance).now()}const Sc=new Lt,Tc=new At,Ec=new Lt,Ac=new Lt;class Lc extends Ce{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}}const Rc=new Lt,Cc=new At,Pc=new Lt,Dc=new Lt;class Ic{constructor(t,e=2048){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=e,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let t=0;const e=this.getFrequencyData();for(let n=0;n<e.length;n++)t+=e[n];return t/e.length}}class Nc{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){At.slerpFlat(t,e,t,e,t,n,i)}_slerpAdditive(t,e,n,i,r){const s=this._workIndex*r;At.multiplyQuaternionsFlat(t,s,t,e,t,n),At.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 Bc="\\[\\]\\.:\\/",zc=new RegExp("[\\[\\]\\.:\\/]","g"),Fc="[^\\[\\]\\.:\\/]",Oc="[^"+Bc.replace("\\.","")+"]",Hc=/((?:WC+[\/:])*)/.source.replace("WC",Fc),Gc=/(WCOD+)?/.source.replace("WCOD",Oc),Uc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Fc),kc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Fc),Vc=new RegExp("^"+Hc+Gc+Uc+kc+"$"),Wc=["material","materials","bones"];class jc{constructor(t,e,n){this.path=e,this.parsedPath=n||jc.parseTrackName(e),this.node=jc.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 jc.Composite(t,e,n):new jc(t,e,n)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(zc,"")}static parseTrackName(t){const e=Vc.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!==Wc.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.node[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=jc.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}}jc.Composite=class{constructor(t,e,n){const i=n||jc.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()}},jc.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},jc.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},jc.prototype.GetterByBindingType=[jc.prototype._getValue_direct,jc.prototype._getValue_array,jc.prototype._getValue_arrayElement,jc.prototype._getValue_toArray],jc.prototype.SetterByBindingTypeAndVersioning=[[jc.prototype._setValue_direct,jc.prototype._setValue_direct_setNeedsUpdate,jc.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_array,jc.prototype._setValue_array_setNeedsUpdate,jc.prototype._setValue_array_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_arrayElement,jc.prototype._setValue_arrayElement_setNeedsUpdate,jc.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_fromArray,jc.prototype._setValue_fromArray_setNeedsUpdate,jc.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];class qc{constructor(){this.uuid=ct(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;const t={};this._indicesByUUID=t;for(let e=0,n=arguments.length;e!==n;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};const e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}add(){const t=this._objects,e=this._indicesByUUID,n=this._paths,i=this._parsedPaths,r=this._bindings,s=r.length;let a,o=t.length,l=this.nCachedObjects_;for(let c=0,h=arguments.length;c!==h;++c){const h=arguments[c],u=h.uuid;let d=e[u];if(void 0===d){d=o++,e[u]=d,t.push(h);for(let t=0,e=s;t!==e;++t)r[t].push(new jc(h,n[t],i[t]))}else if(d<l){a=t[d];const o=--l,c=t[o];e[c.uuid]=d,t[d]=c,e[u]=o,t[o]=h;for(let t=0,e=s;t!==e;++t){const e=r[t],s=e[o];let a=e[d];e[d]=s,void 0===a&&(a=new jc(h,n[t],i[t])),e[o]=a}}else t[d]!==a&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=l}remove(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_;for(let s=0,a=arguments.length;s!==a;++s){const a=arguments[s],o=a.uuid,l=e[o];if(void 0!==l&&l>=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[s],r=e[l];e[l]=i,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l<r){const a=--r,o=t[a],c=--s,h=t[c];e[o.uuid]=l,t[l]=o,e[h.uuid]=a,t[a]=h,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[a],r=e[c];e[l]=i,e[a]=r,e.pop()}}else{const r=--s,a=t[r];r>0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const n=this._bindingsIndicesByPath;let i=n[t];const r=this._bindings;if(void 0!==i)return r[i];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);i=r.length,n[t]=i,s.push(t),a.push(e),r.push(h);for(let n=c,i=o.length;n!==i;++n){const i=o[n];h[n]=new jc(i,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){const i=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=n,s[n]=o,s.pop(),r[n]=r[a],r.pop(),i[n]=i[a],i.pop()}}}qc.prototype.isAnimationObjectGroup=!0;class Xc{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:k,endingEnd:k};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;switch(this.blendMode){case q:for(let n=0,i=t.length;n!==i;++n)t[n].evaluate(s),e[n].accumulateAdditive(a);break;case j:default: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=V,i.endingEnd=V):(i.endingStart=t?this.zeroSlopeAtStart?V:k:W,i.endingEnd=e?this.zeroSlopeAtEnd?V:k:W)}_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 Yc extends rt{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 c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=i[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;h=new Nc(jc.create(n,l,i),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.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],c=t._byClipCacheIndex;l._byClipCacheIndex=c,o[c]=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 qo(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?nl.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:j),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 c=new Xc(this,s,e,n);return this._bindAction(c,l),this._addInactiveAction(c,a,r),c}existingAction(t,e){const n=e||this._root,i=n.uuid,r="string"==typeof t?nl.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))}}Yc.prototype._controlInterpolantsResultBuffer=new Float32Array(1);class Zc{constructor(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}clone(){return new Zc(void 0===this.value.clone?this.value:this.value.clone())}}class Jc extends Es{constructor(t,e,n=1){super(t,e),this.meshPerAttribute=n||1}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}}Jc.prototype.isInstancedInterleavedBuffer=!0;class Qc{constructor(t,e,n,i,r){this.buffer=t,this.type=e,this.itemSize=n,this.elementSize=i,this.count=r,this.version=0}set needsUpdate(t){!0===t&&this.version++}setBuffer(t){return this.buffer=t,this}setType(t,e){return this.type=t,this.elementSize=e,this}setItemSize(t){return this.itemSize=t,this}setCount(t){return this.count=t,this}}Qc.prototype.isGLBufferAttribute=!0;function Kc(t,e){return t.distance-e.distance}function $c(t,e,n,i){if(t.layers.test(e.layers)&&t.raycast(e,n),!0===i){const i=t.children;for(let t=0,r=i.length;t<r;t++)$c(i[t],e,n,!0)}}const th=new vt;class eh{constructor(t=new vt(1/0,1/0),e=new vt(-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=th.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 void 0===t&&(console.warn("THREE.Box2: .getCenter() target is now required"),t=new vt),this.isEmpty()?t.set(0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box2: .getSize() target is now required"),t=new vt),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 void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new vt),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 void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new vt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return th.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)}}eh.prototype.isBox2=!0;const nh=new Lt,ih=new Lt;class rh{constructor(t=new Lt,e=new Lt){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Lt),t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Lt),t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Lt),this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){nh.subVectors(t,this.start),ih.subVectors(this.end,this.start);const n=ih.dot(ih);let i=ih.dot(nh)/n;return e&&(i=ht(i,0,1)),i}closestPointToPoint(t,e,n){const i=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Lt),this.delta(n).multiplyScalar(i).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}class sh extends Ce{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}sh.prototype.isImmediateRenderObject=!0;const ah=new Lt;const oh=new Lt,lh=new se,ch=new se;class hh extends ya{constructor(t){const e=uh(t),n=new En,i=[],r=[],s=new tn(0,0,1),a=new tn(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 mn(i,3)),n.setAttribute("color",new mn(r,3));super(n,new ca({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");ch.copy(this.root.matrixWorld).invert();for(let t=0,n=0;t<e.length;t++){const r=e[t];r.parent&&r.parent.isBone&&(lh.multiplyMatrices(ch,r.matrixWorld),oh.setFromMatrixPosition(lh),i.setXYZ(n,oh.x,oh.y,oh.z),lh.multiplyMatrices(ch,r.parent.matrixWorld),oh.setFromMatrixPosition(lh),i.setXYZ(n+1,oh.x,oh.y,oh.z),n+=2)}n.getAttribute("position").needsUpdate=!0,super.updateMatrixWorld(t)}}function uh(t){const e=[];t&&t.isBone&&e.push(t);for(let n=0;n<t.children.length;n++)e.push.apply(e,uh(t.children[n]));return e}const dh=new Lt,ph=new tn,mh=new tn;class fh extends ya{constructor(t=10,e=10,n=4473924,i=8947848){n=new tn(n),i=new tn(i);const r=e/2,s=t/e,a=t/2,o=[],l=[];for(let t=0,c=0,h=-a;t<=e;t++,h+=s){o.push(-a,0,h,a,0,h),o.push(h,0,-a,h,0,a);const e=t===r?n:i;e.toArray(l,c),c+=3,e.toArray(l,c),c+=3,e.toArray(l,c),c+=3,e.toArray(l,c),c+=3}const c=new En;c.setAttribute("position",new mn(o,3)),c.setAttribute("color",new mn(l,3));super(c,new ca({vertexColors:!0,toneMapped:!1})),this.type="GridHelper"}}const gh=new Lt,vh=new Lt,yh=new Lt;const xh=new Lt,_h=new Qn;function wh(t,e,n,i,r,s,a){xh.set(r,s,a).unproject(i);const o=e[t];if(void 0!==o){const t=n.getAttribute("position");for(let e=0,n=o.length;e<n;e++)t.setXYZ(o[e],xh.x,xh.y,xh.z)}}const bh=new Pt;class Mh extends ya{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new Float32Array(24),r=new En;r.setIndex(new sn(n,1)),r.setAttribute("position",new sn(i,3)),super(r,new ca({color:e,toneMapped:!1})),this.object=t,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&bh.setFromObject(this.object),bh.isEmpty())return;const e=bh.min,n=bh.max,i=this.geometry.attributes.position,r=i.array;r[0]=n.x,r[1]=n.y,r[2]=n.z,r[3]=e.x,r[4]=n.y,r[5]=n.z,r[6]=e.x,r[7]=e.y,r[8]=n.z,r[9]=n.x,r[10]=e.y,r[11]=n.z,r[12]=n.x,r[13]=n.y,r[14]=e.z,r[15]=e.x,r[16]=n.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=n.x,r[22]=e.y,r[23]=e.z,i.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(t){return this.object=t,this.update(),this}copy(t){return ya.prototype.copy.call(this,t),this.object=t.object,this}}const Sh=new Lt;let Th,Eh;class Ah extends ya{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],n=new En;n.setAttribute("position",new mn(e,3)),n.setAttribute("color",new mn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(n,new ca({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}const Lh=new Float32Array(1),Rh=new Int32Array(Lh.buffer);const Ch=Math.pow(2,8),Ph=[.125,.215,.35,.446,.526,.582],Dh=5+Ph.length,Ih=20,Nh={[X]:0,[Y]:1,[J]:2,[Q]:3,[K]:4,[$]:5,[Z]:6},Bh=new en({side:1,depthWrite:!1,depthTest:!1}),zh=new Wn(new qn,Bh),Fh=new Jl,{_lodPlanes:Oh,_sizeLods:Hh,_sigmas:Gh}=Yh(),Uh=new tn;let kh=null;const Vh=(1+Math.sqrt(5))/2,Wh=1/Vh,jh=[new Lt(1,1,1),new Lt(-1,1,1),new Lt(1,1,-1),new Lt(-1,1,-1),new Lt(0,Vh,Wh),new Lt(0,Vh,-Wh),new Lt(Wh,0,Vh),new Lt(-Wh,0,Vh),new Lt(Vh,Wh,0),new Lt(-Vh,Wh,0)];function qh(t){const e=Math.max(t.r,t.g,t.b),n=Math.min(Math.max(Math.ceil(Math.log2(e)),-128),127);t.multiplyScalar(Math.pow(2,-n));return(n+128)/255}function Xh(t){return void 0!==t&&t.type===x&&(t.encoding===X||t.encoding===Y||t.encoding===Z)}function Yh(){const t=[],e=[],n=[];let i=8;for(let r=0;r<Dh;r++){const s=Math.pow(2,i);e.push(s);let a=1/s;r>4?a=Ph[r-8+4-1]:0==r&&(a=0),n.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),v=new Float32Array(m*d*u),y=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(h,m*d*t);const r=[t,t,t,t,t,t];y.set(r,f*d*t)}const x=new En;x.setAttribute("position",new sn(g,p)),x.setAttribute("uv",new sn(v,m)),x.setAttribute("faceIndex",new sn(y,f)),t.push(x),i>4&&i--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function Zh(t){const e=new Tt(3*Ch,3*Ch,t);return e.texture.mapping=l,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Jh(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function Qh(){const t=new vt(1,1);return new Io({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),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${tu()}\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\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function Kh(){return new Io({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),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${tu()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function $h(){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 tu(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\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 if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\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"}ml.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(ml.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Bl.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)},fh.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},hh.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},ol.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),rc.extractUrlBase(t)},ol.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.")}},eh.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},eh.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},eh.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},eh.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)},Pt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Pt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},Pt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},Pt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Pt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)},Jt.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ai.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},rh.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},yt.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},yt.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},yt.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},yt.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},se.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},se.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},se.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Lt).setFromMatrixColumn(this,3)},se.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},se.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},se.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},se.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},se.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},se.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},se.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},se.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},se.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},se.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},se.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)},se.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},Ne.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},At.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},At.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},re.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},re.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},re.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},je.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},je.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},je.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},je.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},je.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)},je.barycoordFromPoint=function(t,e,n,i,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),je.getBarycoord(t,e,n,i,r)},je.normal=function(t,e,n,i){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),je.getNormal(t,e,n,i)},zl.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},zl.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new go(this,t)},zl.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new Mo(this,t)},vt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},vt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},vt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Lt.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Lt.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Lt.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},Lt.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},Lt.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},Lt.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},Lt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Lt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},Lt.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()},Ce.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},Ce.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},Ce.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},Ce.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},Ce.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Ce.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.")}}}),Wn.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(Wn.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.")}}}),$s.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Kn.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(Fl.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(sn.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===nt},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(nt)}}}),sn.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},sn.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},sn.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},En.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},En.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 sn(arguments[1],arguments[2])))},En.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)},En.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},En.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},En.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},En.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(En.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}}}),Es.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},Es.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},go.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},go.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},go.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},Ts.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Zc.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this},Object.defineProperties(Xe.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 tn}},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}}}),Object.defineProperties(Jn.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}}}),ws.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)},ws.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},ws.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},ws.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},ws.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},ws.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},ws.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},ws.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},ws.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},ws.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},ws.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},ws.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},ws.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},ws.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},ws.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},ws.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},ws.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},ws.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},ws.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},ws.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},ws.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},ws.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},ws.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},ws.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},ws.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(ws.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?Y:X}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(us.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(Tt.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}}}),Lc.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return(new vc).load(t,(function(t){e.setBuffer(t)})),this},Ic.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},ti.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},ti.prototype.clear=function(t,e,n,i){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,i)},_t.crossOrigin=void 0,_t.loadTexture=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new pl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadTextureCube=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new ul;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},_t.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};const eu={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"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),t.ACESFilmicToneMapping=4,t.AddEquation=n,t.AddOperation=2,t.AdditiveAnimationBlendMode=q,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=$l,t.AmbientLightProbe=xc,t.AnimationClip=nl,t.AnimationLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=[];for(let n=0;n<t.length;n++){const i=nl.parse(t[n]);e.push(i)}return e}},t.AnimationMixer=Yc,t.AnimationObjectGroup=qc,t.AnimationUtils=Vo,t.ArcCurve=gl,t.ArrayCamera=fs,t.ArrowHelper=class extends Ce{constructor(t=new Lt(0,0,1),e=new Lt(0,0,0),n=1,i=16776960,r=.2*n,s=.2*r){super(),this.type="ArrowHelper",void 0===Th&&(Th=new En,Th.setAttribute("position",new mn([0,0,0,0,1,0],3)),Eh=new Da(0,.5,1,5,1),Eh.translate(0,-.5,0)),this.position.copy(e),this.line=new fa(Th,new ca({color:i,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Wn(Eh,new en({color:i,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(n,r,s)}setDirection(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Sh.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Sh,e)}}setLength(t,e=.2*t,n=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}},t.Audio=Lc,t.AudioAnalyser=Ic,t.AudioContext=gc,t.AudioListener=class extends Ce{constructor(){super(),this.type="AudioListener",this.context=gc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new bc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Sc,Tc,Ec),Ac.set(0,0,-1).applyQuaternion(Tc),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Sc.x,t),e.positionY.linearRampToValueAtTime(Sc.y,t),e.positionZ.linearRampToValueAtTime(Sc.z,t),e.forwardX.linearRampToValueAtTime(Ac.x,t),e.forwardY.linearRampToValueAtTime(Ac.y,t),e.forwardZ.linearRampToValueAtTime(Ac.z,t),e.upX.linearRampToValueAtTime(n.x,t),e.upY.linearRampToValueAtTime(n.y,t),e.upZ.linearRampToValueAtTime(n.z,t)}else e.setPosition(Sc.x,Sc.y,Sc.z),e.setOrientation(Ac.x,Ac.y,Ac.z,n.x,n.y,n.z)}},t.AudioLoader=vc,t.AxesHelper=Ah,t.AxisHelper=function(t){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Ah(t)},t.BackSide=1,t.BasicDepthPacking=3200,t.BasicShadowMap=0,t.BinaryTextureLoader=function(t){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new dl(t)},t.Bone=ta,t.BooleanKeyframeTrack=Zo,t.BoundingBoxHelper=function(t,e){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Mh(t,e)},t.Box2=eh,t.Box3=Pt,t.Box3Helper=class extends ya{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new En;i.setIndex(new sn(n,1)),i.setAttribute("position",new mn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(i,new ca({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}},t.BoxBufferGeometry=qn,t.BoxGeometry=qn,t.BoxHelper=Mh,t.BufferAttribute=sn,t.BufferGeometry=En,t.BufferGeometryLoader=oc,t.ByteType=1010,t.Cache=rl,t.Camera=Qn,t.CameraHelper=class extends ya{constructor(t){const e=new En,n=new ca({color:16777215,vertexColors:!0,toneMapped:!1}),i=[],r=[],s={},a=new tn(16755200),o=new tn(16711680),l=new tn(43775),c=new tn(16777215),h=new tn(3355443);function u(t,e,n){d(t,n),d(e,n)}function d(t,e){i.push(0,0,0),r.push(e.r,e.g,e.b),void 0===s[t]&&(s[t]=[]),s[t].push(i.length/3-1)}u("n1","n2",a),u("n2","n4",a),u("n4","n3",a),u("n3","n1",a),u("f1","f2",a),u("f2","f4",a),u("f4","f3",a),u("f3","f1",a),u("n1","f1",a),u("n2","f2",a),u("n3","f3",a),u("n4","f4",a),u("p","n1",o),u("p","n2",o),u("p","n3",o),u("p","n4",o),u("u1","u2",l),u("u2","u3",l),u("u3","u1",l),u("c","t",c),u("p","c",h),u("cn1","cn2",h),u("cn3","cn4",h),u("cf1","cf2",h),u("cf3","cf4",h),e.setAttribute("position",new mn(i,3)),e.setAttribute("color",new mn(r,3)),super(e,n),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}update(){const t=this.geometry,e=this.pointMap;_h.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),wh("c",e,t,_h,0,0,-1),wh("t",e,t,_h,0,0,1),wh("n1",e,t,_h,-1,-1,-1),wh("n2",e,t,_h,1,-1,-1),wh("n3",e,t,_h,-1,1,-1),wh("n4",e,t,_h,1,1,-1),wh("f1",e,t,_h,-1,-1,1),wh("f2",e,t,_h,1,-1,1),wh("f3",e,t,_h,-1,1,1),wh("f4",e,t,_h,1,1,1),wh("u1",e,t,_h,.7,1.1,-1),wh("u2",e,t,_h,-.7,1.1,-1),wh("u3",e,t,_h,0,2,-1),wh("cf1",e,t,_h,-1,0,1),wh("cf2",e,t,_h,1,0,1),wh("cf3",e,t,_h,0,-1,1),wh("cf4",e,t,_h,0,1,1),wh("cn1",e,t,_h,-1,0,-1),wh("cn2",e,t,_h,1,0,-1),wh("cn3",e,t,_h,0,-1,-1),wh("cn4",e,t,_h,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")},t.CanvasTexture=Ra,t.CatmullRomCurve3=bl,t.CineonToneMapping=3,t.CircleBufferGeometry=Pa,t.CircleGeometry=Pa,t.ClampToEdgeWrapping=u,t.Clock=bc,t.Color=tn,t.ColorKeyframeTrack=Jo,t.CompressedTexture=La,t.CompressedTextureLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=[],a=new La,o=new cl(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const n=r.parse(t,!0);s[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},l+=1,6===l&&(1===n.mipmapCount&&(a.minFilter=g),a.image=s,a.format=n.format,a.needsUpdate=!0,e&&e(a))}),n,i)}if(Array.isArray(t))for(let e=0,n=t.length;e<n;++e)c(e);else o.load(t,(function(t){const n=r.parse(t,!0);if(n.isCubemap){const t=n.mipmaps.length/n.mipmapCount;for(let e=0;e<t;e++){s[e]={mipmaps:[]};for(let t=0;t<n.mipmapCount;t++)s[e].mipmaps.push(n.mipmaps[e*n.mipmapCount+t]),s[e].format=n.format,s[e].width=n.width,s[e].height=n.height}a.image=s}else a.image.width=n.width,a.image.height=n.height,a.mipmaps=n.mipmaps;1===n.mipmapCount&&(a.minFilter=g),a.format=n.format,a.needsUpdate=!0,e&&e(a)}),n,i);return a}},t.ConeBufferGeometry=Ia,t.ConeGeometry=Ia,t.CubeCamera=ti,t.CubeReflectionMapping=r,t.CubeRefractionMapping=s,t.CubeTexture=ei,t.CubeTextureLoader=ul,t.CubeUVReflectionMapping=l,t.CubeUVRefractionMapping=c,t.CubicBezierCurve=El,t.CubicBezierCurve3=Al,t.CubicInterpolant=jo,t.CullFaceBack=1,t.CullFaceFront=2,t.CullFaceFrontBack=3,t.CullFaceNone=0,t.Curve=ml,t.CurvePath=Nl,t.CustomBlending=5,t.CustomToneMapping=5,t.CylinderBufferGeometry=Da,t.CylinderGeometry=Da,t.Cylindrical=class{constructor(t=1,e=0,n=0){return this.radius=t,this.theta=e,this.y=n,this}set(t,e,n){return this.radius=t,this.theta=e,this.y=n,this}copy(t){return this.radius=t.radius,this.theta=t.theta,this.y=t.y,this}setFromVector3(t){return this.setFromCartesianCoords(t.x,t.y,t.z)}setFromCartesianCoords(t,e,n){return this.radius=Math.sqrt(t*t+n*n),this.theta=Math.atan2(t,n),this.y=e,this}clone(){return(new this.constructor).copy(this)}},t.DataTexture=ii,t.DataTexture2DArray=Ai,t.DataTexture3D=Li,t.DataTextureLoader=dl,t.DataUtils=class{static toHalfFloat(t){Lh[0]=t;const e=Rh[0];let n=e>>16&32768,i=e>>12&2047;const r=e>>23&255;return r<103?n:r>142?(n|=31744,n|=(255==r?0:1)&&8388607&e,n):r<113?(i|=2048,n|=(i>>114-r)+(i>>113-r&1),n):(n|=r-112<<10|i>>1,n+=1&i,n)}},t.DecrementStencilOp=7683,t.DecrementWrapStencilOp=34056,t.DefaultLoadingManager=al,t.DepthFormat=A,t.DepthStencilFormat=L,t.DepthTexture=Ca,t.DirectionalLight=Kl,t.DirectionalLightHelper=class extends Ce{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,void 0===e&&(e=1);let i=new En;i.setAttribute("position",new mn([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));const r=new ca({fog:!1,toneMapped:!1});this.lightPlane=new fa(i,r),this.add(this.lightPlane),i=new En,i.setAttribute("position",new mn([0,0,0,0,0,1],3)),this.targetLine=new fa(i,r),this.add(this.targetLine),this.update()}dispose(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()}update(){gh.setFromMatrixPosition(this.light.matrixWorld),vh.setFromMatrixPosition(this.light.target.matrixWorld),yh.subVectors(vh,gh),this.lightPlane.lookAt(vh),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(vh),this.targetLine.scale.z=yh.length()}},t.DiscreteInterpolant=Xo,t.DodecahedronBufferGeometry=Ba,t.DodecahedronGeometry=Ba,t.DoubleSide=2,t.DstAlphaFactor=206,t.DstColorFactor=208,t.DynamicBufferAttribute=function(t,e){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new sn(t,e).setUsage(nt)},t.DynamicCopyUsage=35050,t.DynamicDrawUsage=nt,t.DynamicReadUsage=35049,t.EdgesGeometry=Ga,t.EdgesHelper=function(t,e){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new ya(new Ga(t.geometry),new ca({color:void 0!==e?e:16777215}))},t.EllipseCurve=fl,t.EqualDepth=4,t.EqualStencilFunc=514,t.EquirectangularReflectionMapping=a,t.EquirectangularRefractionMapping=o,t.Euler=fe,t.EventDispatcher=rt,t.ExtrudeBufferGeometry=go,t.ExtrudeGeometry=go,t.FaceColors=1,t.FileLoader=cl,t.FlatShading=1,t.Float16BufferAttribute=pn,t.Float32Attribute=function(t,e){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new mn(t,e)},t.Float32BufferAttribute=mn,t.Float64Attribute=function(t,e){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new fn(t,e)},t.Float64BufferAttribute=fn,t.FloatType=b,t.Fog=Ss,t.FogExp2=Ms,t.Font=pc,t.FontLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(t){let n;try{n=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),n=JSON.parse(t.substring(65,t.length-2))}const i=r.parse(n);e&&e(i)}),n,i)}parse(t){return new pc(t)}},t.FrontSide=0,t.Frustum=ai,t.GLBufferAttribute=Qc,t.GLSL1="100",t.GLSL3=it,t.GammaEncoding=Z,t.GreaterDepth=6,t.GreaterEqualDepth=5,t.GreaterEqualStencilFunc=518,t.GreaterStencilFunc=516,t.GridHelper=fh,t.Group=gs,t.HalfFloatType=M,t.HemisphereLight=Ol,t.HemisphereLightHelper=class extends Ce{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const i=new _o(e);i.rotateY(.5*Math.PI),this.material=new en({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);const r=i.getAttribute("position"),s=new Float32Array(3*r.count);i.setAttribute("color",new sn(s,3)),this.add(new Wn(i,this.material)),this.update()}dispose(){this.children[0].geometry.dispose(),this.children[0].material.dispose()}update(){const t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{const e=t.geometry.getAttribute("color");ph.copy(this.light.color),mh.copy(this.light.groundColor);for(let t=0,n=e.count;t<n;t++){const i=t<n/2?ph:mh;e.setXYZ(t,i.r,i.g,i.b)}e.needsUpdate=!0}t.lookAt(dh.setFromMatrixPosition(this.light.matrixWorld).negate())}},t.HemisphereLightProbe=yc,t.IcosahedronBufferGeometry=yo,t.IcosahedronGeometry=yo,t.ImageBitmapLoader=uc,t.ImageLoader=hl,t.ImageUtils=_t,t.ImmediateRenderObject=sh,t.IncrementStencilOp=7682,t.IncrementWrapStencilOp=34055,t.InstancedBufferAttribute=ac,t.InstancedBufferGeometry=sc,t.InstancedInterleavedBuffer=Jc,t.InstancedMesh=la,t.Int16Attribute=function(t,e){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new cn(t,e)},t.Int16BufferAttribute=cn,t.Int32Attribute=function(t,e){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new un(t,e)},t.Int32BufferAttribute=un,t.Int8Attribute=function(t,e){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new an(t,e)},t.Int8BufferAttribute=an,t.IntType=1013,t.InterleavedBuffer=Es,t.InterleavedBufferAttribute=Ls,t.Interpolant=Wo,t.InterpolateDiscrete=H,t.InterpolateLinear=G,t.InterpolateSmooth=U,t.InvertStencilOp=5386,t.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")},t.KeepStencilOp=tt,t.KeyframeTrack=Yo,t.LOD=Xs,t.LatheBufferGeometry=xo,t.LatheGeometry=xo,t.Layers=ge,t.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")},t.LessDepth=2,t.LessEqualDepth=3,t.LessEqualStencilFunc=515,t.LessStencilFunc=513,t.Light=Fl,t.LightProbe=nc,t.Line=fa,t.Line3=rh,t.LineBasicMaterial=ca,t.LineCurve=Ll,t.LineCurve3=Rl,t.LineDashedMaterial=Uo,t.LineLoop=xa,t.LinePieces=1,t.LineSegments=ya,t.LineStrip=0,t.LinearEncoding=X,t.LinearFilter=g,t.LinearInterpolant=qo,t.LinearMipMapLinearFilter=1008,t.LinearMipMapNearestFilter=1007,t.LinearMipmapLinearFilter=y,t.LinearMipmapNearestFilter=v,t.LinearToneMapping=1,t.Loader=ol,t.LoaderUtils=rc,t.LoadingManager=sl,t.LogLuvEncoding=3003,t.LoopOnce=2200,t.LoopPingPong=2202,t.LoopRepeat=2201,t.LuminanceAlphaFormat=1025,t.LuminanceFormat=1024,t.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},t.Material=Xe,t.MaterialLoader=ic,t.Math=gt,t.MathUtils=gt,t.Matrix3=yt,t.Matrix4=se,t.MaxEquation=104,t.Mesh=Wn,t.MeshBasicMaterial=en,t.MeshDepthMaterial=cs,t.MeshDistanceMaterial=hs,t.MeshFaceMaterial=function(t){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),t},t.MeshLambertMaterial=Ho,t.MeshMatcapMaterial=Go,t.MeshNormalMaterial=Oo,t.MeshPhongMaterial=zo,t.MeshPhysicalMaterial=Bo,t.MeshStandardMaterial=No,t.MeshToonMaterial=Fo,t.MinEquation=103,t.MirroredRepeatWrapping=d,t.MixOperation=1,t.MultiMaterial=function(t=[]){return console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),t.isMultiMaterial=!0,t.materials=t,t.clone=function(){return t.slice()},t},t.MultiplyBlending=4,t.MultiplyOperation=0,t.NearestFilter=p,t.NearestMipMapLinearFilter=1005,t.NearestMipMapNearestFilter=1004,t.NearestMipmapLinearFilter=f,t.NearestMipmapNearestFilter=m,t.NeverDepth=0,t.NeverStencilFunc=512,t.NoBlending=0,t.NoColors=0,t.NoToneMapping=0,t.NormalAnimationBlendMode=j,t.NormalBlending=1,t.NotEqualDepth=7,t.NotEqualStencilFunc=517,t.NumberKeyframeTrack=Qo,t.Object3D=Ce,t.ObjectLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=""===this.path?rc.extractUrlBase(t):this.path;this.resourcePath=this.resourcePath||s;const a=new cl(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(t,(function(n){let s=null;try{s=JSON.parse(n)}catch(e){return void 0!==i&&i(e),void console.error("THREE:ObjectLoader: Can't parse "+t+".",e.message)}const a=s.metadata;void 0!==a&&void 0!==a.type&&"geometry"!==a.type.toLowerCase()?r.parse(s,e):console.error("THREE.ObjectLoader: Can't load "+t)}),n,i)}parse(t,e){const n=this.parseAnimations(t.animations),i=this.parseShapes(t.shapes),r=this.parseGeometries(t.geometries,i),s=this.parseImages(t.images,(function(){void 0!==e&&e(l)})),a=this.parseTextures(t.textures,s),o=this.parseMaterials(t.materials,a),l=this.parseObject(t.object,r,o,n),c=this.parseSkeletons(t.skeletons,l);if(this.bindSkeletons(l,c),void 0!==e){let t=!1;for(const e in s)if(s[e]instanceof HTMLImageElement){t=!0;break}!1===t&&e(l)}return l}parseShapes(t){const e={};if(void 0!==t)for(let n=0,i=t.length;n<i;n++){const i=(new zl).fromJSON(t[n]);e[i.uuid]=i}return e}parseSkeletons(t,e){const n={},i={};if(e.traverse((function(t){t.isBone&&(i[t.uuid]=t)})),void 0!==t)for(let e=0,r=t.length;e<r;e++){const r=(new ia).fromJSON(t[e],i);n[r.uuid]=r}return n}parseGeometries(t,e){const n={};let i;if(void 0!==t){const r=new oc;for(let s=0,a=t.length;s<a;s++){let a;const o=t[s];switch(o.type){case"PlaneGeometry":case"PlaneBufferGeometry":a=new Po[o.type](o.width,o.height,o.widthSegments,o.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":a=new Po[o.type](o.width,o.height,o.depth,o.widthSegments,o.heightSegments,o.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":a=new Po[o.type](o.radius,o.segments,o.thetaStart,o.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":a=new Po[o.type](o.radiusTop,o.radiusBottom,o.height,o.radialSegments,o.heightSegments,o.openEnded,o.thetaStart,o.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":a=new Po[o.type](o.radius,o.height,o.radialSegments,o.heightSegments,o.openEnded,o.thetaStart,o.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":a=new Po[o.type](o.radius,o.widthSegments,o.heightSegments,o.phiStart,o.phiLength,o.thetaStart,o.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":a=new Po[o.type](o.radius,o.detail);break;case"RingGeometry":case"RingBufferGeometry":a=new Po[o.type](o.innerRadius,o.outerRadius,o.thetaSegments,o.phiSegments,o.thetaStart,o.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":a=new Po[o.type](o.radius,o.tube,o.radialSegments,o.tubularSegments,o.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":a=new Po[o.type](o.radius,o.tube,o.tubularSegments,o.radialSegments,o.p,o.q);break;case"TubeGeometry":case"TubeBufferGeometry":a=new Po[o.type]((new Il[o.path.type]).fromJSON(o.path),o.tubularSegments,o.radius,o.radialSegments,o.closed);break;case"LatheGeometry":case"LatheBufferGeometry":a=new Po[o.type](o.points,o.segments,o.phiStart,o.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":a=new Po[o.type](o.vertices,o.indices,o.radius,o.details);break;case"ShapeGeometry":case"ShapeBufferGeometry":i=[];for(let t=0,n=o.shapes.length;t<n;t++){const n=e[o.shapes[t]];i.push(n)}a=new Po[o.type](i,o.curveSegments);break;case"ExtrudeGeometry":case"ExtrudeBufferGeometry":i=[];for(let t=0,n=o.shapes.length;t<n;t++){const n=e[o.shapes[t]];i.push(n)}const t=o.options.extrudePath;void 0!==t&&(o.options.extrudePath=(new Il[t.type]).fromJSON(t)),a=new Po[o.type](i,o.options);break;case"BufferGeometry":case"InstancedBufferGeometry":a=r.parse(o);break;case"Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+o.type+'"');continue}a.uuid=o.uuid,void 0!==o.name&&(a.name=o.name),!0===a.isBufferGeometry&&void 0!==o.userData&&(a.userData=o.userData),n[o.uuid]=a}}return n}parseMaterials(t,e){const n={},i={};if(void 0!==t){const r=new ic;r.setTextures(e);for(let e=0,s=t.length;e<s;e++){const s=t[e];if("MultiMaterial"===s.type){const t=[];for(let e=0;e<s.materials.length;e++){const i=s.materials[e];void 0===n[i.uuid]&&(n[i.uuid]=r.parse(i)),t.push(n[i.uuid])}i[s.uuid]=t}else void 0===n[s.uuid]&&(n[s.uuid]=r.parse(s)),i[s.uuid]=n[s.uuid]}}return i}parseAnimations(t){const e={};if(void 0!==t)for(let n=0;n<t.length;n++){const i=t[n],r=nl.parse(i);e[r.uuid]=r}return e}parseImages(t,e){const n=this,i={};let r;function s(t){if("string"==typeof t){const e=t;return function(t){return n.manager.itemStart(t),r.load(t,(function(){n.manager.itemEnd(t)}),void 0,(function(){n.manager.itemError(t),n.manager.itemEnd(t)}))}(/^(\/\/)|([a-z]+:(\/\/)?)/i.test(e)?e:n.resourcePath+e)}return t.data?{data:yn(t.type,t.data),width:t.width,height:t.height}:null}if(void 0!==t&&t.length>0){const n=new sl(e);r=new hl(n),r.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e<n;e++){const n=t[e],r=n.url;if(Array.isArray(r)){i[n.uuid]=[];for(let t=0,e=r.length;t<e;t++){const e=s(r[t]);null!==e&&(e instanceof HTMLImageElement?i[n.uuid].push(e):i[n.uuid].push(new ii(e.data,e.width,e.height)))}}else{const t=s(n.url);null!==t&&(i[n.uuid]=t)}}}return i}parseTextures(t,e){function n(t,e){return"number"==typeof t?t:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",t),e[t])}const i={};if(void 0!==t)for(let r=0,s=t.length;r<s;r++){const s=t[r];let a;void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===e[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image);const o=e[s.image];Array.isArray(o)?(a=new ei(o),6===o.length&&(a.needsUpdate=!0)):(a=o&&o.data?new ii(o.data,o.width,o.height):new bt(o),o&&(a.needsUpdate=!0)),a.uuid=s.uuid,void 0!==s.name&&(a.name=s.name),void 0!==s.mapping&&(a.mapping=n(s.mapping,lc)),void 0!==s.offset&&a.offset.fromArray(s.offset),void 0!==s.repeat&&a.repeat.fromArray(s.repeat),void 0!==s.center&&a.center.fromArray(s.center),void 0!==s.rotation&&(a.rotation=s.rotation),void 0!==s.wrap&&(a.wrapS=n(s.wrap[0],cc),a.wrapT=n(s.wrap[1],cc)),void 0!==s.format&&(a.format=s.format),void 0!==s.type&&(a.type=s.type),void 0!==s.encoding&&(a.encoding=s.encoding),void 0!==s.minFilter&&(a.minFilter=n(s.minFilter,hc)),void 0!==s.magFilter&&(a.magFilter=n(s.magFilter,hc)),void 0!==s.anisotropy&&(a.anisotropy=s.anisotropy),void 0!==s.flipY&&(a.flipY=s.flipY),void 0!==s.premultiplyAlpha&&(a.premultiplyAlpha=s.premultiplyAlpha),void 0!==s.unpackAlignment&&(a.unpackAlignment=s.unpackAlignment),i[s.uuid]=a}return i}parseObject(t,e,n,i){let r,s,a;function o(t){return void 0===e[t]&&console.warn("THREE.ObjectLoader: Undefined geometry",t),e[t]}function l(t){if(void 0!==t){if(Array.isArray(t)){const e=[];for(let i=0,r=t.length;i<r;i++){const r=t[i];void 0===n[r]&&console.warn("THREE.ObjectLoader: Undefined material",r),e.push(n[r])}return e}return void 0===n[t]&&console.warn("THREE.ObjectLoader: Undefined material",t),n[t]}}switch(t.type){case"Scene":r=new Ts,void 0!==t.background&&Number.isInteger(t.background)&&(r.background=new tn(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?r.fog=new Ss(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(r.fog=new Ms(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":r=new Kn(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(r.focus=t.focus),void 0!==t.zoom&&(r.zoom=t.zoom),void 0!==t.filmGauge&&(r.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(r.filmOffset=t.filmOffset),void 0!==t.view&&(r.view=Object.assign({},t.view));break;case"OrthographicCamera":r=new Jl(t.left,t.right,t.top,t.bottom,t.near,t.far),void 0!==t.zoom&&(r.zoom=t.zoom),void 0!==t.view&&(r.view=Object.assign({},t.view));break;case"AmbientLight":r=new $l(t.color,t.intensity);break;case"DirectionalLight":r=new Kl(t.color,t.intensity);break;case"PointLight":r=new Zl(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":r=new tc(t.color,t.intensity,t.width,t.height);break;case"SpotLight":r=new Wl(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":r=new Ol(t.color,t.groundColor,t.intensity);break;case"LightProbe":r=(new nc).fromJSON(t);break;case"SkinnedMesh":s=o(t.geometry),a=l(t.material),r=new $s(s,a),void 0!==t.bindMode&&(r.bindMode=t.bindMode),void 0!==t.bindMatrix&&r.bindMatrix.fromArray(t.bindMatrix),void 0!==t.skeleton&&(r.skeleton=t.skeleton);break;case"Mesh":s=o(t.geometry),a=l(t.material),r=new Wn(s,a);break;case"InstancedMesh":s=o(t.geometry),a=l(t.material);const e=t.count,n=t.instanceMatrix,i=t.instanceColor;r=new la(s,a,e),r.instanceMatrix=new sn(new Float32Array(n.array),16),void 0!==i&&(r.instanceColor=new sn(new Float32Array(i.array),i.itemSize));break;case"LOD":r=new Xs;break;case"Line":r=new fa(o(t.geometry),l(t.material));break;case"LineLoop":r=new xa(o(t.geometry),l(t.material));break;case"LineSegments":r=new ya(o(t.geometry),l(t.material));break;case"PointCloud":case"Points":r=new Ta(o(t.geometry),l(t.material));break;case"Sprite":r=new Vs(l(t.material));break;case"Group":r=new gs;break;case"Bone":r=new ta;break;default:r=new Ce}if(r.uuid=t.uuid,void 0!==t.name&&(r.name=t.name),void 0!==t.matrix?(r.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(r.matrixAutoUpdate=t.matrixAutoUpdate),r.matrixAutoUpdate&&r.matrix.decompose(r.position,r.quaternion,r.scale)):(void 0!==t.position&&r.position.fromArray(t.position),void 0!==t.rotation&&r.rotation.fromArray(t.rotation),void 0!==t.quaternion&&r.quaternion.fromArray(t.quaternion),void 0!==t.scale&&r.scale.fromArray(t.scale)),void 0!==t.castShadow&&(r.castShadow=t.castShadow),void 0!==t.receiveShadow&&(r.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(r.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(r.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(r.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&r.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(r.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(r.visible=t.visible),void 0!==t.frustumCulled&&(r.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(r.renderOrder=t.renderOrder),void 0!==t.userData&&(r.userData=t.userData),void 0!==t.layers&&(r.layers.mask=t.layers),void 0!==t.children){const s=t.children;for(let t=0;t<s.length;t++)r.add(this.parseObject(s[t],e,n,i))}if(void 0!==t.animations){const e=t.animations;for(let t=0;t<e.length;t++){const n=e[t];r.animations.push(i[n])}}if("LOD"===t.type){void 0!==t.autoUpdate&&(r.autoUpdate=t.autoUpdate);const e=t.levels;for(let t=0;t<e.length;t++){const n=e[t],i=r.getObjectByProperty("uuid",n.object);void 0!==i&&r.addLevel(i,n.distance)}}return r}bindSkeletons(t,e){0!==Object.keys(e).length&&t.traverse((function(t){if(!0===t.isSkinnedMesh&&void 0!==t.skeleton){const n=e[t.skeleton];void 0===n?console.warn("THREE.ObjectLoader: No skeleton found with UUID:",t.skeleton):t.bind(n,t.bindMatrix)}}))}setTexturePath(t){return console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath()."),this.setResourcePath(t)}},t.ObjectSpaceNormalMap=1,t.OctahedronBufferGeometry=_o,t.OctahedronGeometry=_o,t.OneFactor=201,t.OneMinusDstAlphaFactor=207,t.OneMinusDstColorFactor=209,t.OneMinusSrcAlphaFactor=205,t.OneMinusSrcColorFactor=203,t.OrthographicCamera=Jl,t.PCFShadowMap=1,t.PCFSoftShadowMap=2,t.PMREMGenerator=class{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=function(t){const e=new Float32Array(t),n=new Lt(0,1,0);return new Io({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},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),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${tu()}\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\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Ih),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){kh=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=Kh(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Qh(),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<Oh.length;t++)Oh[t].dispose()}_cleanup(t){this._pingPongRenderTarget.dispose(),this._renderer.setRenderTarget(kh),t.scissorTest=!1,Jh(t,0,0,t.width,t.height)}_fromTexture(t){kh=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:p,minFilter:p,generateMipmaps:!1,type:x,format:1023,encoding:Xh(t)?t.encoding:J,depthBuffer:!1},n=Zh(e);return n.depthBuffer=!t,this._pingPongRenderTarget=Zh(e),n}_compileMaterial(t){const e=new Wn(Oh[0],t);this._renderer.compile(e,Fh)}_sceneToCubeUV(t,e,n,i){const r=new Kn(90,1,e,n),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,c=o.outputEncoding,h=o.toneMapping;o.getClearColor(Uh),o.toneMapping=0,o.outputEncoding=X,o.autoClear=!1;let u=!1;const d=t.background;if(d){if(d.isColor){Bh.color.copy(d).convertSRGBToLinear(),t.background=null;const e=qh(Bh.color);Bh.opacity=e,u=!0}}else{Bh.color.copy(Uh).convertSRGBToLinear();const t=qh(Bh.color);Bh.opacity=t,u=!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])),Jh(i,n*Ch,e>2?Ch:0,Ch,Ch),o.setRenderTarget(i),u&&o.render(zh,r),o.render(t,r)}o.toneMapping=h,o.outputEncoding=c,o.autoClear=l}_textureToCubeUV(t,e){const n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=Kh()):null==this._equirectShader&&(this._equirectShader=Qh());const i=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new Wn(Oh[0],i),s=i.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=Nh[t.encoding],s.outputEncoding.value=Nh[e.texture.encoding],Jh(e,0,0,3*Ch,2*Ch),n.setRenderTarget(e),n.render(r,Fh)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;e<Dh;e++){const n=Math.sqrt(Gh[e]*Gh[e]-Gh[e-1]*Gh[e-1]),i=jh[(e-1)%jh.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 c=new Wn(Oh[i],l),h=l.uniforms,u=Hh[n]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,m=isFinite(r)?1+Math.floor(3*p):Ih;m>Ih&&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<Ih;++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;h.envMap.value=t.texture,h.samples.value=m,h.weights.value=f,h.latitudinal.value="latitudinal"===s,a&&(h.poleAxis.value=a),h.dTheta.value=d,h.mipInt.value=8-n,h.inputEncoding.value=Nh[t.texture.encoding],h.outputEncoding.value=Nh[t.texture.encoding];const v=Hh[i];Jh(e,3*Math.max(0,Ch-2*v),(0===i?0:2*Ch)+2*v*(i>4?i-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Fh)}},t.ParametricBufferGeometry=wo,t.ParametricGeometry=wo,t.Particle=function(t){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new Vs(t)},t.ParticleBasicMaterial=function(t){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.ParticleSystem=function(t,e){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new Ta(t,e)},t.ParticleSystemMaterial=function(t){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.Path=Bl,t.PerspectiveCamera=Kn,t.Plane=Ne,t.PlaneBufferGeometry=ci,t.PlaneGeometry=ci,t.PlaneHelper=class extends fa{constructor(t,e=1,n=16776960){const i=n,r=new En;r.setAttribute("position",new mn([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),r.computeBoundingSphere(),super(r,new ca({color:i,toneMapped:!1})),this.type="PlaneHelper",this.plane=t,this.size=e;const s=new En;s.setAttribute("position",new mn([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),s.computeBoundingSphere(),this.add(new Wn(s,new en({color:i,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}updateMatrixWorld(t){let e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?1:0,this.lookAt(this.plane.normal),super.updateMatrixWorld(t)}},t.PointCloud=function(t,e){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new Ta(t,e)},t.PointCloudMaterial=function(t){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.PointLight=Zl,t.PointLightHelper=class extends Wn{constructor(t,e,n){super(new So(e,4,2),new en({wireframe:!0,fog:!1,toneMapped:!1})),this.light=t,this.light.updateMatrixWorld(),this.color=n,this.type="PointLightHelper",this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}dispose(){this.geometry.dispose(),this.material.dispose()}update(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}},t.Points=Ta,t.PointsMaterial=_a,t.PolarGridHelper=class extends ya{constructor(t=10,e=16,n=8,i=64,r=4473924,s=8947848){r=new tn(r),s=new tn(s);const a=[],o=[];for(let n=0;n<=e;n++){const i=n/e*(2*Math.PI),l=Math.sin(i)*t,c=Math.cos(i)*t;a.push(0,0,0),a.push(l,0,c);const h=1&n?r:s;o.push(h.r,h.g,h.b),o.push(h.r,h.g,h.b)}for(let e=0;e<=n;e++){const l=1&e?r:s,c=t-t/n*e;for(let t=0;t<i;t++){let e=t/i*(2*Math.PI),n=Math.sin(e)*c,r=Math.cos(e)*c;a.push(n,0,r),o.push(l.r,l.g,l.b),e=(t+1)/i*(2*Math.PI),n=Math.sin(e)*c,r=Math.cos(e)*c,a.push(n,0,r),o.push(l.r,l.g,l.b)}}const l=new En;l.setAttribute("position",new mn(a,3)),l.setAttribute("color",new mn(o,3));super(l,new ca({vertexColors:!0,toneMapped:!1})),this.type="PolarGridHelper"}},t.PolyhedronBufferGeometry=Na,t.PolyhedronGeometry=Na,t.PositionalAudio=class extends Lc{constructor(t){super(t),this.panner=this.context.createPanner(),this.panner.panningModel="HRTF",this.panner.connect(this.gain)}getOutput(){return this.panner}getRefDistance(){return this.panner.refDistance}setRefDistance(t){return this.panner.refDistance=t,this}getRolloffFactor(){return this.panner.rolloffFactor}setRolloffFactor(t){return this.panner.rolloffFactor=t,this}getDistanceModel(){return this.panner.distanceModel}setDistanceModel(t){return this.panner.distanceModel=t,this}getMaxDistance(){return this.panner.maxDistance}setMaxDistance(t){return this.panner.maxDistance=t,this}setDirectionalCone(t,e,n){return this.panner.coneInnerAngle=t,this.panner.coneOuterAngle=e,this.panner.coneOuterGain=n,this}updateMatrixWorld(t){if(super.updateMatrixWorld(t),!0===this.hasPlaybackControl&&!1===this.isPlaying)return;this.matrixWorld.decompose(Rc,Cc,Pc),Dc.set(0,0,1).applyQuaternion(Cc);const e=this.panner;if(e.positionX){const t=this.context.currentTime+this.listener.timeDelta;e.positionX.linearRampToValueAtTime(Rc.x,t),e.positionY.linearRampToValueAtTime(Rc.y,t),e.positionZ.linearRampToValueAtTime(Rc.z,t),e.orientationX.linearRampToValueAtTime(Dc.x,t),e.orientationY.linearRampToValueAtTime(Dc.y,t),e.orientationZ.linearRampToValueAtTime(Dc.z,t)}else e.setPosition(Rc.x,Rc.y,Rc.z),e.setOrientation(Dc.x,Dc.y,Dc.z)}},t.PropertyBinding=jc,t.PropertyMixer=Nc,t.QuadraticBezierCurve=Cl,t.QuadraticBezierCurve3=Pl,t.Quaternion=At,t.QuaternionKeyframeTrack=$o,t.QuaternionLinearInterpolant=Ko,t.REVISION=e,t.RGBADepthPacking=3201,t.RGBAFormat=E,t.RGBAIntegerFormat=1033,t.RGBA_ASTC_10x10_Format=37819,t.RGBA_ASTC_10x5_Format=37816,t.RGBA_ASTC_10x6_Format=37817,t.RGBA_ASTC_10x8_Format=37818,t.RGBA_ASTC_12x10_Format=37820,t.RGBA_ASTC_12x12_Format=37821,t.RGBA_ASTC_4x4_Format=37808,t.RGBA_ASTC_5x4_Format=37809,t.RGBA_ASTC_5x5_Format=37810,t.RGBA_ASTC_6x5_Format=37811,t.RGBA_ASTC_6x6_Format=37812,t.RGBA_ASTC_8x5_Format=37813,t.RGBA_ASTC_8x6_Format=37814,t.RGBA_ASTC_8x8_Format=37815,t.RGBA_BPTC_Format=36492,t.RGBA_ETC2_EAC_Format=O,t.RGBA_PVRTC_2BPPV1_Format=z,t.RGBA_PVRTC_4BPPV1_Format=B,t.RGBA_S3TC_DXT1_Format=C,t.RGBA_S3TC_DXT3_Format=P,t.RGBA_S3TC_DXT5_Format=D,t.RGBDEncoding=$,t.RGBEEncoding=J,t.RGBEFormat=1023,t.RGBFormat=T,t.RGBIntegerFormat=1032,t.RGBM16Encoding=K,t.RGBM7Encoding=Q,t.RGB_ETC1_Format=36196,t.RGB_ETC2_Format=F,t.RGB_PVRTC_2BPPV1_Format=N,t.RGB_PVRTC_4BPPV1_Format=I,t.RGB_S3TC_DXT1_Format=R,t.RGFormat=1030,t.RGIntegerFormat=1031,t.RawShaderMaterial=Io,t.Ray=re,t.Raycaster=class{constructor(t,e,n=0,i=1/0){this.ray=new re(t,e),this.near=n,this.far=i,this.camera=null,this.layers=new ge,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(t,e){this.ray.set(t,e)}setFromCamera(t,e){e&&e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize(),this.camera=e):e&&e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld),this.camera=e):console.error("THREE.Raycaster: Unsupported camera type: "+e.type)}intersectObject(t,e=!1,n=[]){return $c(t,this,n,e),n.sort(Kc),n}intersectObjects(t,e=!1,n=[]){for(let i=0,r=t.length;i<r;i++)$c(t[i],this,n,e);return n.sort(Kc),n}},t.RectAreaLight=tc,t.RedFormat=1028,t.RedIntegerFormat=1029,t.ReinhardToneMapping=2,t.RepeatWrapping=h,t.ReplaceStencilOp=7681,t.ReverseSubtractEquation=102,t.RingBufferGeometry=bo,t.RingGeometry=bo,t.SRGB8_ALPHA8_ASTC_10x10_Format=37851,t.SRGB8_ALPHA8_ASTC_10x5_Format=37848,t.SRGB8_ALPHA8_ASTC_10x6_Format=37849,t.SRGB8_ALPHA8_ASTC_10x8_Format=37850,t.SRGB8_ALPHA8_ASTC_12x10_Format=37852,t.SRGB8_ALPHA8_ASTC_12x12_Format=37853,t.SRGB8_ALPHA8_ASTC_4x4_Format=37840,t.SRGB8_ALPHA8_ASTC_5x4_Format=37841,t.SRGB8_ALPHA8_ASTC_5x5_Format=37842,t.SRGB8_ALPHA8_ASTC_6x5_Format=37843,t.SRGB8_ALPHA8_ASTC_6x6_Format=37844,t.SRGB8_ALPHA8_ASTC_8x5_Format=37845,t.SRGB8_ALPHA8_ASTC_8x6_Format=37846,t.SRGB8_ALPHA8_ASTC_8x8_Format=37847,t.Scene=Ts,t.SceneUtils=eu,t.ShaderChunk=hi,t.ShaderLib=di,t.ShaderMaterial=Jn,t.ShadowMaterial=Do,t.Shape=zl,t.ShapeBufferGeometry=Mo,t.ShapeGeometry=Mo,t.ShapePath=dc,t.ShapeUtils=po,t.ShortType=1011,t.Skeleton=ia,t.SkeletonHelper=hh,t.SkinnedMesh=$s,t.SmoothShading=2,t.Sphere=Jt,t.SphereBufferGeometry=So,t.SphereGeometry=So,t.Spherical=class{constructor(t=1,e=0,n=0){return this.radius=t,this.phi=e,this.theta=n,this}set(t,e,n){return this.radius=t,this.phi=e,this.theta=n,this}copy(t){return this.radius=t.radius,this.phi=t.phi,this.theta=t.theta,this}makeSafe(){const t=1e-6;return this.phi=Math.max(t,Math.min(Math.PI-t,this.phi)),this}setFromVector3(t){return this.setFromCartesianCoords(t.x,t.y,t.z)}setFromCartesianCoords(t,e,n){return this.radius=Math.sqrt(t*t+e*e+n*n),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(t,n),this.phi=Math.acos(ht(e/this.radius,-1,1))),this}clone(){return(new this.constructor).copy(this)}},t.SphericalHarmonics3=ec,t.SplineCurve=Dl,t.SpotLight=Wl,t.SpotLightHelper=class extends Ce{constructor(t,e){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=e;const n=new En,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,n=32;t<n;t++,e++){const r=t/n*Math.PI*2,s=e/n*Math.PI*2;i.push(Math.cos(r),Math.sin(r),1,Math.cos(s),Math.sin(s),1)}n.setAttribute("position",new mn(i,3));const r=new ca({fog:!1,toneMapped:!1});this.cone=new ya(n,r),this.add(this.cone),this.update()}dispose(){this.cone.geometry.dispose(),this.cone.material.dispose()}update(){this.light.updateMatrixWorld();const t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),ah.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(ah),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}},t.Sprite=Vs,t.SpriteMaterial=Rs,t.SrcAlphaFactor=204,t.SrcAlphaSaturateFactor=210,t.SrcColorFactor=202,t.StaticCopyUsage=35046,t.StaticDrawUsage=et,t.StaticReadUsage=35045,t.StereoCamera=class{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep;const n=t.projectionMatrix.clone(),i=e.eyeSep/2,r=i*e.near/e.focus,s=e.near*Math.tan(ot*e.fov*.5)/e.zoom;let a,o;wc.elements[12]=-i,_c.elements[12]=i,a=-s*e.aspect+r,o=s*e.aspect+r,n.elements[0]=2*e.near/(o-a),n.elements[8]=(o+a)/(o-a),this.cameraL.projectionMatrix.copy(n),a=-s*e.aspect-r,o=s*e.aspect-r,n.elements[0]=2*e.near/(o-a),n.elements[8]=(o+a)/(o-a),this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(wc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(_c)}},t.StreamCopyUsage=35042,t.StreamDrawUsage=35040,t.StreamReadUsage=35041,t.StringKeyframeTrack=tl,t.SubtractEquation=101,t.SubtractiveBlending=3,t.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},t.TangentSpaceNormalMap=0,t.TetrahedronBufferGeometry=To,t.TetrahedronGeometry=To,t.TextBufferGeometry=Eo,t.TextGeometry=Eo,t.Texture=bt,t.TextureLoader=pl,t.TorusBufferGeometry=Ao,t.TorusGeometry=Ao,t.TorusKnotBufferGeometry=Lo,t.TorusKnotGeometry=Lo,t.Triangle=je,t.TriangleFanDrawMode=2,t.TriangleStripDrawMode=1,t.TrianglesDrawMode=0,t.TubeBufferGeometry=Ro,t.TubeGeometry=Ro,t.UVMapping=i,t.Uint16Attribute=function(t,e){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new hn(t,e)},t.Uint16BufferAttribute=hn,t.Uint32Attribute=function(t,e){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new dn(t,e)},t.Uint32BufferAttribute=dn,t.Uint8Attribute=function(t,e){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new on(t,e)},t.Uint8BufferAttribute=on,t.Uint8ClampedAttribute=function(t,e){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new ln(t,e)},t.Uint8ClampedBufferAttribute=ln,t.Uniform=Zc,t.UniformsLib=ui,t.UniformsUtils=Zn,t.UnsignedByteType=x,t.UnsignedInt248Type=S,t.UnsignedIntType=w,t.UnsignedShort4444Type=1017,t.UnsignedShort5551Type=1018,t.UnsignedShort565Type=1019,t.UnsignedShortType=_,t.VSMShadowMap=3,t.Vector2=vt,t.Vector3=Lt,t.Vector4=St,t.VectorKeyframeTrack=el,t.Vertex=function(t,e,n){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new Lt(t,e,n)},t.VertexColors=2,t.VideoTexture=Aa,t.WebGL1Renderer=bs,t.WebGLCubeRenderTarget=ni,t.WebGLMultisampleRenderTarget=Et,t.WebGLRenderTarget=Tt,t.WebGLRenderTargetCube=function(t,e,n){return console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),new ni(t,n)},t.WebGLRenderer=ws,t.WebGLUtils=ms,t.WireframeGeometry=Co,t.WireframeHelper=function(t,e){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new ya(new Co(t.geometry),new ca({color:void 0!==e?e:16777215}))},t.WrapAroundEnding=W,t.XHRLoader=function(t){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new cl(t)},t.ZeroCurvatureEnding=k,t.ZeroFactor=200,t.ZeroSlopeEnding=V,t.ZeroStencilOp=0,t.sRGBEncoding=Y,Object.defineProperty(t,"__esModule",{value:!0})}));
</script>
<script src="vendor/vanta.clouds.min.js"></script>
<script>
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports._vantaEffect=t():e._vantaEffect=t()}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function i(o){if(t[o])return t[o].exports;var s=t[o]={i:o,l:!1,exports:{}};return e[o].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=e,i.c=t,i.d=function(e,t,o){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)i.d(o,s,function(t){return e[t]}.bind(null,s));return o},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=7)}([function(e,t,i){"use strict";function o(e,t){for(let i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e}function s(){return"undefined"!=typeof navigator?/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<600:null}i.d(t,"c",(function(){return o})),i.d(t,"e",(function(){return s})),i.d(t,"i",(function(){return n})),i.d(t,"h",(function(){return r})),i.d(t,"g",(function(){return h})),i.d(t,"f",(function(){return a})),i.d(t,"a",(function(){return u})),i.d(t,"b",(function(){return c})),i.d(t,"d",(function(){return l})),Number.prototype.clamp=function(e,t){return Math.min(Math.max(this,e),t)};const n=e=>e[Math.floor(Math.random()*e.length)];function r(e,t){return null==e&&(e=0),null==t&&(t=1),e+Math.random()*(t-e)}function h(e,t){return null==e&&(e=0),null==t&&(t=1),Math.floor(e+Math.random()*(t-e+1))}const a=e=>document.querySelector(e),u=e=>"number"==typeof e?"#"+("00000"+e.toString(16)).slice(-6):e,c=(e,t=1)=>{const i=u(e),o=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(i),s=o?{r:parseInt(o[1],16),g:parseInt(o[2],16),b:parseInt(o[3],16)}:null;return"rgba("+s.r+","+s.g+","+s.b+","+t+")"},l=e=>.299*e.r+.587*e.g+.114*e.b},function(e,t,i){"use strict";i.d(t,"a",(function(){return r}));var o=i(0);const s="object"==typeof window;let n=s&&window.THREE||{};s&&!window.VANTA&&(window.VANTA={});const r=s&&window.VANTA||{};r.register=(e,t)=>r[e]=e=>new t(e),r.version="0.5.21";const h=function(){return Array.prototype.unshift.call(arguments,"[VANTA]"),console.error.apply(this,arguments)};r.VantaBase=class{constructor(e={}){if(!s)return!1;r.current=this,this.windowMouseMoveWrapper=this.windowMouseMoveWrapper.bind(this),this.windowTouchWrapper=this.windowTouchWrapper.bind(this),this.windowGyroWrapper=this.windowGyroWrapper.bind(this),this.resize=this.resize.bind(this),this.animationLoop=this.animationLoop.bind(this),this.restart=this.restart.bind(this);const t="function"==typeof this.getDefaultOptions?this.getDefaultOptions():this.defaultOptions;if(this.options=Object(o.c)({mouseControls:!0,touchControls:!0,gyroControls:!1,minHeight:200,minWidth:200,scale:1,scaleMobile:1},t),(e instanceof HTMLElement||"string"==typeof e)&&(e={el:e}),Object(o.c)(this.options,e),this.options.THREE&&(n=this.options.THREE),this.el=this.options.el,null==this.el)h('Instance needs "el" param!');else if(!(this.options.el instanceof HTMLElement)){const e=this.el;if(this.el=Object(o.f)(e),!this.el)return void h("Cannot find element",e)}this.prepareEl(),this.initThree(),this.setSize();try{this.init()}catch(e){return h("Init error",e),this.renderer&&this.renderer.domElement&&this.el.removeChild(this.renderer.domElement),void(this.options.backgroundColor&&(console.log("[VANTA] Falling back to backgroundColor"),this.el.style.background=Object(o.a)(this.options.backgroundColor)))}this.initMouse(),this.resize(),this.animationLoop();const i=window.addEventListener;i("resize",this.resize),window.requestAnimationFrame(this.resize),this.options.mouseControls&&(i("scroll",this.windowMouseMoveWrapper),i("mousemove",this.windowMouseMoveWrapper)),this.options.touchControls&&(i("touchstart",this.windowTouchWrapper),i("touchmove",this.windowTouchWrapper)),this.options.gyroControls&&i("deviceorientation",this.windowGyroWrapper)}setOptions(e={}){Object(o.c)(this.options,e),this.triggerMouseMove()}prepareEl(){let e,t;if("undefined"!=typeof Node&&Node.TEXT_NODE)for(e=0;e<this.el.childNodes.length;e++){const t=this.el.childNodes[e];if(t.nodeType===Node.TEXT_NODE){const e=document.createElement("span");e.textContent=t.textContent,t.parentElement.insertBefore(e,t),t.remove()}}for(e=0;e<this.el.children.length;e++)t=this.el.children[e],"static"===getComputedStyle(t).position&&(t.style.position="relative"),"auto"===getComputedStyle(t).zIndex&&(t.style.zIndex=1);"static"===getComputedStyle(this.el).position&&(this.el.style.position="relative")}applyCanvasStyles(e,t={}){Object(o.c)(e.style,{position:"absolute",zIndex:0,top:0,left:0,background:""}),Object(o.c)(e.style,t),e.classList.add("vanta-canvas")}initThree(){n.WebGLRenderer?(this.renderer=new n.WebGLRenderer({alpha:!0,antialias:!0}),this.el.appendChild(this.renderer.domElement),this.applyCanvasStyles(this.renderer.domElement),isNaN(this.options.backgroundAlpha)&&(this.options.backgroundAlpha=1),this.scene=new n.Scene):console.warn("[VANTA] No THREE defined on window")}getCanvasElement(){return this.renderer?this.renderer.domElement:this.p5renderer?this.p5renderer.canvas:void 0}getCanvasRect(){const e=this.getCanvasElement();return!!e&&e.getBoundingClientRect()}windowMouseMoveWrapper(e){const t=this.getCanvasRect();if(!t)return!1;const i=e.clientX-t.left,o=e.clientY-t.top;i>=0&&o>=0&&i<=t.width&&o<=t.height&&(this.mouseX=i,this.mouseY=o,this.options.mouseEase||this.triggerMouseMove(i,o))}windowTouchWrapper(e){const t=this.getCanvasRect();if(!t)return!1;if(1===e.touches.length){const i=e.touches[0].clientX-t.left,o=e.touches[0].clientY-t.top;i>=0&&o>=0&&i<=t.width&&o<=t.height&&(this.mouseX=i,this.mouseY=o,this.options.mouseEase||this.triggerMouseMove(i,o))}}windowGyroWrapper(e){const t=this.getCanvasRect();if(!t)return!1;const i=Math.round(2*e.alpha)-t.left,o=Math.round(2*e.beta)-t.top;i>=0&&o>=0&&i<=t.width&&o<=t.height&&(this.mouseX=i,this.mouseY=o,this.options.mouseEase||this.triggerMouseMove(i,o))}triggerMouseMove(e,t){void 0===e&&void 0===t&&(this.options.mouseEase?(e=this.mouseEaseX,t=this.mouseEaseY):(e=this.mouseX,t=this.mouseY)),this.uniforms&&(this.uniforms.iMouse.value.x=e/this.scale,this.uniforms.iMouse.value.y=t/this.scale);const i=e/this.width,o=t/this.height;"function"==typeof this.onMouseMove&&this.onMouseMove(i,o)}setSize(){this.scale||(this.scale=1),Object(o.e)()&&this.options.scaleMobile?this.scale=this.options.scaleMobile:this.options.scale&&(this.scale=this.options.scale),this.width=Math.max(this.el.offsetWidth,this.options.minWidth),this.height=Math.max(this.el.offsetHeight,this.options.minHeight)}initMouse(){(!this.mouseX&&!this.mouseY||this.mouseX===this.options.minWidth/2&&this.mouseY===this.options.minHeight/2)&&(this.mouseX=this.width/2,this.mouseY=this.height/2,this.triggerMouseMove(this.mouseX,this.mouseY))}resize(){this.setSize(),this.camera&&(this.camera.aspect=this.width/this.height,"function"==typeof this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix()),this.renderer&&(this.renderer.setSize(this.width,this.height),this.renderer.setPixelRatio(window.devicePixelRatio/this.scale)),"function"==typeof this.onResize&&this.onResize()}isOnScreen(){const e=this.el.offsetHeight,t=this.el.getBoundingClientRect(),i=window.pageYOffset||(document.documentElement||document.body.parentNode||document.body).scrollTop,o=t.top+i;return o-window.innerHeight<=i&&i<=o+e}animationLoop(){return this.t||(this.t=0),this.t+=1,this.t2||(this.t2=0),this.t2+=this.options.speed||1,this.uniforms&&(this.uniforms.iTime.value=.016667*this.t2),this.options.mouseEase&&(this.mouseEaseX=this.mouseEaseX||this.mouseX||0,this.mouseEaseY=this.mouseEaseY||this.mouseY||0,Math.abs(this.mouseEaseX-this.mouseX)+Math.abs(this.mouseEaseY-this.mouseY)>.1&&(this.mouseEaseX+=.05*(this.mouseX-this.mouseEaseX),this.mouseEaseY+=.05*(this.mouseY-this.mouseEaseY),this.triggerMouseMove(this.mouseEaseX,this.mouseEaseY))),(this.isOnScreen()||this.options.forceAnimate)&&("function"==typeof this.onUpdate&&this.onUpdate(),this.scene&&this.camera&&(this.renderer.render(this.scene,this.camera),this.renderer.setClearColor(this.options.backgroundColor,this.options.backgroundAlpha)),this.fps&&this.fps.update&&this.fps.update(),"function"==typeof this.afterRender&&this.afterRender()),this.req=window.requestAnimationFrame(this.animationLoop)}restart(){if(this.scene)for(;this.scene.children.length;)this.scene.remove(this.scene.children[0]);"function"==typeof this.onRestart&&this.onRestart(),this.init()}init(){"function"==typeof this.onInit&&this.onInit()}destroy(){"function"==typeof this.onDestroy&&this.onDestroy();const e=window.removeEventListener;e("touchstart",this.windowTouchWrapper),e("touchmove",this.windowTouchWrapper),e("scroll",this.windowMouseMoveWrapper),e("mousemove",this.windowMouseMoveWrapper),e("deviceorientation",this.windowGyroWrapper),e("resize",this.resize),window.cancelAnimationFrame(this.req),this.renderer&&(this.renderer.domElement&&this.el.removeChild(this.renderer.domElement),this.renderer=null,this.scene=null),r.current===this&&(r.current=null)}},t.b=r.VantaBase},function(e,t,i){"use strict";i.d(t,"b",(function(){return r}));var o=i(1),s=i(0);i.d(t,"a",(function(){return o.a}));let n="object"==typeof window&&window.THREE;class r extends o.b{constructor(e){(n=e.THREE||n).Color.prototype.toVector=function(){return new n.Vector3(this.r,this.g,this.b)},super(e),this.updateUniforms=this.updateUniforms.bind(this)}init(){this.mode="shader",this.uniforms={iTime:{type:"f",value:1},iResolution:{type:"v2",value:new n.Vector2(1,1)},iDpr:{type:"f",value:window.devicePixelRatio||1},iMouse:{type:"v2",value:new n.Vector2(this.mouseX||0,this.mouseY||0)}},super.init(),this.fragmentShader&&this.initBasicShader()}setOptions(e){super.setOptions(e),this.updateUniforms()}initBasicShader(e=this.fragmentShader,t=this.vertexShader){t||(t="uniform float uTime;\nuniform vec2 uResolution;\nvoid main() {\n gl_Position = vec4( position, 1.0 );\n}"),this.updateUniforms(),"function"==typeof this.valuesChanger&&this.valuesChanger();const i=new n.ShaderMaterial({uniforms:this.uniforms,vertexShader:t,fragmentShader:e}),o=this.options.texturePath;o&&(this.uniforms.iTex={type:"t",value:(new n.TextureLoader).load(o)});const s=new n.Mesh(new n.PlaneGeometry(2,2),i);this.scene.add(s),this.camera=new n.Camera,this.camera.position.z=1}updateUniforms(){const e={};let t,i;for(t in this.options)i=this.options[t],-1!==t.toLowerCase().indexOf("color")?e[t]={type:"v3",value:new n.Color(i).toVector()}:"number"==typeof i&&(e[t]={type:"f",value:i});return Object(s.c)(this.uniforms,e)}resize(){super.resize(),this.uniforms.iResolution.value.x=this.width/this.scale,this.uniforms.iResolution.value.y=this.height/this.scale}}},,,,,function(e,t,i){"use strict";i.r(t);var o=i(2);class s extends o.b{}t.default=o.a.register("CLOUDS2",s),s.prototype.defaultOptions={backgroundColor:0,skyColor:6072010,cloudColor:3362176,lightColor:16777215,speed:1,texturePath:null,scaleMobile:4},s.prototype.fragmentShader="uniform vec2 iResolution;\nuniform vec2 iMouse;\nuniform float iTime;\nuniform sampler2D iTex;\nuniform float speed;\nuniform vec3 skyColor;\nuniform vec3 cloudColor;\nuniform vec3 lightColor;\n\n# define T texture2D(iTex, fract((s*p.zw + ceil(s*p.x)) / 200.0)).y / (s += s) * 4.0\n\nvoid main(){\n vec2 coord = gl_FragCoord.xy;\n vec4 p, d = vec4(0.8, 0, coord / iResolution.y - 0.65);\n vec3 out1 = skyColor - d.w; // sky gradient\n float s, f, t = 200.0 + sin(dot(coord,coord));\n const float MAX_ITER = 100.0;\n for (float i = 1.0; i <= MAX_ITER; i += 1.0) {\n t -= 2.0; if (t < 0.0) { break; } // march step\n p = 0.05 * t * d;\n p.xz += iTime * 0.50000 * speed; // movement through space\n p.x += sin(iTime * 0.25 * speed) * 0.25;\n s = 2.0;\n f = p.w + 1.0-T-T-T-T;\n // f = p.w + 1.0 - 0.25*noise(p.xyz * 2.0) - 0.25*noise(p.zxy * 2.01) - 0.25*noise(p.yzx * 2.03);\n if (f < 0.0) {\n vec3 cloudColorShading = mix(lightColor, cloudColor, -f);\n out1 = mix(out1, cloudColorShading, -f * 0.4);\n }\n }\n gl_FragColor = vec4(out1, 1.0);\n}"}])}));
</script>
<script src="vendor/clouds3d.js"></script>
<script>
/* Custom 2D WebGL cloud renderer.
* Much lighter than Vanta's volumetric raymarching while still
* GPU-accelerated. Renders a fullscreen quad and uses a custom
* fragment shader to produce animated cloud-like patterns.
*
* Drop-in replacement for Vanta when CONFIG.renderer === 'clouds2d'.
* Reads day/night palette + weather theme from window globals set
* by the parent (background.html's animate() loop).
*/
(function() {
function makeShader(gl, type, src) {
var s = gl.createShader(type);
gl.shaderSource(s, src);
gl.compileShader(s);
if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {
console.error('clouds2d: Shader compile error:', gl.getShaderInfoLog(s));
gl.deleteShader(s);
return null;
}
return s;
}
function makeProgram(gl, vsSrc, fsSrc) {
var vs = makeShader(gl, gl.VERTEX_SHADER, vsSrc);
var fs = makeShader(gl, gl.FRAGMENT_SHADER, fsSrc);
if (!vs || !fs) return null;
var p = gl.createProgram();
gl.attachShader(p, vs);
gl.attachShader(p, fs);
gl.linkProgram(p);
if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {
console.error('clouds2d: Program link error:', gl.getProgramInfoLog(p));
gl.deleteProgram(p);
return null;
}
return p;
}
var VERT_SRC = [
'attribute vec2 aPos;',
'void main() { gl_Position = vec4(aPos, 0.0, 1.0); }'
].join('\n');
// Fragment shader: animates an fBm cloud field, modulates density
// by weather, blends day/night palette colours, and adds a soft
// horizon gradient so the sky transitions naturally.
var FRAG_SRC = [
'precision highp float;',
'uniform vec2 uResolution;',
'uniform float uTime;',
'uniform vec3 uSky;',
'uniform vec3 uCloud;',
'uniform vec3 uCloudShadow;',
'uniform vec3 uLight;',
'uniform vec3 uBg;',
'uniform float uSpeed;',
'uniform float uDensity;', // 0..1 how thick the clouds are
'uniform float uDayProgress;', // 0..1 (day vs night)
'float hash(vec2 p) {',
'p = fract(p * vec2(123.34, 456.21));',
'p += dot(p, p + 45.32);',
'return fract(p.x * p.y);',
'}',
'float noise(vec2 p) {',
'vec2 i = floor(p);',
'vec2 f = fract(p);',
'float a = hash(i);',
'float b = hash(i + vec2(1.0, 0.0));',
'float c = hash(i + vec2(0.0, 1.0));',
'float d = hash(i + vec2(1.0, 1.0));',
'vec2 u = f * f * (3.0 - 2.0 * f);',
'return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;',
'}',
'float fbm(vec2 p) {',
'float v = 0.0;',
'float a = 0.5;',
'for (int i = 0; i < 5; i++) {',
'v += a * noise(p);',
'p *= 2.02;',
'a *= 0.5;',
'}',
'return v;',
'}',
'void main() {',
'vec2 uv = gl_FragCoord.xy / uResolution.xy;',
'vec2 p1 = uv * vec2(3.0, 1.7) + vec2(uTime * 0.012, uTime * 0.004);',
'vec2 p2 = uv * vec2(5.0, 2.6) + vec2(uTime * 0.020, -uTime * 0.006);',
'float n = fbm(p1 * uSpeed) * 0.6 + fbm(p2 * uSpeed) * 0.4;',
// Density threshold widens with uDensity (1 = always cloudy, 0 = clear sky)
'float thresh = mix(0.85, 0.30, uDensity);',
'float cloud = smoothstep(thresh - 0.10, thresh + 0.10, n);',
// Soft horizon: top of frame is more sky, bottom more clouds
'float horizon = smoothstep(0.0, 0.5, uv.y);',
// Sky gradient (top vs bottom)
'vec3 sky = mix(uBg, uSky, horizon);',
// Cloud body (lit top + shadow bottom)
'vec3 cloudCol = mix(uCloudShadow, uCloud, horizon);',
// Add light tint to the lit side
'cloudCol = mix(cloudCol, uLight, cloud * horizon * 0.4 * uDayProgress);',
// Final composite: sky where there's no cloud, cloud where there is
'vec3 col = mix(sky, cloudCol, cloud);',
// At night, blend everything toward bg color (darken)
'col = mix(col, mix(uBg, cloudCol, 0.3), (1.0 - uDayProgress) * 0.5);',
'gl_FragColor = vec4(col, 1.0);',
'}'
].join('\n');
function init(canvas) {
var gl = canvas.getContext('webgl', { antialias: false, alpha: false });
if (!gl) {
console.error('clouds2d: WebGL not available');
return null;
}
var prog = makeProgram(gl, VERT_SRC, FRAG_SRC);
if (!prog) return null;
var buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER,
new Float32Array([ -1,-1, 3,-1, -1,3 ]),
gl.STATIC_DRAW);
var aPos = gl.getAttribLocation(prog, 'aPos');
var uRes = gl.getUniformLocation(prog, 'uResolution');
var uTime = gl.getUniformLocation(prog, 'uTime');
var uSky = gl.getUniformLocation(prog, 'uSky');
var uCloud = gl.getUniformLocation(prog, 'uCloud');
var uCloudShadow = gl.getUniformLocation(prog, 'uCloudShadow');
var uLight = gl.getUniformLocation(prog, 'uLight');
var uBg = gl.getUniformLocation(prog, 'uBg');
var uSpeed = gl.getUniformLocation(prog, 'uSpeed');
var uDensity = gl.getUniformLocation(prog, 'uDensity');
var uDayProgress = gl.getUniformLocation(prog, 'uDayProgress');
return {
gl: gl, prog: prog, buf: buf, aPos: aPos,
uRes: uRes, uTime: uTime, uSky: uSky, uCloud: uCloud,
uCloudShadow: uCloudShadow, uLight: uLight, uBg: uBg,
uSpeed: uSpeed, uDensity: uDensity, uDayProgress: uDayProgress
};
}
// Convert 24-bit int (0xRRGGBB) to [r,g,b] 0..1 floats.
// Theme-agnostic: caller decides what colour value to pass in.
function hex(rgb) {
return [((rgb >> 16) & 255) / 255,
((rgb >> 8) & 255) / 255,
(rgb & 255) / 255];
}
// Cloud density per weather (0 = clear, 1 = overcast).
// Names mirror the weather themes defined in background.html.
var WEATHER_DENSITY = {
sunny: 0.20,
cloudy: 0.70,
stormy: 1.00,
night: 0.45
};
window.clouds2dRender = function(target) {
if (!target || typeof target !== 'object') {
console.error('clouds2d: invalid target');
return;
}
var canvas = target.__clouds2dCanvas;
if (!canvas) {
canvas = document.createElement('canvas');
canvas.style.position = 'absolute';
canvas.style.top = '0';
canvas.style.left = '0';
canvas.style.width = '100%';
canvas.style.height = '100%';
while (target.firstChild) target.removeChild(target.firstChild);
target.appendChild(canvas);
target.style.position = 'relative';
target.__clouds2dCanvas = canvas;
}
if (!canvas.__state) {
canvas.__state = init(canvas);
if (!canvas.__state) return;
}
var s = canvas.__state;
var gl = s.gl;
canvas.width = target.clientWidth || window.innerWidth;
canvas.height = target.clientHeight || window.innerHeight;
gl.viewport(0, 0, canvas.width, canvas.height);
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(s.prog);
gl.bindBuffer(gl.ARRAY_BUFFER, s.buf);
gl.enableVertexAttribArray(s.aPos);
gl.vertexAttribPointer(s.aPos, 2, gl.FLOAT, false, 0, 0);
gl.uniform2f(s.uRes, canvas.width, canvas.height);
gl.uniform1f(s.uTime, performance.now() / 1000);
// Pull palette + weather from globals (set by animate() in background.html).
// No hardcoded fallbacks: until the parent has published a palette we
// skip the draw and leave the WebGL context cleared. This keeps the
// renderer 100% theme-agnostic — the parent fully owns colour decisions.
var pal = window.__currentPalette;
if (!pal) {
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
return;
}
var weather = window.__currentWeatherName;
var dayProgress = window.__currentDayProgress;
var themeSpeed = window.__currentThemeSpeed;
gl.uniform3fv(s.uSky, hex(pal.sky));
gl.uniform3fv(s.uCloud, hex(pal.cloud));
gl.uniform3fv(s.uCloudShadow, hex(pal.cloudShadow !== undefined ? pal.cloudShadow : pal.sky));
gl.uniform3fv(s.uLight, hex(pal.light));
gl.uniform3fv(s.uBg, hex(pal.bg));
var density = (weather && WEATHER_DENSITY[weather] !== undefined)
? WEATHER_DENSITY[weather] : 0.5;
gl.uniform1f(s.uDensity, density);
var day = (typeof dayProgress === 'number')
? Math.max(0, Math.min(1, dayProgress)) : 0.5;
gl.uniform1f(s.uDayProgress, day);
var speed = (typeof themeSpeed === 'number')
? Math.max(0.1, Math.min(3, themeSpeed)) : 1.0;
gl.uniform1f(s.uSpeed, speed);
gl.drawArrays(gl.TRIANGLES, 0, 3);
};
})();
</script>
<script>
window.__clouds2dStarted = true;
try {
var noiseDataUri = 'data:image/png;base64,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';
var renderer = (window.CONFIG && window.CONFIG.renderer) || 'vanta';
var useVanta = (renderer !== 'clouds2d' && renderer !== 'clouds3d');
var effect;
if (useVanta && typeof VANTA !== 'undefined') {
effect = (VANTA.CLOUDS2 || VANTA.CLOUDS)({
el: "#vanta",
mouseControls: false,
touchControls: false,
gyroControls: false,
minHeight: 200.00,
minWidth: 200.00,
scale: 1.00,
scaleMobile: 4,
speed: 1.0,
backgroundColor: 0x1c1b1f,
backgroundAlpha: 1,
skyColor: 0x3a4458,
cloudColor: 0x6d6a63,
lightColor: 0xe6dfd1,
texturePath: noiseDataUri
}) || { setOptions: function() {} };
} else {
// Pick the right renderer based on CONFIG.renderer
var _renderFn = (renderer === 'clouds3d' && window.clouds3dRender)
? window.clouds3dRender
: window.clouds2dRender;
effect = { setOptions: function() {} };
function c2dRender() {
var c2dCanvas = document.getElementById('vanta');
if (!c2dCanvas) return;
if (typeof _renderFn === 'function') {
_renderFn(c2dCanvas);
}
}
c2dRender();
window.addEventListener('resize', c2dRender);
// Continuously update animation via rAF
function c2dLoop() {
c2dRender();
window._clouds2dRaf = requestAnimationFrame(c2dLoop);
}
window._clouds2dRaf = requestAnimationFrame(c2dLoop);
}
function hexToRgb(h) {
return [(h >> 16) & 255, (h >> 8) & 255, h & 255];
}
function rgbToHex(r, g, b) {
return (Math.round(r) << 16) | (Math.round(g) << 8) | Math.round(b);
}
function lerp(a, b, t) {
return a + (b - a) * t;
}
function lerpColor(c1, c2, t) {
var a = hexToRgb(c1), b = hexToRgb(c2);
return rgbToHex(lerp(a[0], b[0], t), lerp(a[1], b[1], t), lerp(a[2], b[2], t));
}
function smooth(t) {
return t * t * (3 - 2 * t);
}
var CYCLE = 20000;
var PASSAU_LAT = (window.CONFIG && window.CONFIG.location && window.CONFIG.location.lat) || 48.5667;
var PASSAU_LON = (window.CONFIG && window.CONFIG.location && window.CONFIG.location.lon) || 13.4319;
var realDayProgress = 0;
// Read color palette from CSS variables
function getColors() {
var root = getComputedStyle(document.documentElement);
var keys = [
'void', 'panel', 'raised', 'border', 'mid', 'ash',
'icon', 'stone', 'bone', 'chalk',
'ember', 'gold', 'blood', 'rust', 'rot', 'moss', 'steel', 'steelLight', 'violet'
];
var map = {
void: 'black',
panel: 'dark',
raised: 'gray-darker',
border: 'gray-dark',
mid: 'gray',
ash: 'gray-light',
ember: 'orange',
gold: 'yellow',
blood: 'red',
rust: 'brown',
rot: 'pink',
moss: 'green',
steel: 'blue',
steelLight: 'blue-light',
violet: 'purple'
};
var result = {};
for (var i = 0; i < keys.length; i++) {
var ashKey = keys[i];
var cssKey = map[ashKey] || ashKey;
result[ashKey] = root.getPropertyValue('--' + cssKey).trim();
}
return result;
}
function hexToInt(hex) {
return parseInt(hex.replace('#', ''), 16);
}
// Refreshable color cache - re-reads from CSS variables when theme changes
function getColors() {
var root = getComputedStyle(document.documentElement);
var keys = [
'void', 'panel', 'raised', 'border', 'mid', 'ash',
'icon', 'stone', 'bone', 'chalk',
'ember', 'gold', 'blood', 'rust', 'rot', 'moss', 'steel', 'steelLight', 'violet'
];
var map = {
void: 'black',
panel: 'dark',
raised: 'gray-darker',
border: 'gray-dark',
mid: 'gray',
ash: 'gray-light',
ember: 'orange',
gold: 'yellow',
blood: 'red',
rust: 'brown',
rot: 'pink',
moss: 'green',
steel: 'blue',
steelLight: 'blue-light',
violet: 'purple'
};
var result = {};
for (var i = 0; i < keys.length; i++) {
var ashKey = keys[i];
var cssKey = map[ashKey] || ashKey;
result[ashKey] = root.getPropertyValue('--' + cssKey).trim();
}
return result;
}
var ASH = getColors();
function rebuildFromColors() {
ASH = getColors();
// Rebuild palette
window.sunPalettes = [
{ alt: -Math.PI / 2, sky: hexToInt(ASH.void), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.void), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone), sunVis: 0 },
{ alt: -0.1, sky: hexToInt(ASH.panel), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.panel), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone), sunVis: 0 },
{ alt: 0.0, sky: hexToInt(ASH.rust), cloud: hexToInt(ASH.border), light: hexToInt(ASH.gold), bg: hexToInt(ASH.rust), cloudShadow: hexToInt(ASH.raised), sun: hexToInt(ASH.ember), sunGlare: hexToInt(ASH.gold), sunLight: hexToInt(ASH.ember), sunVis: 0.8 },
{ alt: 0.15, sky: hexToInt(ASH.blood), cloud: hexToInt(ASH.border), light: hexToInt(ASH.ember), bg: hexToInt(ASH.blood), cloudShadow: hexToInt(ASH.raised), sun: hexToInt(ASH.ember), sunGlare: hexToInt(ASH.ember), sunLight: hexToInt(ASH.ember), sunVis: 0.7 },
{ alt: 0.4, sky: hexToInt(ASH.steel), cloud: hexToInt(ASH.border), light: hexToInt(ASH.bone), bg: hexToInt(ASH.steel), cloudShadow: hexToInt(ASH.steel), sun: hexToInt(ASH.chalk), sunGlare: hexToInt(ASH.bone), sunLight: hexToInt(ASH.chalk), sunVis: 1 },
{ alt: Math.PI / 2, sky: hexToInt(ASH.steelLight), cloud: hexToInt(ASH.border), light: hexToInt(ASH.chalk), bg: hexToInt(ASH.steelLight), cloudShadow: hexToInt(ASH.steelLight), sun: hexToInt(ASH.chalk), sunGlare: hexToInt(ASH.bone), sunLight: hexToInt(ASH.chalk), sunVis: 1 }
];
window.nightPaletteNew = { sky: hexToInt(ASH.void), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.void), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone) };
window.nightPaletteFull = { sky: hexToInt(ASH.panel), cloud: hexToInt(ASH.border), light: hexToInt(ASH.icon), bg: hexToInt(ASH.panel), cloudShadow: hexToInt(ASH.panel), sun: hexToInt(ASH.icon), sunGlare: hexToInt(ASH.mid), sunLight: hexToInt(ASH.icon) };
window.weatherThemes = {
sunny: {
skyColor: hexToInt(ASH.steelLight),
cloudColor: hexToInt(ASH.stone),
lightColor: hexToInt(ASH.chalk),
backgroundColor: hexToInt(ASH.mid),
speed: 1.0
},
cloudy: {
skyColor: hexToInt(ASH.steel),
cloudColor: hexToInt(ASH.mid),
lightColor: hexToInt(ASH.bone),
backgroundColor: hexToInt(ASH.border),
speed: 1.2
},
stormy: {
skyColor: hexToInt(ASH.steel),
cloudColor: hexToInt(ASH.panel),
lightColor: hexToInt(ASH.stone),
backgroundColor: hexToInt(ASH.void),
speed: 2.5
},
night: {
skyColor: hexToInt(ASH.void),
cloudColor: hexToInt(ASH.raised),
lightColor: hexToInt(ASH.icon),
backgroundColor: hexToInt(ASH.void),
speed: 0.4
}
};
}
// Sun position palette (altitude-based) - all colors from Ash palette
// altitude in radians: -pi/2 (below) to pi/2 (zenith)
// Sun position palette (altitude-based) - all colors from current theme
// altitude in radians: -pi/2 (below) to pi/2 (zenith)
window.sunPalettes = [
{ alt: -Math.PI / 2, sky: hexToInt(ASH.void), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.void), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone), sunVis: 0 },
{ alt: -0.1, sky: hexToInt(ASH.panel), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.panel), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone), sunVis: 0 },
{ alt: 0.0, sky: hexToInt(ASH.rust), cloud: hexToInt(ASH.border), light: hexToInt(ASH.gold), bg: hexToInt(ASH.rust), cloudShadow: hexToInt(ASH.raised), sun: hexToInt(ASH.ember), sunGlare: hexToInt(ASH.gold), sunLight: hexToInt(ASH.ember), sunVis: 0.8 },
{ alt: 0.15, sky: hexToInt(ASH.blood), cloud: hexToInt(ASH.border), light: hexToInt(ASH.ember), bg: hexToInt(ASH.blood), cloudShadow: hexToInt(ASH.raised), sun: hexToInt(ASH.ember), sunGlare: hexToInt(ASH.ember), sunLight: hexToInt(ASH.ember), sunVis: 0.7 },
{ alt: 0.4, sky: hexToInt(ASH.steel), cloud: hexToInt(ASH.border), light: hexToInt(ASH.bone), bg: hexToInt(ASH.steel), cloudShadow: hexToInt(ASH.steel), sun: hexToInt(ASH.chalk), sunGlare: hexToInt(ASH.bone), sunLight: hexToInt(ASH.chalk), sunVis: 1 },
{ alt: Math.PI / 2, sky: hexToInt(ASH.steelLight), cloud: hexToInt(ASH.border), light: hexToInt(ASH.chalk), bg: hexToInt(ASH.steelLight), cloudShadow: hexToInt(ASH.steelLight), sun: hexToInt(ASH.chalk), sunGlare: hexToInt(ASH.bone), sunLight: hexToInt(ASH.chalk), sunVis: 1 }
];
// Night palette based on moon phase (0 = new, 0.5 = full, 1 = new) - Ash colors
window.nightPaletteNew = { sky: hexToInt(ASH.void), cloud: hexToInt(ASH.void), light: hexToInt(ASH.stone), bg: hexToInt(ASH.void), cloudShadow: hexToInt(ASH.void), sun: hexToInt(ASH.stone), sunGlare: hexToInt(ASH.ash), sunLight: hexToInt(ASH.stone) };
window.nightPaletteFull = { sky: hexToInt(ASH.panel), cloud: hexToInt(ASH.border), light: hexToInt(ASH.icon), bg: hexToInt(ASH.panel), cloudShadow: hexToInt(ASH.panel), sun: hexToInt(ASH.icon), sunGlare: hexToInt(ASH.mid), sunLight: hexToInt(ASH.icon) };
var MIN_NIGHT_BRIGHTNESS = 0.25; // minimum night brightness (even at new moon)
function getDayColor(sunAlt) {
// Find palette segment based on sun altitude
var palette;
if (sunAlt <= window.sunPalettes[0].alt) {
palette = window.sunPalettes[0];
} else if (sunAlt >= window.sunPalettes[window.sunPalettes.length - 1].alt) {
palette = window.sunPalettes[window.sunPalettes.length - 1];
} else {
for (var i = 0; i < window.sunPalettes.length - 1; i++) {
if (sunAlt >= window.sunPalettes[i].alt && sunAlt <= window.sunPalettes[i + 1].alt) {
var span = window.sunPalettes[i + 1].alt - window.sunPalettes[i].alt;
var localT = span === 0 ? 0 : (sunAlt - window.sunPalettes[i].alt) / span;
var s = smooth(localT);
palette = {
sky: lerpColor(window.sunPalettes[i].sky, window.sunPalettes[i + 1].sky, s),
cloud: lerpColor(window.sunPalettes[i].cloud, window.sunPalettes[i + 1].cloud, s),
light: lerpColor(window.sunPalettes[i].light, window.sunPalettes[i + 1].light, s),
bg: lerpColor(window.sunPalettes[i].bg, window.sunPalettes[i + 1].bg, s),
cloudShadow: lerpColor(window.sunPalettes[i].cloudShadow, window.sunPalettes[i + 1].cloudShadow, s),
sun: lerpColor(window.sunPalettes[i].sun, window.sunPalettes[i + 1].sun, s),
sunGlare: lerpColor(window.sunPalettes[i].sunGlare, window.sunPalettes[i + 1].sunGlare, s),
sunLight: lerpColor(window.sunPalettes[i].sunLight, window.sunPalettes[i + 1].sunLight, s),
sunVis: window.sunPalettes[i].sunVis + (window.sunPalettes[i + 1].sunVis - window.sunPalettes[i].sunVis) * s
};
break;
}
}
}
return palette;
}
function getNightColor(moonIllum) {
// moonIllum.fraction: 0 (new moon) to 1 (full moon)
// Interpolate between new and full moon palette based on fraction
var s = moonIllum.fraction;
var c = {
sky: lerpColor(window.nightPaletteNew.sky, window.nightPaletteFull.sky, s),
cloud: lerpColor(window.nightPaletteNew.cloud, window.nightPaletteFull.cloud, s),
light: lerpColor(window.nightPaletteNew.light, window.nightPaletteFull.light, s),
bg: lerpColor(window.nightPaletteNew.bg, window.nightPaletteFull.bg, s),
cloudShadow: lerpColor(window.nightPaletteNew.cloudShadow, window.nightPaletteFull.cloudShadow, s),
sun: lerpColor(window.nightPaletteNew.sun, window.nightPaletteFull.sun, s),
sunGlare: lerpColor(window.nightPaletteNew.sunGlare, window.nightPaletteFull.sunGlare, s),
sunLight: lerpColor(window.nightPaletteNew.sunLight, window.nightPaletteFull.sunLight, s)
};
// Pull the whole night palette down by 'darkness' (a value
// 0..1 toward pure black) so new-moon skies are visibly darker
// than day, and full-moon skies still have some colour.
var darkness = 1.0 - (MIN_NIGHT_BRIGHTNESS + (1 - MIN_NIGHT_BRIGHTNESS) * s);
return {
sky: shiftColor(c.sky, -Math.round(255 * darkness * 0.6)),
cloud: shiftColor(c.cloud, -Math.round(255 * darkness * 0.6)),
light: shiftColor(c.light, -Math.round(255 * darkness * 0.6)),
bg: shiftColor(c.bg, -Math.round(255 * darkness * 0.6)),
cloudShadow: c.cloudShadow,
sun: c.sun,
sunGlare: c.sunGlare,
sunLight: c.sunLight
};
}
function getColor(t) {
// t is no longer used - now uses real sun/moon
var now = new Date();
var sunPos = SunCalc.getPosition(now, PASSAU_LAT, PASSAU_LON);
var moonIllum = SunCalc.getMoonIllumination(now);
// The day palette covers sunAlt down to sunPalettes[0].alt
// (-pi/2, deep below horizon). Only below that do we hand off
// to the moon-based night palette. This makes twilight a
// smooth transition through the day palette entries.
if (sunPos.altitude > window.sunPalettes[0].alt) {
return getDayColor(sunPos.altitude);
} else {
return getNightColor(moonIllum);
}
}
function adjustColor(color, factor) {
var r = Math.min(255, Math.floor(((color >> 16) & 255) * factor));
var g = Math.min(255, Math.floor(((color >> 8) & 255) * factor));
var b = Math.min(255, Math.floor((color & 255) * factor));
return (r << 16) | (g << 8) | b;
}
function shiftColor(color, delta) {
var r = Math.max(0, Math.min(255, ((color >> 16) & 255) + delta));
var g = Math.max(0, Math.min(255, ((color >> 8) & 255) + delta));
var b = Math.max(0, Math.min(255, (color & 255) + delta));
return (r << 16) | (g << 8) | b;
}
function getWeatherModifiers(code) {
// Returns {cloudDark: factor, cloudLight: factor, skyShift: shift, bgShift: shift}
// code is WMO weather code from open-meteo
if (code === 0) {
// Clear sky - lighter clouds, brighter sky
return { cloudDark: 0.7, cloudLight: 1.3, skyShift: 15, bgShift: 15 };
} else if (code >= 1 && code <= 3) {
// Mainly clear to overcast - neutral
return { cloudDark: 0.95, cloudLight: 1.0, skyShift: 0, bgShift: -5 };
} else if (code === 45 || code === 48) {
// Fog - cool, washed out
return { cloudDark: 1.1, cloudLight: 0.85, skyShift: 10, bgShift: 10 };
} else if ((code >= 51 && code <= 57) || (code >= 61 && code <= 67)) {
// Drizzle / Rain - darker, slightly cooler
return { cloudDark: 1.3, cloudLight: 0.7, skyShift: -15, bgShift: -20 };
} else if ((code >= 71 && code <= 77) || (code >= 85 && code <= 86)) {
// Snow - brighter (light reflection)
return { cloudDark: 0.7, cloudLight: 1.5, skyShift: 25, bgShift: 25 };
} else if (code >= 80 && code <= 82) {
// Rain showers - darker
return { cloudDark: 1.4, cloudLight: 0.6, skyShift: -20, bgShift: -25 };
} else if (code >= 95) {
// Thunderstorm - very dark, dramatic
return { cloudDark: 1.6, cloudLight: 0.4, skyShift: -30, bgShift: -35 };
}
return { cloudDark: 1.0, cloudLight: 1.0, skyShift: 0, bgShift: 0 };
}
var currentWeatherCode = -1;
function applyWeatherModifiers(c, code) {
var m = getWeatherModifiers(code);
return {
sky: c.sky,
cloud: adjustColor(c.cloud, m.cloudLight),
cloudShadow: adjustColor(c.cloudShadow, m.cloudDark),
sun: adjustColor(c.sun, m.cloudLight),
sunGlare: adjustColor(c.sunGlare, m.cloudLight),
sunLight: adjustColor(c.sunLight, m.cloudLight),
bg: shiftColor(c.bg, m.bgShift),
sunVis: c.sunVis
};
}
// ============ Clock & Sun/Moon Calculations ============
var hourHand = document.getElementById('hour-hand');
var minuteHand = document.getElementById('minute-hand');
var secondHand = document.getElementById('second-hand');
var hourMarks = document.getElementById('hour-marks');
var rpgSunArc = document.getElementById('sun-arc');
var rpgMoonArc = document.getElementById('moon-arc');
var rpgSun = document.getElementById('rpg-sun');
var rpgSunGlow = document.getElementById('rpg-sun-glow');
var rpgSunCore = document.getElementById('rpg-sun-core');
var rpgMoon = document.getElementById('rpg-moon');
var rpgMoonLit = document.getElementById('rpg-moon-lit');
var rpgMoonDark = document.getElementById('rpg-moon-dark');
var sunRiseArrow = document.getElementById('sun-rise-arrow');
var sunSetArrow = document.getElementById('sun-set-arrow');
var moonRiseArrow = document.getElementById('moon-rise-arrow');
var moonsetArrow = document.getElementById('moon-set-arrow');
var sunZenithMarker = document.getElementById('sun-zenith-marker');
var SUN_ORBIT_RADIUS = 65;
var MOON_ORBIT_RADIUS = 88;
// Generate hour marks
for (var i = 0; i < 12; i++) {
var angle = (i * 30) * Math.PI / 180;
var isMain = i % 3 === 0;
var innerR = isMain ? 118 : 122;
var outerR = isMain ? 130 : 128;
var x1 = 140 + Math.sin(angle) * innerR;
var y1 = 140 - Math.cos(angle) * innerR;
var x2 = 140 + Math.sin(angle) * outerR;
var y2 = 140 - Math.cos(angle) * outerR;
var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
line.setAttribute('x1', x1);
line.setAttribute('y1', y1);
line.setAttribute('x2', x2);
line.setAttribute('y2', y2);
line.setAttribute('stroke', ASH.bone);
line.setAttribute('stroke-width', isMain ? 5 : 3);
line.setAttribute('stroke-linecap', 'round');
hourMarks.appendChild(line);
}
function formatTimeHM(date) {
if (!date || isNaN(date.getTime())) return '--:--';
var h = date.getHours();
var m = date.getMinutes();
return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m;
}
function formatTimeHMS(h, m, s) {
return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;
}
function pad2(n) { return n < 10 ? '0' + n : '' + n; }
function pad3(n) { return n < 10 ? '00' + n : n < 100 ? '0' + n : '' + n; }
function formatDateTime(format, date) {
// Strict ISO 8601 format tokens (case-sensitive):
// YYYY 4-digit year (2026)
// MM month 01-12 (10) -- always month, never minute
// DD day 01-31 (07)
// HH hour 00-23 (14)
// mm minute 00-59 (35) -- lowercase
// ss second 00-59 (22) -- lowercase
// sss millisecond 000-999 (456)
// T literal 'T'
// Any other character is a literal (including whitespace).
//
// Non-standard extension tokens (lookup in i18n dict):
// DDD weekday short name (Mo., Tu., ...) from i18n
// dddd weekday full name (Monday, Tuesday,...) from i18n
// MMM month short name (Jan., Feb., ...) from i18n
// MMMM month full name (January, ...) from i18n
//
// Escape sequences are also evaluated:
// \n newline
// \t tab
// \\ literal backslash
var result = '';
var i = 0;
var weekdayKeys = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var weekdayFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var monthKeys = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
while (i < format.length) {
var ch = format.charAt(i);
// Handle escape sequences \n, \t, \\
if (ch === '\\' && i + 1 < format.length) {
var next = format.charAt(i + 1);
if (next === 'n') result += '\n';
else if (next === 't') result += '\t';
else if (next === '\\') result += '\\';
else result += ch + next;
i += 2;
continue;
}
if (ch === 'Y' && format.substr(i, 4) === 'YYYY') {
result += date.getFullYear();
i += 4;
} else if (ch === 'Y') {
result += date.getFullYear();
i += 1;
} else if (ch === 'M' && format.substr(i, 4) === 'MMMM') {
var tMonthFull = t(monthKeys[date.getMonth()]);
console.log('MMMM token', date.getMonth(), '->', tMonthFull, 'lang=', window.CONFIG && window.CONFIG.language);
result += tMonthFull;
i += 4;
} else if (ch === 'M' && format.substr(i, 3) === 'MMM') {
result += t(monthKeys[date.getMonth()].substring(0, 3));
i += 3;
} else if (ch === 'M' && format.substr(i, 2) === 'MM') {
result += pad2(date.getMonth() + 1);
i += 2;
} else if (ch === 'D' && format.substr(i, 4) === 'dddd') {
result += t(weekdayFull[date.getDay()]);
i += 4;
} else if (ch === 'D' && format.substr(i, 3) === 'DDD') {
result += t(weekdayKeys[date.getDay()]);
i += 3;
} else if (ch === 'D' && format.substr(i, 2) === 'DD') {
result += pad2(date.getDate());
i += 2;
} else if (ch === 'H' && format.substr(i, 2) === 'HH') {
result += pad2(date.getHours());
i += 2;
} else if (ch === 'm' && format.substr(i, 2) === 'mm') {
result += pad2(date.getMinutes());
i += 2;
} else if (ch === 's' && format.substr(i, 3) === 'sss') {
result += pad3(date.getMilliseconds());
i += 3;
} else if ((ch === 's' || ch === 'S') && format.substr(i, 2).toLowerCase() === 'ss') {
result += pad2(date.getSeconds());
i += 2;
} else if (ch === 'a' && format.substr(i, 4) === 'aaaa') {
// Full am/pm text (lowercase)
result += date.getHours() < 12 ? 'am' : 'pm';
i += 4;
} else if (ch === 'A' && format.substr(i, 4) === 'AAAA') {
// Full AM/PM text (uppercase)
result += date.getHours() < 12 ? 'AM' : 'PM';
i += 4;
} else if (ch === 'a') {
// am/pm (lowercase)
result += date.getHours() < 12 ? 'am' : 'pm';
i += 1;
} else if (ch === 'A') {
// AM/PM (uppercase)
result += date.getHours() < 12 ? 'AM' : 'PM';
i += 1;
} else {
result += ch;
i += 1;
}
}
return result;
}
function formatDateShort(date) {
var d = date.getDate();
var mo = date.getMonth() + 1;
return (d < 10 ? '0' : '') + d + '.' + (mo < 10 ? '0' : '') + mo + '.';
}
function formatDateLong(date) {
var days = ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'];
var d = date.getDate();
var mo = date.getMonth() + 1;
return days[date.getDay()] + ' ' + (d < 10 ? '0' : '') + d + '.' + (mo < 10 ? '0' : '') + mo + '.';
}
function getNextEvent(todayEvent, now, lat, lon, type) {
if (!todayEvent || isNaN(todayEvent.getTime())) {
return { date: null, label: '' };
}
if (todayEvent > now) {
return { date: todayEvent, label: 'heute' };
}
for (var d = 1; d <= 7; d++) {
var nextDate = new Date(now);
nextDate.setDate(nextDate.getDate() + d);
var times = type.indexOf('moon') === 0 ? SunCalc.getMoonTimes(nextDate, lat, lon) : SunCalc.getTimes(nextDate, lat, lon);
var ev = type === 'moonrise' ? times.rise : type === 'moonset' ? times.set : times[type];
if (ev && !isNaN(ev.getTime())) {
var dayLabel = d === 1 ? t('tomorrow') : formatDateLong(nextDate);
return { date: ev, label: dayLabel };
}
}
return { date: null, label: '' };
}
function getMoonPhaseText(phase) {
var p = phase;
var keys = ['New Moon', 'Waxing Crescent', 'First Quarter', 'Waxing Gibbous',
'Full Moon', 'Waning Gibbous', 'Last Quarter', 'Waning Crescent'];
var idx;
if (p < 0.0625 || p >= 0.9375) idx = 0;
else if (p < 0.1875) idx = 1;
else if (p < 0.3125) idx = 2;
else if (p < 0.4375) idx = 3;
else if (p < 0.5625) idx = 4;
else if (p < 0.6875) idx = 5;
else if (p < 0.8125) idx = 6;
else idx = 7;
return t(keys[idx]);
}
var CENTER_X = 140;
var CENTER_Y = 140;
function angleForTime(date) {
// 0:00 = bottom, 6:00 = left, 12:00 = top, 18:00 = right
var hours = date.getHours() + date.getMinutes() / 60;
return ((hours / 24) * 360 + 90) * Math.PI / 180;
}
// The Moon advances ~12.19° per day relative to the Sun (synodic month
// ~29.53 days). Use SunCalc.getMoonIllumination().phase as the offset.
// phase=0: New moon (same direction as Sun)
// phase=0.5: Full moon (opposite the Sun)
function moonAngleForTime(date) {
var moonIllum = SunCalc.getMoonIllumination(date);
var hours = date.getHours() + date.getMinutes() / 60;
var hourAngle = (hours / 24) * 360 + 90;
// Moon is roughly at hourAngle + phase * 360
return ((hourAngle + moonIllum.phase * 360) % 360) * Math.PI / 180;
}
function pointOnCircle(date, radius) {
var angle = angleForTime(date);
return {
x: CENTER_X + Math.cos(angle) * radius,
y: CENTER_Y + Math.sin(angle) * radius
};
}
function arcBetween(startDate, endDate, radius) {
var sp = pointOnCircle(startDate, radius);
var ep = pointOnCircle(endDate, radius);
var startA = angleForTime(startDate) * 180 / Math.PI;
var endA = angleForTime(endDate) * 180 / Math.PI;
var diff = endA - startA;
if (diff < 0) diff += 360;
var largeArc = diff > 180 ? 1 : 0;
return 'M ' + sp.x + ' ' + sp.y + ' A ' + radius + ' ' + radius + ' 0 ' + largeArc + ' 1 ' + ep.x + ' ' + ep.y;
}
function getMoonPosition(now, moonTimes) {
try {
var rise = moonTimes.rise;
var set = moonTimes.set;
if (!rise || !set) {
return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
}
var isVisible;
if (rise <= set) {
isVisible = (now >= rise && now <= set);
} else {
isVisible = (now >= rise || now <= set);
}
if (!isVisible) {
return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
}
var riseAngle = angleForTime(rise);
var setAngle = angleForTime(set);
var diff = setAngle - riseAngle;
if (diff > Math.PI) diff -= 2 * Math.PI;
if (diff < -Math.PI) diff += 2 * Math.PI;
var progress;
if (rise <= set) {
progress = (now.getTime() - rise.getTime()) / (set.getTime() - rise.getTime());
} else {
if (now >= rise) {
var endMs = set.getTime() + 24 * 3600 * 1000;
progress = (now.getTime() - rise.getTime()) / (endMs - rise.getTime());
} else {
progress = (now.getTime() + 24 * 3600 * 1000 - rise.getTime()) /
(set.getTime() + 24 * 3600 * 1000 - rise.getTime());
}
}
var moonAngle = riseAngle + diff * progress;
return {
point: {
x: CENTER_X + Math.cos(moonAngle) * MOON_ORBIT_RADIUS,
y: CENTER_Y + Math.sin(moonAngle) * MOON_ORBIT_RADIUS
},
isVisible: true
};
} catch (e) {
return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
}
}
function renderMoonPhaseIcon(phase, fraction) {
var icon = document.getElementById('moon-phase-icon');
icon.innerHTML = '';
var r = 9;
var bg = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
bg.setAttribute('cx', '12'); bg.setAttribute('cy', '12'); bg.setAttribute('r', r);
bg.setAttribute('fill', ASH.panel);
bg.setAttribute('stroke', ASH.stone);
bg.setAttribute('stroke-width', '0.5');
icon.appendChild(bg);
var rx = r * (1 - 2 * fraction);
var path;
if (phase < 0.5) {
if (rx > 0) {
path = 'M 12 3 A 9 9 0 0 0 12 21 A ' + rx + ' 9 0 0 1 12 3 Z';
} else {
path = 'M 12 3 A 9 9 0 0 0 12 21 A ' + Math.abs(rx) + ' 9 0 0 0 12 3 Z';
}
} else {
if (rx > 0) {
path = 'M 12 3 A 9 9 0 0 1 12 21 A ' + rx + ' 9 0 0 0 12 3 Z';
} else {
path = 'M 12 3 A 9 9 0 0 1 12 21 A ' + Math.abs(rx) + ' 9 0 0 1 12 3 Z';
}
}
var lit = document.createElementNS('http://www.w3.org/2000/svg', 'path');
lit.setAttribute('d', path);
lit.setAttribute('fill', ASH.bone);
icon.appendChild(lit);
}
function renderRpgMoon(phase, fraction) {
var r = 10;
rpgMoonDark.setAttribute('d', '');
var rx = r * (1 - 2 * fraction);
var path;
if (phase < 0.5) {
if (rx > 0) {
path = 'M 0 -10 A 10 10 0 0 0 0 10 A ' + rx + ' 10 0 0 1 0 -10 Z';
} else {
path = 'M 0 -10 A 10 10 0 0 0 0 10 A ' + Math.abs(rx) + ' 10 0 0 0 0 -10 Z';
}
} else {
if (rx > 0) {
path = 'M 0 -10 A 10 10 0 0 1 0 10 A ' + rx + ' 10 0 0 0 0 -10 Z';
} else {
path = 'M 0 -10 A 10 10 0 0 1 0 10 A ' + Math.abs(rx) + ' 10 0 0 1 0 -10 Z';
}
}
rpgMoonLit.setAttribute('d', path);
}
function updateClockAndEvents() {
var now = new Date();
// Calculate real day progress based on sun position
// 0% = midnight, 50% = noon, 100% = next midnight
var sunTimes = SunCalc.getTimes(now, PASSAU_LAT, PASSAU_LON);
var sunrise = sunTimes.sunrise;
var sunset = sunTimes.sunset;
if (now < sunrise) {
var prevSunset = new Date(sunset.getTime() - 24 * 3600 * 1000);
realDayProgress = (now.getTime() - prevSunset.getTime()) / (sunrise.getTime() - prevSunset.getTime());
} else if (now < sunset) {
realDayProgress = 0.5 + (now.getTime() - sunrise.getTime()) / (sunset.getTime() - sunrise.getTime()) * 0.5;
} else {
realDayProgress = 0.5 + (now.getTime() - sunset.getTime()) / (sunrise.getTime() + 24 * 3600 * 1000 - sunset.getTime()) * 0.5;
}
realDayProgress = Math.max(0, Math.min(1, realDayProgress));
// Real-time clock hands and digital
var h = now.getHours();
var m = now.getMinutes();
var s = now.getSeconds();
document.getElementById('digital-clock').textContent = formatDateTime((window.CONFIG && window.CONFIG.timeFormat) || 'HH:mm:ss', now);
var hourAngle = ((h % 12) + m / 60) * 30;
var minuteAngle = (m + s / 60) * 6;
var secondAngle = s * 6;
hourHand.setAttribute('transform', 'rotate(' + hourAngle + ' 140 140)');
minuteHand.setAttribute('transform', 'rotate(' + minuteAngle + ' 140 140)');
secondHand.setAttribute('transform', 'rotate(' + secondAngle + ' 140 140)');
// Sun times
var sunTimes = SunCalc.getTimes(now, PASSAU_LAT, PASSAU_LON);
var sunriseNext = getNextEvent(sunTimes.sunrise, now, PASSAU_LAT, PASSAU_LON, 'sunrise');
var sunsetNext = getNextEvent(sunTimes.sunset, now, PASSAU_LAT, PASSAU_LON, 'sunset');
document.getElementById('sunrise-value').textContent = formatTimeHM(sunriseNext.date);
document.getElementById('sunrise-when').textContent = sunriseNext.label ? '· ' + sunriseNext.label : '';
document.getElementById('sunset-value').textContent = formatTimeHM(sunsetNext.date);
document.getElementById('sunset-when').textContent = sunsetNext.label ? '· ' + sunsetNext.label : '';
// Sun zenith (solar noon) - find next occurrence
var sunZenith = sunTimes.solarNoon;
var sunZenithWhen = sunZenith > now ? t('today') : t('tomorrow');
if (sunZenith <= now) {
var tomorrow = new Date(now);
tomorrow.setDate(tomorrow.getDate() + 1);
sunZenith = SunCalc.getTimes(tomorrow, PASSAU_LAT, PASSAU_LON).solarNoon;
sunZenithWhen = formatDateLong(tomorrow);
}
document.getElementById('sun-zenith-value').textContent = formatTimeHM(sunZenith);
document.getElementById('sun-zenith-when').textContent = '· ' + sunZenithWhen;
// Moon times
var moonTimes = SunCalc.getMoonTimes(now, PASSAU_LAT, PASSAU_LON);
var moonriseNext = getNextEvent(moonTimes.rise, now, PASSAU_LAT, PASSAU_LON, 'moonrise');
var moonsetNext = getNextEvent(moonTimes.set, now, PASSAU_LAT, PASSAU_LON, 'moonset');
document.getElementById('moonrise-value').textContent = formatTimeHM(moonriseNext.date);
document.getElementById('moonrise-when').textContent = moonriseNext.label ? '· ' + moonriseNext.label : '';
document.getElementById('moonset-value').textContent = formatTimeHM(moonsetNext.date);
document.getElementById('moonset-when').textContent = moonsetNext.label ? '· ' + moonsetNext.label : '';
// Sun arc
if (sunTimes.sunrise && sunTimes.sunset) {
rpgSunArc.setAttribute('d', arcBetween(sunTimes.sunrise, sunTimes.sunset, SUN_ORBIT_RADIUS));
}
// Moon arc
if (moonTimes.rise && moonTimes.set) {
rpgMoonArc.setAttribute('d', arcBetween(moonTimes.rise, moonTimes.set, MOON_ORBIT_RADIUS));
}
// Sun position
var sunP = pointOnCircle(now, SUN_ORBIT_RADIUS);
rpgSun.setAttribute('cx', sunP.x);
rpgSun.setAttribute('cy', sunP.y);
rpgSunGlow.setAttribute('cx', sunP.x);
rpgSunGlow.setAttribute('cy', sunP.y);
rpgSunCore.setAttribute('cx', sunP.x);
rpgSunCore.setAttribute('cy', sunP.y);
var isDaytime = now >= sunTimes.sunrise && now <= sunTimes.sunset;
rpgSun.setAttribute('opacity', isDaytime ? '1' : '0.35');
rpgSunGlow.setAttribute('opacity', isDaytime ? '0.4' : '0.15');
rpgSunCore.setAttribute('opacity', isDaytime ? '1' : '0.35');
// Moon position - based on current time on the orbit
var moonAngle = moonAngleForTime(now);
var moonP = {
x: CENTER_X + Math.cos(moonAngle) * MOON_ORBIT_RADIUS,
y: CENTER_Y + Math.sin(moonAngle) * MOON_ORBIT_RADIUS
};
rpgMoon.setAttribute('transform', 'translate(' + moonP.x + ', ' + moonP.y + ')');
var moonVisible = false;
if (moonTimes.rise && moonTimes.set) {
if (moonTimes.rise < moonTimes.set) {
moonVisible = (now >= moonTimes.rise && now <= moonTimes.set);
} else {
moonVisible = (now >= moonTimes.rise || now <= moonTimes.set);
}
}
rpgMoon.setAttribute('opacity', moonVisible ? '1' : '0.6');
// Sun rise/set arrows
var srP = pointOnCircle(sunTimes.sunrise, SUN_ORBIT_RADIUS);
sunRiseArrow.setAttribute('transform', 'translate(' + srP.x + ', ' + srP.y + ')');
var ssP = pointOnCircle(sunTimes.sunset, SUN_ORBIT_RADIUS);
sunSetArrow.setAttribute('transform', 'translate(' + ssP.x + ', ' + ssP.y + ')');
// Sun zenith marker (next occurrence)
var sunZenithDate = sunTimes.solarNoon > now ? sunTimes.solarNoon : SunCalc.getTimes(new Date(now.getTime() + 86400000), PASSAU_LAT, PASSAU_LON).solarNoon;
var szP = pointOnCircle(sunZenithDate, SUN_ORBIT_RADIUS);
sunZenithMarker.setAttribute('transform', 'translate(' + szP.x + ', ' + szP.y + ')');
// Moon rise/set arrows
if (moonTimes.rise) {
var mrP = pointOnCircle(moonTimes.rise, MOON_ORBIT_RADIUS);
moonRiseArrow.setAttribute('transform', 'translate(' + mrP.x + ', ' + mrP.y + ')');
moonRiseArrow.setAttribute('opacity', '1');
} else {
moonRiseArrow.setAttribute('opacity', '0');
}
if (moonTimes.set) {
var msP = pointOnCircle(moonTimes.set, MOON_ORBIT_RADIUS);
moonsetArrow.setAttribute('transform', 'translate(' + msP.x + ', ' + msP.y + ')');
moonsetArrow.setAttribute('opacity', '1');
} else {
moonsetArrow.setAttribute('opacity', '0');
}
// Moon phase
var moonIllum = SunCalc.getMoonIllumination(now);
document.getElementById('moon-phase-text').textContent =
getMoonPhaseText(moonIllum.phase) + ' ' + Math.round(moonIllum.fraction * 100) + '%';
renderMoonPhaseIcon(moonIllum.phase, moonIllum.fraction);
renderRpgMoon(moonIllum.phase, moonIllum.fraction);
}
var startTime = Date.now();
window.weatherThemes = {
sunny: {
skyColor: hexToInt(ASH.steelLight),
cloudColor: hexToInt(ASH.stone),
lightColor: hexToInt(ASH.chalk),
backgroundColor: hexToInt(ASH.mid),
speed: 1.0
},
cloudy: {
skyColor: hexToInt(ASH.steel),
cloudColor: hexToInt(ASH.mid),
lightColor: hexToInt(ASH.bone),
backgroundColor: hexToInt(ASH.border),
speed: 1.2
},
stormy: {
skyColor: hexToInt(ASH.steel),
cloudColor: hexToInt(ASH.panel),
lightColor: hexToInt(ASH.stone),
backgroundColor: hexToInt(ASH.void),
speed: 2.5
},
night: {
skyColor: hexToInt(ASH.void),
cloudColor: hexToInt(ASH.raised),
lightColor: hexToInt(ASH.icon),
backgroundColor: hexToInt(ASH.void),
speed: 0.4
}
};
function getWeatherThemeName(code) {
if (code === 0) return 'sunny';
if (code >= 1 && code <= 3) return 'cloudy';
if (code >= 45 && code <= 48) return 'cloudy';
if ((code >= 51 && code <= 67) || (code >= 80 && code <= 82) || (code >= 71 && code <= 77) || (code >= 85 && code <= 86)) return 'stormy';
if (code >= 95) return 'stormy';
return 'cloudy';
}
function mixColor(color1, color2, factor) {
if (color1 === undefined || color2 === undefined) return color1 || color2;
var r1 = (color1 >> 16) & 255;
var g1 = (color1 >> 8) & 255;
var b1 = color1 & 255;
var r2 = (color2 >> 16) & 255;
var g2 = (color2 >> 8) & 255;
var b2 = color2 & 255;
var r = Math.round(r1 + (r2 - r1) * factor);
var g = Math.round(g1 + (g2 - g1) * factor);
var b = Math.round(b1 + (b2 - b1) * factor);
return (r << 16) | (g << 8) | b;
}
var prevThemeColors = null;
var targetThemeColors = null;
var transitionStartTime = 0;
var TRANSITION_DURATION = 5 * 60 * 1000;
var currentWeatherThemeName = null;
var currentThemeSpeed = 0.4;
function setWeatherTheme(themeName) {
if (currentWeatherThemeName !== themeName) {
prevThemeColors = getEffectiveThemeColors();
targetThemeColors = window.weatherThemes[themeName] || window.weatherThemes.cloudy;
transitionStartTime = Date.now();
currentWeatherThemeName = themeName;
}
}
function getEffectiveThemeColors() {
if (!targetThemeColors) return null;
var elapsed = Date.now() - transitionStartTime;
var smoothT;
if (!prevThemeColors || elapsed >= TRANSITION_DURATION) {
smoothT = 1;
} else {
var t = elapsed / TRANSITION_DURATION;
smoothT = t * t * (3 - 2 * t);
}
var result = {};
var keys = ['skyColor', 'cloudColor', 'lightColor', 'backgroundColor'];
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (prevThemeColors && smoothT < 1) {
result[k] = mixColor(prevThemeColors[k], targetThemeColors[k], smoothT);
} else {
result[k] = targetThemeColors[k];
}
}
if (smoothT >= 1 && prevThemeColors !== targetThemeColors) {
prevThemeColors = targetThemeColors;
currentThemeSpeed = targetThemeColors.speed;
}
return result;
}
function applyWeatherTheme(c) {
var themeColors = getEffectiveThemeColors();
if (!themeColors) return c;
// At night, weather only tints slightly - we don't want a
// 'cloudy' sky colour washing over deep night sky and
// making it look bright.
var _sunPos = SunCalc.getPosition(new Date(), PASSAU_LAT, PASSAU_LON);
var nightFactor = Math.max(0, Math.min(1, -_sunPos.altitude / 0.4));
var mix = 0.6 * (1 - nightFactor * 0.7);
return {
sky: mixColor(c.sky, themeColors.skyColor, mix),
cloud: mixColor(c.cloud, themeColors.cloudColor, mix),
cloudShadow: c.cloudShadow !== undefined
? mixColor(c.cloudShadow, themeColors.cloudColor, mix * 0.8)
: mixColor(c.cloud, themeColors.cloudColor, mix * 0.8),
light: mixColor(c.sun, themeColors.lightColor, mix * 0.5),
bg: mixColor(c.bg, themeColors.backgroundColor, mix)
};
}
function getCurrentDayProgress() {
var now = new Date();
var startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
return (now.getTime() - startOfDay.getTime()) / 86400000;
}
function toggleDebugPanel() {
var content = document.getElementById('debug-content');
var title = document.querySelector('.debug-title');
var icon = document.getElementById('debug-toggle-icon');
var isCollapsed = content.classList.contains('collapsed');
if (isCollapsed) {
content.classList.remove('collapsed');
title.classList.add('expanded');
icon.textContent = '▼';
} else {
content.classList.add('collapsed');
title.classList.remove('expanded');
icon.textContent = '▶';
}
}
var UNITS_OPTIONS = [
{ value: 'metric', label: '°C, km/h' },
{ value: 'imperial', label: '°F, mph' }
];
var LANGUAGE_OPTIONS = [
{ value: 'en', label: 'EN' },
{ value: 'de', label: 'DE' },
{ value: 'it', label: 'IT' },
{ value: 'es', label: 'ES' },
{ value: 'fr', label: 'FR' },
{ value: 'ru', label: 'RU' }
];
function applyI18n() {
var els = document.querySelectorAll('[data-i18n]');
for (var i = 0; i < els.length; i++) {
var key = els[i].getAttribute('data-i18n');
els[i].textContent = t(key);
}
// Trigger a weather refresh so dynamic texts (slot labels, current
// weather details) are re-rendered with the new language.
if (typeof fetchWeather === 'function') fetchWeather();
}
function setDebugLanguage(lang) {
window.CONFIG.language = lang;
applyI18n();
// Trigger weather refresh to update day labels
if (typeof fetchWeather === 'function') fetchWeather();
// Force a debug update so the digital clock shows the new language
if (typeof updateDebug === 'function') {
var now = new Date();
updateDebug(0, null,
{ sky: 0, cloud: 0, light: 0, bg: 0 },
currentWeatherThemeName, realDayProgress);
}
}
function populateDebugSelects() {
// Theme select (from window.THEMES)
var themeSelect = document.getElementById('dbg-theme-select');
themeSelect.innerHTML = '';
if (window.THEMES) {
for (var key in window.THEMES) {
if (window.THEMES.hasOwnProperty(key)) {
var opt = document.createElement('option');
opt.value = key;
opt.textContent = key.charAt(0).toUpperCase() + key.slice(1);
if (key === window.CONFIG.theme) opt.selected = true;
themeSelect.appendChild(opt);
}
}
}
// Units select
var unitsSelect = document.getElementById('dbg-units-select');
unitsSelect.innerHTML = '';
for (var i = 0; i < UNITS_OPTIONS.length; i++) {
var opt2 = document.createElement('option');
opt2.value = UNITS_OPTIONS[i].value;
opt2.textContent = UNITS_OPTIONS[i].label;
if (UNITS_OPTIONS[i].value === window.CONFIG.units) opt2.selected = true;
unitsSelect.appendChild(opt2);
}
// Language select
var langSelect = document.getElementById('dbg-language-select');
langSelect.innerHTML = '';
for (var j = 0; j < LANGUAGE_OPTIONS.length; j++) {
var opt3 = document.createElement('option');
opt3.value = LANGUAGE_OPTIONS[j].value;
opt3.textContent = LANGUAGE_OPTIONS[j].label;
if (LANGUAGE_OPTIONS[j].value === window.CONFIG.language) opt3.selected = true;
langSelect.appendChild(opt3);
}
}
function setDebugTheme(theme) {
var cssFile = window.THEMES && window.THEMES[theme];
var css = document.getElementById('theme-css');
if (css && cssFile) css.href = cssFile;
setTimeout(function() {
rebuildFromColors();
document.getElementById('dbg-palette-name').textContent = theme.charAt(0).toUpperCase() + theme.slice(1);
}, 50);
window.CONFIG.theme = theme;
}
function setDebugUnits(units) {
window.CONFIG.units = units;
// Refresh weather to display new units
if (typeof fetchWeather === 'function') fetchWeather();
}
function updateDebug(t, palette, vantaColors, themeName, realDayProgress) {
var now = new Date();
var hh = now.getHours(), mm = now.getMinutes(), ss = now.getSeconds();
document.getElementById('dbg-time').textContent =
(hh < 10 ? '0' : '') + hh + ':' + (mm < 10 ? '0' : '') + mm + ':' + (ss < 10 ? '0' : '') + ss;
document.getElementById('dbg-day').textContent = realDayProgress != null ? (realDayProgress * 100).toFixed(1) + '%' : (t * 100).toFixed(1) + '%';
document.getElementById('dbg-weather').textContent =
currentWeatherCode + ' (' + (window.weatherThemes[themeName] ? themeName : '?') + ')';
// RPG angles
var sunTimes = SunCalc.getTimes(now, PASSAU_LAT, PASSAU_LON);
var moonTimes = SunCalc.getMoonTimes(now, PASSAU_LAT, PASSAU_LON);
document.getElementById('dbg-sun-rise-angle').textContent = (angleForTime(sunTimes.sunrise) * 180 / Math.PI).toFixed(1) + '°';
document.getElementById('dbg-sun-set-angle').textContent = (angleForTime(sunTimes.sunset) * 180 / Math.PI).toFixed(1) + '°';
document.getElementById('dbg-sun-now-angle').textContent = (angleForTime(now) * 180 / Math.PI).toFixed(1) + '°';
if (moonTimes.rise) {
document.getElementById('dbg-moon-rise-angle').textContent = (angleForTime(moonTimes.rise) * 180 / Math.PI).toFixed(1) + '°';
}
if (moonTimes.set) {
document.getElementById('dbg-moon-set-angle').textContent = (angleForTime(moonTimes.set) * 180 / Math.PI).toFixed(1) + '°';
}
document.getElementById('dbg-moon-now-angle').textContent = (moonAngleForTime(now) * 180 / Math.PI).toFixed(1) + '°';
document.getElementById('dbg-theme').textContent = themeName || '-';
document.getElementById('dbg-speed').textContent = currentThemeSpeed.toFixed(2);
var elapsed = Date.now() - transitionStartTime;
var transPct = targetThemeColors ? Math.min(100, (elapsed / TRANSITION_DURATION) * 100) : 100;
document.getElementById('dbg-trans').textContent = transPct.toFixed(0) + '%';
var themeColors = getEffectiveThemeColors();
if (themeColors) {
var keys = ['skyColor', 'cloudColor', 'lightColor', 'backgroundColor'];
var keyMap = {skyColor: 'sky', cloudColor: 'cloud', lightColor: 'sunLight', backgroundColor: 'bg'};
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
var kk = keyMap[k];
var c = themeColors[k];
document.getElementById('dbg-t-' + kk).style.backgroundColor = '#' + ('00000' + c.toString(16)).slice(-6);
document.getElementById('dbg-h-' + kk).textContent = '#' + ('00000' + c.toString(16)).slice(-6);
}
}
if (vantaColors) {
var vKeys = ['sky', 'cloud', 'light', 'bg'];
var vKeyMap = {sky: 'sky', cloud: 'cloud', light: 'sunLight', bg: 'bg'};
for (var j = 0; j < vKeys.length; j++) {
var vk = vKeys[j];
var vc = vantaColors[vk];
var kk = vKeyMap[vk];
document.getElementById('dbg-v-' + kk).style.backgroundColor = '#' + ('00000' + vc.toString(16)).slice(-6);
document.getElementById('dbg-vh-' + kk).textContent = '#' + ('00000' + vc.toString(16)).slice(-6);
}
}
// Theme table
var themeNames = ['sunny', 'cloudy', 'stormy', 'night'];
var themeFields = [
{ key: 'skyColor', label: 'sky' },
{ key: 'cloudColor', label: 'cloud' },
{ key: 'lightColor', label: 'light' },
{ key: 'backgroundColor', label: 'bg' }
];
var tableHtml = '<div class="theme-table-row theme-table-header">';
tableHtml += '<span>Theme (Ash)</span>';
for (var t = 0; t < themeFields.length; t++) {
tableHtml += '<span title="' + themeFields[t].key + '">' + themeFields[t].label + '</span>';
}
tableHtml += '<span>speed</span>';
tableHtml += '</div>';
for (var n = 0; n < themeNames.length; n++) {
var tn = themeNames[n];
var th = window.weatherThemes[tn];
tableHtml += '<div class="theme-table-row">';
tableHtml += '<span class="theme-table-name">' + tn + '</span>';
for (var f = 0; f < themeFields.length; f++) {
var fc = th[themeFields[f].key];
tableHtml += '<div class="theme-table-mini-swatch" style="background:#' + ('00000' + fc.toString(16)).slice(-6) + '"></div>';
}
tableHtml += '<span class="theme-table-speed">' + th.speed + '</span>';
tableHtml += '</div>';
}
document.getElementById('dbg-theme-table').innerHTML = tableHtml;
// Color palette table - all colors from the palette
var colorKeys = [
'black', 'dark', 'gray-darker', 'gray-dark', 'gray', 'gray-light',
'icon', 'stone', 'bone', 'chalk',
'orange', 'yellow', 'red', 'brown', 'pink', 'green', 'blue', 'blue-light', 'purple'
];
var dbgRoot = getComputedStyle(document.documentElement);
var colorHtml = '<div class="theme-table-header">Palette</div>';
for (var k = 0; k < colorKeys.length; k++) {
var ck = colorKeys[k];
var cv = ASH[ck] || dbgRoot.getPropertyValue('--' + ck).trim();
colorHtml += '<div class="palette-table-row">' +
'<span class="theme-table-name">' + ck + '</span>' +
'<div class="theme-table-mini-swatch" style="background:' + cv + '"></div>' +
'<span class="theme-table-speed">' + cv + '</span>' +
'</div>';
}
document.getElementById('dbg-color-table').innerHTML = colorHtml;
}
function animate() {
var t = (Date.now() - startTime) / CYCLE % 1;
var c = getColor(t);
c = applyWeatherTheme(c);
// Expose current palette + weather info for the 2D renderer
window.__currentPalette = c;
window.__currentWeatherName = currentWeatherThemeName;
window.__currentDayProgress = realDayProgress;
window.__currentThemeSpeed = currentThemeSpeed;
// Sun altitude in radians. Negative = below horizon (night).
var _sunPos = SunCalc.getPosition(new Date(), PASSAU_LAT, PASSAU_LON);
window.__currentSunAlt = _sunPos.altitude;
effect.setOptions({
skyColor: c.sky,
cloudColor: c.cloud,
lightColor: c.light,
backgroundColor: c.bg,
backgroundAlpha: 0,
speed: currentThemeSpeed
});
document.body.style.backgroundColor = '#' + ('00000' + c.sky.toString(16)).slice(-6);
updateDebug(t, null, c, currentWeatherThemeName, realDayProgress);
requestAnimationFrame(animate);
}
function tick() {
try {
updateClockAndEvents();
} catch (e) {
console.error('Tick error:', e);
}
setTimeout(tick, 1000);
}
// ============ Weather ============
// Default location: London, UK
var DEFAULT_LAT = 51.5074;
var DEFAULT_LON = -0.1278;
var WEATHER_LAT = (window.CONFIG && window.CONFIG.location && window.CONFIG.location.lat) || DEFAULT_LAT;
var WEATHER_LON = (window.CONFIG && window.CONFIG.location && window.CONFIG.location.lon) || DEFAULT_LON;
// Try browser geolocation if no config location set
function initBrowserGeolocation() {
if (window.CONFIG && window.CONFIG.location && window.CONFIG.location.lat) return;
if (!navigator.geolocation) return;
navigator.geolocation.getCurrentPosition(
function(pos) {
WEATHER_LAT = pos.coords.latitude;
WEATHER_LON = pos.coords.longitude;
window.CONFIG.location = { lat: WEATHER_LAT, lon: WEATHER_LON };
// Reload weather with new coordinates
if (typeof fetchWeather === 'function') fetchWeather();
// Reverse geocode to get place name
reverseGeocode(WEATHER_LAT, WEATHER_LON);
},
function() { /* ignored - keep default */ },
{ timeout: 10000 }
);
}
// Reverse geocode lat/lon to a place name using Nominatim (OpenStreetMap).
// Free, no API key required. Has a 1 req/sec rate limit.
// Skipped if a custom label is already configured (luxury: user can
// set their own place name in CONFIG.location.label).
function reverseGeocode(lat, lon) {
if (window.CONFIG && window.CONFIG.location && window.CONFIG.location.label) return;
var url = 'https://nominatim.openstreetmap.org/reverse?format=json&lat=' +
lat + '&lon=' + lon + '&zoom=10&addressdetails=1';
fetch(url, {
headers: { 'Accept-Language': (window.CONFIG && window.CONFIG.language) || 'en' }
})
.then(function(r) { return r.ok ? r.json() : null; })
.then(function(data) {
if (data && data.address) {
var addr = data.address;
var name = addr.city || addr.town || addr.village || addr.hamlet ||
addr.suburb || addr.county || addr.state || data.display_name;
if (window.CONFIG && window.CONFIG.location) {
window.CONFIG.location.label = name;
}
}
})
.catch(function() { /* ignore errors */ });
}
// If config has lat/lon but no label, fetch the label
function fetchLocationLabel() {
if (!window.CONFIG || !window.CONFIG.location) return;
if (window.CONFIG.location.label) return;
if (!window.CONFIG.location.lat) return;
reverseGeocode(window.CONFIG.location.lat, window.CONFIG.location.lon);
}
// Get timezone offset based on user's local time
function getTimezoneOffsetMinutes() {
return new Date().getTimezoneOffset();
}
var weatherData = null;
var WMO_ICONS = {
0: 'sun',
1: 'sun-cloud',
2: 'cloud-sun',
3: 'cloud',
45: 'fog',
48: 'fog',
51: 'drizzle',
53: 'drizzle',
55: 'drizzle',
56: 'drizzle',
57: 'drizzle',
61: 'rain',
63: 'rain',
65: 'rain',
66: 'rain',
67: 'rain',
71: 'snow',
73: 'snow',
75: 'snow',
77: 'snow',
80: 'rain',
81: 'rain',
82: 'rain',
85: 'snow',
86: 'snow',
95: 'thunder',
96: 'thunder',
99: 'thunder'
};
function weatherSVG(code) {
var c = 'var(--bone)';
switch (code) {
case 0:
return '<svg viewBox="0 0 24 24" fill="' + c + '"><circle cx="12" cy="12" r="5"/><g stroke="' + c + '" stroke-width="2" stroke-linecap="round"><line x1="12" y1="2" x2="12" y2="4"/><line x1="12" y1="20" x2="12" y2="22"/><line x1="2" y1="12" x2="4" y2="12"/><line x1="20" y1="12" x2="22" y2="12"/><line x1="4.9" y1="4.9" x2="6.3" y2="6.3"/><line x1="17.7" y1="17.7" x2="19.1" y2="19.1"/><line x1="4.9" y1="19.1" x2="6.3" y2="17.7"/><line x1="17.7" y1="6.3" x2="19.1" y2="4.9"/></g></svg>';
case 1:
case 2:
return '<svg viewBox="0 0 24 24" fill="none" stroke="' + c + '" stroke-width="2"><circle cx="8" cy="8" r="3" fill="' + c + '"/><line x1="8" y1="2" x2="8" y2="3"/><line x1="2" y1="8" x2="3" y2="8"/><line x1="3.5" y1="3.5" x2="4.2" y2="4.2"/><line x1="12.5" y1="3.5" x2="11.8" y2="4.2"/><path d="M10 14 a4 4 0 0 1 4 -4 a4 4 0 0 1 4 4 a3 3 0 0 1 0 6 h-8 a3 3 0 0 1 0 -6 z" fill="var(--stone)" stroke="none"/></svg>';
case 3:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 18 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/></svg>';
case 45:
case 48:
return '<svg viewBox="0 0 24 24" fill="none" stroke="' + c + '" stroke-width="2"><path d="M6 18 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z" fill="var(--stone)" stroke="' + c + '"/><line x1="8" y1="20" x2="8" y2="22"/><line x1="12" y1="20" x2="12" y2="22"/><line x1="16" y1="20" x2="16" y2="22"/></svg>';
case 51:
case 55:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 14 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g stroke="var(--blue)" stroke-width="1.5" stroke-linecap="round"><line x1="8" y1="17" x2="7" y2="20"/><line x1="13" y1="17" x2="12" y2="20"/><line x1="17" y1="17" x2="16" y2="20"/></g></svg>';
case 53:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 14 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g stroke="var(--blue)" stroke-width="1.5" stroke-linecap="round"><line x1="9" y1="16" x2="8" y2="20"/><line x1="13" y1="16" x2="12" y2="20"/></g></svg>';
case 61:
case 80:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 13 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g stroke="var(--blue)" stroke-width="1.5" stroke-linecap="round"><line x1="8" y1="16" x2="7" y2="21"/><line x1="13" y1="16" x2="12" y2="21"/><line x1="17" y1="16" x2="16" y2="21"/></g></svg>';
case 63:
case 81:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 13 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g stroke="var(--blue)" stroke-width="1.5" stroke-linecap="round"><line x1="9" y1="15" x2="7" y2="21"/><line x1="13" y1="15" x2="11" y2="21"/><line x1="17" y1="15" x2="15" y2="21"/></g></svg>';
case 65:
case 82:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 13 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g stroke="var(--blue)" stroke-width="1.5" stroke-linecap="round"><line x1="7" y1="15" x2="4" y2="22"/><line x1="11" y1="15" x2="8" y2="22"/><line x1="15" y1="15" x2="12" y2="22"/><line x1="19" y1="15" x2="16" y2="22"/></g></svg>';
case 71:
case 73:
case 75:
case 77:
case 85:
case 86:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 13 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><g fill="' + c + '"><circle cx="8" cy="18" r="1.5"/><circle cx="13" cy="19" r="1.5"/><circle cx="17" cy="18" r="1.5"/></g></svg>';
case 95:
case 96:
case 99:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><path d="M6 13 a4 4 0 0 1 -2 -7 a5 5 0 0 1 9 -3 a4 4 0 0 1 7 1 a3 3 0 0 1 0 6 h-14 z"/><path d="M12 2 L8 11 L12 11 L10 18 L16 9 L12 9 Z" fill="var(--yellow)"/></svg>';
default:
return '<svg viewBox="0 0 24 24" fill="var(--stone)"><circle cx="12" cy="12" r="6"/></svg>';
}
}
function fetchWeather() {
var url = 'https://api.open-meteo.com/v1/forecast?latitude=' + WEATHER_LAT +
'&longitude=' + WEATHER_LON +
'&current=temperature_2m,relative_humidity_2m,weather_code,wind_speed_10m' +
'&hourly=temperature_2m,weather_code' +
'&daily=weather_code,temperature_2m_max,temperature_2m_min' +
'&timezone=Europe/Berlin&forecast_days=5';
fetch(url)
.then(function(response) { return response.json(); })
.then(function(data) {
weatherData = data;
currentWeatherCode = data.current.weather_code;
setWeatherTheme(getWeatherThemeName(currentWeatherCode));
updateWeatherDisplay();
})
.catch(function(err) {
console.log('Weather fetch failed:', err);
});
}
function findHourlyIndex(targetDate, hourlyTimeArray) {
var bestIdx = 0;
var bestDiff = Infinity;
for (var i = 0; i < hourlyTimeArray.length; i++) {
var t = new Date(hourlyTimeArray[i]);
var diff = Math.abs(t.getTime() - targetDate.getTime());
if (diff < bestDiff) {
bestDiff = diff;
bestIdx = i;
}
}
return bestIdx;
}
function updateWeatherDisplay() {
if (!weatherData) return;
var now = new Date();
var current = weatherData.current;
var hourly = weatherData.hourly;
var daily = weatherData.daily;
// Current
var currentUnits = (window.CONFIG && window.CONFIG.units) || 'metric';
var tempDisplay = currentUnits === 'imperial'
? Math.round(current.temperature_2m * 9 / 5 + 32) + '\u00b0F'
: Math.round(current.temperature_2m) + '\u00b0C';
var windDisplay = currentUnits === 'imperial'
? Math.round(current.wind_speed_10m * 0.621371) + ' mph'
: Math.round(current.wind_speed_10m) + ' km/h';
var currentHtml = '<div class="weather-current-icon">' + weatherSVG(current.weather_code) + '</div>' +
'<div><div class="weather-current-temp"><span>' + tempDisplay + '</span><span class="weather-location" id="weather-location">' +
((window.CONFIG && window.CONFIG.location && (window.CONFIG.location.label || (window.CONFIG.location.lat.toFixed(2) + ',' + window.CONFIG.location.lon.toFixed(2)))) || '') + '</span></div>' +
'<div class="weather-current-detail">' +
t('Humidity') + ' ' + Math.round(current.relative_humidity_2m) + '% · ' + t('Wind') + ' ' + windDisplay + '</div></div>';
document.getElementById('weather-current').innerHTML = currentHtml;
// Forecast
var forecastHtml = '';
for (var d = 0; d < 4; d++) {
var dayDate = new Date(daily.time[d]);
var dayLabel = d === 0 ? t('today') : t('tomorrow');
if (d > 1) {
var weekdayKey = ['Su.', 'Mo.', 'Tu.', 'We.', 'Th.', 'Fr.', 'Sa.'][dayDate.getDay()];
dayLabel = t(weekdayKey) + ' ' +
(dayDate.getDate() < 10 ? '0' : '') + dayDate.getDate() + '.' +
(dayDate.getMonth() + 1 < 10 ? '0' : '') + (dayDate.getMonth() + 1) + '.';
}
// Morning (8), Noon (14), Evening (20), Night (2)
var slots = [8, 14, 20, 2];
var slotsHtml = '';
for (var i = 0; i < slots.length; i++) {
var slotDate = new Date(dayDate);
slotDate.setHours(slots[i], 0, 0, 0);
if (i === 3 && d > 0) {
slotDate.setDate(slotDate.getDate() + 1);
} else if (i === 3 && d === 0) {
slotDate.setDate(slotDate.getDate() + 1);
}
var currentUnits = (window.CONFIG && window.CONFIG.units) || 'metric';
var convertTemp = function(c) {
return currentUnits === 'imperial'
? Math.round(c * 9 / 5 + 32) + '\u00b0F'
: Math.round(c) + '\u00b0C';
};
var slotIdx = findHourlyIndex(slotDate, hourly.time);
var slotCode = hourly.weather_code[slotIdx];
var slotTemp = hourly.temperature_2m[slotIdx];
var slotLabels = [t('Morning'), t('Noon'), t('Evening'), t('Night')];
slotsHtml += '<div class="weather-slot">' +
'<div class="weather-slot-icon">' + weatherSVG(slotCode) + '</div>' +
'<div class="weather-slot-label">' + slotLabels[i] + '</div>' +
'<div class="weather-slot-temp">' + convertTemp(slotTemp) + '</div>' +
'</div>';
}
forecastHtml += '<div class="weather-day">' +
'<div class="weather-day-header">' +
'<span class="weather-day-name">' + dayLabel + '</span>' +
'<span class="weather-day-minmax">' + convertTemp(daily.temperature_2m_min[d]) + ' / ' + convertTemp(daily.temperature_2m_max[d]) + '</span>' +
'</div>' +
'<div class="weather-day-slots">' + slotsHtml + '</div>' +
'</div>';
}
document.getElementById('weather-forecast').innerHTML = forecastHtml;
}
// Update weather every 15 minutes
applyI18n();
populateDebugSelects();
// Apply debug flag from CONFIG
var debugEl = document.getElementById('debug-panel');
if (debugEl && !(window.CONFIG && window.CONFIG.debug)) {
debugEl.style.display = 'none';
}
// Try browser geolocation if no explicit location configured
initBrowserGeolocation();
// Fetch location label from lat/lon if available
fetchLocationLabel();
animate();
try { tick(); } catch (e) { console.error('Initial tick error:', e); }
fetchWeather();
setInterval(fetchWeather, 15 * 60 * 1000);
tick();
} catch (e) {
window.__clouds2dError = e.message || String(e);
console.error('Background init error:', e);
}
</script>
</body>
</html>