1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="UTF-8">
5<script> 6// --- Shared-link expiry (soft/UX-level only, not real security â see chat notes) --- 7// Edit LINK_EXPIRES below (YYYY-MM-DD) to change when this link stops working. 8(function(){ 9 var LINK_EXPIRES = "2026-09-30"; 10 var expiry = new Date(LINK_EXPIRES + "T23:59:59"); 11 if(new Date() > expiry){ 12 document.write( 13 '<div style="min-height:100vh;display:flex;align-items:center;justify-content:center;'+ 14 'background:#0a0d13;color:#e9ecf3;font-family:sans-serif;text-align:center;padding:20px;">'+ 15 '<div><div style="font-size:20px;font-weight:700;margin-bottom:8px;">This link has expired</div>'+ 16 '<div style="color:#8992a8;font-size:14px;">Ask for a fresh link if you still need access.</div></div></div>' 17 ); 18 window.stop && window.stop(); 19 } 20})(); 21</script>
21 22<meta name="viewport" content="width=device-width, initial-scale=1.0"> 23<title>Tidal â Match Momentum Visualiser</title> 24<meta name="description" content="A football match visualiser showing attacking momentum as tidal surges on a 3D pitch, synced to match audio. Load your own match data or try the demo."> 25<!-- Social link-preview tags (WhatsApp, Slack, iMessage, etc.) are read by a 26 bot that only fetches the static HTML â it never runs this page's JS â 27 so these can't reflect which specific match a shared link points to 28 (that only exists client-side, after the gist/data fragment is loaded). 29 Keeping this generic and accurate for the app as a whole rather than 30 any one match. A genuinely per-match preview (real team names, live 31 score) would need server-side rendering per share link â a bigger 32 project than a static meta tag, flagged here rather than attempted. --> 33<meta property="og:title" content="Tidal â Match Momentum Visualiser"> 34<meta property="og:description" content="Attacking momentum as tidal surges on a 3D pitch, synced to match audio. Load your own match data or try the demo."> 35<meta property="og:image" content="https://navigatio.earth/tidal/tidal-og-thumbnail.png"> 36<meta property="og:type" content="website"> 37<meta property="og:url" content="https://navigatio.earth/tidal/"> 38<meta name="twitter:card" content="summary_large_image"> 39<meta name="twitter:title" content="Tidal â Match Momentum Visualiser"> 40<meta name="twitter:description" content="Attacking momentum as tidal surges on a 3D pitch, synced to match audio."> 41<meta name="twitter:image" content="https://navigatio.earth/tidal/tidal-og-thumbnail.png"> 42<link rel="preconnect" href="https://fonts.googleapis.com"> 43<link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"> 44<style> 45 :root{ 46 --bg:#0a0d13; 47 --panel:#11151f; 48 --panel-2:#161b27; 49 --border:#232a3a; 50 --ink:#e9ecf3; 51 --ink-dim:#8992a8; 52 --accent:#12e0a8; 53 --gold:#ffb400; 54 --home:#2451e0; 55 --away:#ffffff; 56 /* Fallback only â kept accurate at runtime by measuring #header's real 57 rendered height, since it varies with wrapped text/buttons on narrow 58 screens. Everything below the header (#scorebug, #ticker, #goalFlash) 59 positions itself relative to this instead of a guessed pixel value, 60 so it can never overlap the header regardless of how tall it gets. */ 61 --header-h:64px; 62 /* Fallback only â kept accurate at runtime by measuring #transport's real 63 rendered height (see syncTransportHeight), since it varies with wrapped 64 chip buttons on narrow screens or longer time readouts. #chartPanel 65 positions itself off this instead of a guessed pixel value, so the 66 possession chart can never get clipped by the transport bar sitting 67 taller than expected. */ 68 --transport-h:132px; 69 /* Same measured-not-guessed pattern as --header-h/--transport-h â the 70 scorebug's real height varies with whether flags are shown, so the 71 possession bar below it is positioned off this instead of a fixed 72 pixel guess. */ 73 --scorebug-h:90px; 74 } 75 *{box-sizing:border-box;} 76 html,body{margin:0;padding:0;width:100%;height:100%;background:var(--bg);overflow:hidden; 77 font-family:'Inter',sans-serif;color:var(--ink);} 78 #canvas-wrap{position:fixed;inset:0;} 79 canvas{display:block;} 80 81 .mono{font-family:'JetBrains Mono',monospace;} 82 .display{font-family:'Barlow Condensed',sans-serif;} 83 84 /* ---------- top header ---------- */ 85 #header{ 86 position:fixed;top:0;left:0;right:0; 87 display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:10px; 88 padding:14px 16px;pointer-events:none; 89 background:linear-gradient(to bottom, rgba(6,8,13,0.85), rgba(6,8,13,0)); 90 } 91 #brand{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto;} 92 /* #header uses position:fixed, which per spec always creates its own 93 stacking context regardless of z-index. That traps #venueMapThumb'
93s 94 z-index so it can never out-rank a later sibling like #scorebug, no 95 matter how high it's set. Bumping #header's own context above 96 #scorebug's while the map is open is the actual fix. */ 97 #header.mapOpen{z-index:20;} 98 #venueMapThumb{ 99 position:relative;pointer-events:auto;cursor:pointer; 100 width:44px;height:44px;border-radius:10px;overflow:hidden; 101 border:1px solid var(--border);flex:none;background:var(--panel); 102 display:flex;align-items:center;justify-content:center; 103 transition:width .28s ease, height .28s ease;z-index:15; 104 } 105 /* Expanded state is pulled out of #brand's flow and pinned as its own 106 floating card, positioned off the (dynamically measured) header height. 107 Previously this grew inline inside the header, which could push the 108 header taller than #scorebug's assumed fixed offset expected, leaving 109 the map (and its collapse button) hidden behind the score card. */ 110 #venueMapThumb.expanded{ 111 position:fixed;top:calc(var(--header-h) + 8px);left:16px; 112 width:280px;height:200px;border-radius:10px;cursor:default;z-index:16; 113 box-shadow:0 8px 24px rgba(0,0,0,0.4); 114 } 115 #venueMapIcon{font-size:24px;width:44px;height:44px;line-height:44px;text-align:center;filter:drop-shadow(0 0 3px rgba(0,0,0,0.5));} 116 #venueMapThumb.expanded #venueMapIcon{display:none;} 117 #venueMapThumbFrame{width:100%;height:100%;border:none;display:none;} 118 #venueMapThumb.expanded #venueMapThumbFrame{display:block;} 119 #venueMapThumb:hover{border-color:var(--accent);} 120 #venueMapCloseBtn{ 121 display:none;position:absolute;top:6px;right:6px;z-index:2; 122 width:24px;height:24px;border-radius:50%;border:none; 123 background:rgba(10,13,19,0.85);color:var(--ink);font-size:13px;line-height:1; 124 cursor:pointer;align-items:center;justify-content:center; 125 } 126 #venueMapThumb.expanded #venueMapCloseBtn{display:flex;} 127 #venueMapCloseBtn:hover{background:var(--accent);color:#0a0d13;} 128 @media (max-width:640px){ 129 #venueMapThumb.expanded{width:240px;height:170px;} 130 } 131 #brand .word{font-family:'Barlow Condensed';font-weight:800;font-size:22px;letter-spacing:0.14em;color:var(--accent);} 132 #brand .word .wordmark-arrow{display:inline-block;width:0;height:0;vertical-align:middle;margin-bottom:2px;} 133 #brand .word .wordmark-arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:9px solid var(--accent);} 134 #brand .word .wordmark-arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:9px solid var(--accent);} 135 #versionTag{font-family:'JetBrains Mono';font-size:11px;font-weight:500;letter-spacing:0.02em;color:var(--ink-dim);text-transform:none;vertical-align:middle;margin-left:2px;} 136 #brand .meta{font-size:12px;color:var(--ink-dim);letter-spacing:0.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} 137 #dataBtn, #lineupsBtn, #mapBtn, #showDebug{ 138 pointer-events:auto;background:var(--panel);border:1px solid var(--border);color:var(--ink); 139 padding:9px 16px;border-radius:8px;font-size:12.5px;font-weight:600;letter-spacing:0.03em; 140 cursor:pointer;display:flex;align-items:center;gap:7px;transition:border-color .15s,color .15s; 141 flex:0 0 auto;white-space:nowrap; 142 } 143 #dataBtn:hover, #lineupsBtn:hover, #mapBtn:hover{border-color:var(--accent);color:var(--accent);} 144 #dataBtn:focus-visible, button:focus-visible, input:focus-visible{outline:2px solid var(--accent);outline-offset:2px;} 145 146 /* ---------- scorebug ---------- */ 147 #scorebug{ 148 position:fixed;top:calc(var(--header-h) + 8px);left:50%;transform:translateX(-50%); 149 display:flex;align-items:center;gap:22px; 150 background:rgba(11,14,21,0.92); 151 border:1px solid var(--border);border-radius:14px; 152 padding:10px 24px;pointer-events:none; 153 } 154 .team-tag{display:flex;align-items:center;gap:10px;} 155 .swatch{width:10px;height:26px;border-radius:3px;flex:none;} 156 .team-name{font-size:12px;color:var(--ink-dim);text-transform:uppercase;letter-spacing:0.08em;font-weight:600;} 157 .score-num{font-family:'Barlow Condensed';font-weight:800;font-size:38px;line-height:1;min-width:34px;text-align:center;} 158 .team-flag{display:block;width:26px;height:auto;border-radius:3px;margin:4px auto 0;box-shadow:0 0 0 1px rgba(255,255,255,0.15);} 159 #minuteClock{display:flex;flex-direction:column;align-items:center;padding-left:16px;border-left:1px solid var(--border);} 160 #minuteClock .m{font-family:'Barlow Condensed';font-weight:700;font-size:26px;} 161 #minuteClock .half{font-size:10px;color:var(--ink-dim);letter-spacing:0.1em;text-transform:uppercase;} 162 163 /* ---------- goal ticker ---------- */ 164 #tickHome, #tickAway{ 165 position:fixed;pointer-events:none;z-index:5; 166 display:flex;flex-direction:column;gap:4px;align-items:center; 167 } 168 .tick-col{display:flex;flex-direction:column;gap:4px;align-items:center;} 169 .tick-dot{ 170 width:15px;height:15px;border-radius:50%;font-size:8px;display:flex;align-items:center;justify-content:center; 171 color:#0a0d13;font-weight:700;cursor:pointer;pointer-events:auto;opacity:0.35;transition:opacity .2s,transform .2s; 172 border:1.5px solid rgba(255,255,255,0.25); 173 } 174 .tick-dot.reached{opacity:1;} 175 .tick-dot:hover{transform:scale(1.25);} 176 .tick-dot-penalty{border-radius:3px;transform:rotate(45deg);width:12px;height:12px;border-width:2px;} 177 #penCountHome, #penCountAway{ 178 position:fixed;font-family:'JetBrains Mono';font-size:16px;font-weight:800; 179 width:34px;height:34px;border-radius:50%;align-items:center;justify-content:center; 180 box-shadow:0 2px 6px rgba(0,0,0,0.4);border:1px solid rgba(255,255,255,0.2); 181 display:none;pointer-events:none; 182 } 183 .tick-dot-penalty:hover{transform:rotate(45deg) scale(1.25);} 184 .tick-dot-penalty.miss{background:transparent!important;} 185 .tick-label{font-size:9.5px;color:var(--ink-dim);font-family:'JetBrains Mono';} 186 187 /* ---------- goal flash ---------- */ 188 #goalFlash{ 189 position:fixed;top:calc(var(--header-h) + 140px);left:50%;transform:translateX(-50%) translateY(-8px); 190 background:rgba(17,21,31,0.9);border:1px solid var(--gold);border-radius:10px; 191 padding:9px 20px;display:flex;align-items:center;gap:12px;opacity:0; 192 transition:opacity .35s ease, transform .35s ease;pointer-events:none; 193 z-index:10; 194 } 195 #goalFlash.show{opacity:1;transform:translateX(-50%) translateY(0);} 196 #flashPhoto{ 197 width:96px;height:96px;border-radius:11px;object-fit:cover;object-position:50% 15%; 198 border:1px solid rgba(255,180,0,0.5);flex:none; 199 transition:width .15s ease; 200 } 201 /* Applied automatically (via JS, based on the loaded image's real aspect ratio) 202 when a goal photo is a wide action shot rather than a portrait headsh
202ot â 203 object-position:50% 15% assumes a face near the top of the frame, which 204 crops badly on a landscape shot, so this widens the box and re-centers. */ 205 #flashPhoto.landscape{width:170px;height:96px;object-position:50% 50%;} 206 #goalFlash .lbl{font-family:'Barlow Condensed';font-weight:800;font-size:18px;letter-spacing:0.06em;color:var(--gold);} 207 #goalFlash .sub{font-size:11px;color:var(--ink-dim);font-family:'JetBrains Mono';} 208 209 /* ---------- possession chart ---------- */ 210 #chartPanel{ 211 position:fixed;left:16px;right:16px;bottom:calc(var(--transport-h) + 16px);height:64px; 212 background:rgba(11,14,21,0.72);border:1px solid var(--border);border-radius:10px; 213 overflow:hidden;z-index:4; 214 } 215 #possessionChart{width:100%;height:100%;display:block;} 216 @media (max-width:640px){ 217 #chartPanel{height:42px;left:10px;right:10px;} 218 } 219 220 /* ---------- transport ---------- */ 221 #transport{ 222 position:fixed;bottom:0;left:0;right:0;padding:16px 22px 20px; 223 background:linear-gradient(to top, rgba(6,8,13,0.92), rgba(6,8,13,0)); 224 display:flex;flex-direction:column;gap:10px; 225 } 226 #scrubRow{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;} 227 #transportLeft{display:flex;align-items:center;gap:12px;} 228 #playBtn{ 229 width:42px;height:42px;border-radius:50%;background:var(--accent);border:none; 230 color:#04140f;font-size:15px;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none; 231 transition:transform .12s; 232 } 233 #playBtn:hover{transform:scale(1.06);} 234 #timeReadout{font-size:12px;color:var(--ink-dim);min-width:74px;text-align:right;} 235 #controlsRow{display:flex;align-items:center;gap:8px;justify-content:flex-end;} 236 .chip-btn{ 237 background:var(--panel);border:1px solid var(--border);color:var(--ink-dim); 238 padding:6px 11px;border-radius:7px;font-size:11.5px;font-weight:600;cursor:pointer;font-family:'JetBrains Mono'; 239 transition:all .15s; 240 } 241 .chip-btn.active,.chip-btn:hover{color:var(--accent);border-color:var(--accent);} 242 #muteBtn{width:32px;height:32px;border-radius:7px;background:var(--panel);border:1px solid var(--border);color:var(--ink-dim);cursor:pointer;font-size:14px;} 243 #muteBtn:hover{color:var(--accent);border-color:var(--accent);} 244 245 /* ---------- data panel ---------- */ 246 #overlay{position:fixed;inset:0;background:rgba(4,5,9,0.55);opacity:0;pointer-events:none;transition:opacity .25s;z-index:20;} 247 #overlay.show{opacity:1;pointer-events:auto;} 248 #panel{ 249 position:fixed;top:0;right:0;bottom:0;width:380px;max-width:92vw; 250 background:var(--panel);border-left:1px solid var(--border); 251 transform:translateX(100%);transition:transform .3s ease;z-index:21; 252 display:flex;flex-direction:column; 253 } 254 #panel.show{transform:translateX(0);} 255 #panelHead, .panelHead{padding:20px 20px 14px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;} 256 #panelHead h2, .panelHead h2{font-family:'Barlow Condensed';font-weight:700;font-size:20px;margin:0;letter-spacing:0.02em;} 257 #closePanel, #closeLineups{background:none;border:none;color:var(--ink-dim);font-size:20px;cursor:pointer;line-height:1;} 258 #closePanel:hover, #closeLineups:hover{color:var(--ink);} 259 #panelBody, .panelBody{padding:18px 20px 100px;overflow-y:auto;flex:1;} 260 #lineupsPanel, #mapPanel{ 261 position:fixed;top:0;right:0;bottom:0;width:560px;max-width:94vw; 262 background:var(--panel);border-left:1px solid var(--border); 263 transform:translateX(100%);transition:transform .3s ease;z-index:21; 264 display:flex;flex-direction:column; 265 } 266 #lineupsPanel.show, #mapPanel.show{transform:translateX(0);} 267 .lineups-grid{display:flex;gap:18px;} 268 .lineups-col{flex:1;min-width:0;} 269 .lineups-team-head{font-family:'Barlow Condensed';font-weight:700;font-size:17px;margin-bottom:2px;} 270 .lineups-flag{width:22px;height:auto;border-radius:2px;vertical-align:middle;margin-right:7px;box-shadow:0 0 0 1px rgba(255,255,255,0.15);} 271 .lineups-formation{font-size:11px;color:var(--ink-dim);font-family:'JetBrains Mono';margin-bottom:10px;} 272 .lineups-section-label{font-size:10.5px;text-transform:uppercase;letter-spacing:0.07em;color:var(--ink-dim);font-weight:700;margin:14px 0 6px;} 273 .lineup-player{display:flex;gap:8px;align-items:center;font-size:12.5px;padding:4px 0;border-bottom:1px solid rgba(255,255,255,0.05);} 274 .lineup-thumb{width:40px;height:40px;border-radius:50%;object-fit:cover;object-position:50% 15%;flex:none;background:var(--panel-2);cursor:pointer;transition:transform .15s ease;} 275 .lineup-thumb:hover{transform:scale(1.08);} 276 .lineup-thumb-empty{border:1px solid var(--border);} 277 #photoLightbox{ 278 display:none;position:fixed;inset:0;z-index:60;background:rgba(6,8,13,0.92); 279 align-items:center;justify-content:center;flex-direction:column;gap:12px;cursor:pointer; 280 } 281 #photoLightbox.show{display:flex;} 282 #photoLightboxImg{max-width:min(80vw,420px);max-height:65vh;border-radius:12px;border:1px solid var(--border);object-fit:cover;object-position:50% 15%;} 283 #photoLightboxCaption{font-family:'Barlow Condensed';font-weight:700;font-size:20px;color:var(--ink);} 284 .lineup-player .num{font-family:'JetBrains Mono';color:var(--accent);min-width:20px;font-size:11px;} 285 .nm-wrap{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;} 286 .lineup-player .nm{white-space:normal;overflow-wrap:break-word;line-height:1.25;} 287 .lineup-player .cl{color:var(--ink-dim);font-size:11px;white-space:normal;overflow-wrap:break-word;} 288 @media (max-width:640px){ 289 #lineupsPanel, #mapPanel{width:100vw;} 290 .lineups-grid{flex-direction:column;gap:22px;} 291 } 292 .field-group{margin-bottom:18px;} 293 .field-label{font-size:11px;text-transform:uppercase;letter-spacing:0.08em;color:var(--ink-dim);font-weight:600;margin-bottom:7px;display:block;} 294 .team-row{display:flex;gap:10px;} 295 .team-row input[type=text]{flex:1;} 296 input[type=text]{ 297 background:var(--panel-2);border:1px solid var(--border);color:var(--ink);border-radius:7px; 298 padding:8px 10px;font-size:13px;font-family:'Inter';width:100%; 299 } 300 input[type=color]{width:38px;height:36px;padding:2px;border-radius:7px;border:1px solid var(--border);background:var(--panel-2);cursor:pointer;} 301 textarea{ 302 width:100%;min-height:230px;background:var(--panel-2);border:1px solid var(--border);color:var(--ink); 303 border-radius:8px;padding:12px;font-family:'JetBrains Mono';font-size:11.5px;line-height:1.55;resize:vertical; 304 } 305 .hint{font-size:11px;color:var(--ink-dim);margin-top:6px;line-height:1.5;} 306 .hint-details{margin-top:6px;} 307 .hint-details summary{font-size:11px;color:var(--accent);cursor:pointer;user-select:none;list-style:none;} 308 .hint-details summary::-webkit-details-marker{display:none;} 309 .hint-details summary::before{content:'⸠';display:inline-block;transition:transform .15s;} 310 .hint-details[open] summary::before{transform:rotate(90deg);} 311 .hint-details .hint{margin-top:6px;} 312 .panel-section-divider{display:flex;align-items:center;gap:10px;margin:22px 0 14px;} 313 .panel-section-divider::before,.panel-section-divider::after{content:'';flex:1;height:1px;background:var(--border);} 314 .panel-section-divider span{font-size:11px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-dim);white-space:nowrap;} 315 #panelActions{display:flex;gap:9px;margin-top:6px;} 316 .btn-primary{ 317 flex:1;background:var(--accent);border:none;color:#04140f;font-weight:700;font-size:12.5px; 318 padding:10px 12px;border-radius:8px;
318cursor:pointer;letter-spacing:0.02em; 319 } 320 .btn-secondary{ 321 background:transparent;border:1px solid var(--border);color:var(--ink-dim);font-size:12.5px; 322 padding:10px 12px;border-radius:8px;cursor:pointer; 323 } 324 .btn-secondary:hover{color:var(--ink);border-color:var(--ink-dim);} 325 .file-btn{ 326 background:var(--panel-2);border:1px solid var(--border);color:var(--ink-dim); 327 font-size:10.5px;font-weight:600;padding:4px 9px;border-radius:6px;cursor:pointer; 328 font-family:'JetBrains Mono';white-space:nowrap;transition:all .15s; 329 } 330 .file-btn:hover{color:var(--accent);border-color:var(--accent);} 331 #errBox{color:#ff6b6b;font-size:11.5px;margin-top:8px;font-family:'JetBrains Mono';white-space:pre-wrap;display:none;} 332 333 @media (max-width:640px){ 334 #scorebug{gap:12px;padding:8px 14px;} 335 .score-num{font-size:28px;} 336 #ticker{display:none;} 337 #brand .word{font-size:17px;} 338 /* Was a single truncated line (nowrap+ellipsis) that regularly cut the 339 venue name off mid-word on phones. Wrapping to 2 lines instead, on a 340 much wider box, keeps it readable â the header's real height is 341 re-measured after this changes, so nothing downstream overlaps it. */ 342 #brand .meta{font-size:10.5px;max-width:78vw;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.4;} 343 #dataBtn, #lineupsBtn, #mapBtn{padding:8px 12px;font-size:11.5px;} 344 #panel{width:100vw;} 345 } 346 347 @media (prefers-reduced-motion: reduce){ 348 *{transition-duration:0.01ms !important;} 349 } 350 351 /* ---------- dominant-team indicator: one dynamic label (avoids the old 352 fixed left/right labels clashing with the header's team order) ---------- */ 353 #dominantLabel{ 354 position:fixed;left:0;right:0;bottom:250px;text-align:center; 355 font-family:'Barlow Condensed';font-weight:700;font-size:17px;letter-spacing:0.08em; 356 text-transform:uppercase;pointer-events:none;z-index:5;transition:color .3s ease; 357 } 358 @media (max-width:640px){ 359 #dominantLabel{bottom:210px;font-size:13px;} 360 } 361 #shareBar{ 362 position:fixed;bottom:202px;left:50%;transform:translateX(-50%); 363 display:flex;flex-direction:column;align-items:center;gap:4px; 364 pointer-events:none;z-index:5;width:280px;max-width:70vw; 365 } 366 #shareTrack{ 367 width:100%;height:8px;border-radius:4px;overflow:hidden; 368 display:flex;background:var(--panel-2);border:1px solid var(--border); 369 } 370 #shareHomeFill{background:var(--home);height:100%;transition:width .3s ease;} 371 #shareAwayFill{background:var(--away);height:100%;transition:width .3s ease;} 372 #shareLabels{ 373 display:flex;justify-content:space-between;width:100%; 374 font-family:'JetBrains Mono';font-size:10px;color:var(--ink-dim); 375 } 376 @media (max-width:640px){ 377 #shareBar{bottom:168px;width:220px;} 378 } 379 #shareLoadError{ 380 display:none;position:fixed;top:calc(var(--header-h) + 12px);left:50%;transform:translateX(-50%); 381 z-index:50;max-width:min(90vw,560px);background:rgba(30,10,10,0.95);border:1px solid #ff6b6b; 382 border-radius:10px;padding:14px 18px;color:#ff9b9b;font-size:12.5px;line-height:1.5; 383 font-family:'JetBrains Mono';box-shadow:0 8px 24px rgba(0,0,0,0.4); 384 } 385 #shareLoadErrorRow{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;} 386 #shareLoadErrorText{white-space:pre-wrap;} 387 #shareLoadErrorClose{background:none;border:none;color:#ff9b9b;font-size:16px;cursor:pointer;line-height:1;flex:none;} 388 #mainPossessionBar{ 389 display:none;position:fixed;top:calc(var(--header-h) + var(--scorebug-h) + 14px);left:50%;transform:translateX(-50%); 390 width:220px;pointer-events:none;z-index:5; 391 } 392 #mainPossessionLabel{font-family:'JetBrains Mono';font-size:10px;letter-spacing:0.06em;color:var(--ink-dim);text-align:center;margin-bottom:5px;} 393 #mainPossessionTrack{height:8px;border-radius:4px;overflow:hidden;background:var(--panel-2);border:1px solid var(--border);display:flex;} 394 #mainPossessionHomeFill{height:100%;} 395 #mainPossessionAwayFill{height:100%;} 396 #mainPossessionLabels{display:flex;justify-content:space-between;width:100%;font-family:'JetBrains Mono';font-size:10px;color:var(--ink-dim);margin-top:4px;} 397 #debugPanel{ 398 position:fixed;left:10px;right:10px;bottom:212px;max-height:26vh; 399 background:rgba(6,8,13,0.95);border:1px solid #ff6b6b;border-radius:10px; 400 z-index:999;display:flex;flex-direction:column;overflow:hidden; 401 font-family:'JetBrains Mono',monospace;font-size:10.5px; 402 } 403 #debugHead{ 404 display:flex;justify-content:space-between;align-items:center; 405 padding:8px 10px;border-bottom:1px solid #333;color:#ff6b6b;font-weight:600;letter-spacing:0.04em; 406 } 407 #debugHead button{ 408 background:#1a1e29;border:1px solid #333;color:#e9ecf3;border-radius:5px; 409 font-size:10px;padding:4px 8px;cursor:pointer; 410 } 411 #debugBody{padding:8px 10px;overflow-y:auto;color:#9fe6c7;line-height:1.6;white-space:pre-wrap;word-break:break-word;} 412 #showDebug{ 413 background:var(--panel);border:1px solid var(--border);color:var(--ink-dim); 414 padding:9px 12px;border-radius:8px;font-size:13px;
414cursor:pointer;flex:0 0 auto; 415 } 416 #showDebug:hover{border-color:#ff6b6b;color:#ff6b6b;} 417</style> 418</head> 419<body> 420 421<div id="canvas-wrap"></div> 422<div id="shareLoadError"> 423 <div id="shareLoadErrorRow"> 424 <div id="shareLoadErrorText"></div> 425 <button id="shareLoadErrorClose">×</button> 426 </div> 427</div> 428 429<div id="header"> 430 <div id="brand"> 431 <div class="word"><span class="wordmark-arrow left"></span> Tidal <span class="wordmark-arrow right"></span> <span id="versionTag">v120</span></div> 432 <div class="meta mono" id="metaLine">FIFA World Cup 2026 · 18 July 2026</div> 433 </div> 434 <div style="display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;align-items:center;"> 435 <div id="venueMapThumb" style="display:none;" title="Tap to expand the venue map"> 436 <div id="venueMapIcon">ð</div> 437 <iframe id="venueMapThumbFrame" loading="lazy" scrolling="no"></iframe> 438 <button id="venueMapCloseBtn" title="Collapse map">â</button> 439 </div> 440 <button id="dataBtn">â Data</button> 441 <button id="lineupsBtn">ð¥ Lineups</button> 442 <button id="showDebug" title="Diagnostics">ð </button> 443 </div> 444</div> 445 446<div id="scorebug"> 447 <div class="team-tag"><div class="swatch" id="swatchHome"></div> 448 <div><div class="team-name" id="nameHome">FRA</div><div class="score-num" id="scoreHome">0</div><img id="flagHome" class="team-flag" style="display:none;"></div> 449 </div> 450 <div id="minuteClock"><div class="m mono" id="minuteNum">0'</div><div class="half" id="halfLbl">1ST HALF</div></div> 451 <div class="team-tag"><div><div class="team-name" id="nameAway" style="text-align:right;">ENG</div><div class="score-num" id="scoreAway">0</div><img id="flagAway" class="team-flag" style="display:none;margin-left:auto;"></div> 452 <div class="swatch" id="swatchAway"></div> 453 </div> 454</div> 455 456<div id="mainPossessionBar"> 457 <div id="mainPossessionLabel">OVERALL POSSESSION</div> 458 <div id="mainPossessionTrack"><div id="mainPossessionHomeFill"></div><div id="mainPossessionAwayFill"></div></div> 459 <div id="mainPossessionLabels"><span id="mainPossessionHomePct"></span><span id="mainPossessionAwayPct"></span></div> 460</div> 461 462<div id="penCountHome" style="display:none;"></div> 463<div class="tick-col" id="tickHome"></div> 464<div id="penCountAway" style="display:none;"></div> 465<div class="tick-col" id="tickAway"></div> 466 467<div id="shareBar"> 468 <div id="shareTrack"><div id="shareHomeFill"></div><div id="shareAwayFill"></div></div> 469 <div id="shareLabels"><span id="shareHomePct">50%</span><span id="shareAwayPct">50%</span></div> 470</div> 471 472<div id="dominantLabel"></div> 473 474<div id="goalFlash"><img id="flashPhoto" style="display:none;"><div><span class="lbl" id="flashLbl">GOAL</span><span class="sub" id="flashSub"></span></div></div> 475 476<div id="chartPanel"><canvas id="possessionChart"></canvas></div> 477 478<div id="transport"> 479 <div id="scrubRow"> 480 <div id="transportLeft"> 481 <button id="playBtn">â¶</button> 482 <span id="timeReadout" class="mono">0' / 98'</span> 483 </div> 484 <div id="controlsRow"> 485 <button class="chip-btn" data-speed="0.5">0.5Ã</button> 486 <button class="chip-btn active" data-speed="1">1Ã</button> 487 <button class="chip-btn" data-speed="2">2Ã</button> 488 <button class="chip-btn" data-speed="4">4Ã</button> 489 <button id="muteBtn">ð</button> 490 </div> 491 </div> 492</div> 493 494<div id="overlay"></div> 495<div id="panel"> 496 <div id="panelHead"><h2>Data</h2><button id="closePanel">â</button></div> 497 <div id="panelBody"> 498 <div class="field-group"> 499 <div style="display:flex;gap:10px;"> 500 <div style="flex:1;min-width:0;"> 501 <span class="field-label">Home team</span> 502 <div class="team-row"> 503 <input type="text" id="inHomeName" value="France"> 504 <input type="color" id="inHomeColor" value="#2451e0"> 505 </div> 506 </div> 507 <div style="flex:1;min-width:0;"> 508 <span class="field-label">Away team</span> 509 <div class="team-row"> 510 <input type="text" id="inAwayName" value="England"> 511 <input type="color" id="inAwayColor" value="#ffffff"> 512 </div> 513 </div> 514 </div> 515 </div> 516 <div class="field-group">
517 <span class="field-label">Competition / date</span> 518 <div class="team-row"> 519 <input type="text" id="inComp" value="FIFA World Cup 2026"> 520 <input type="text" id="inDate" value="18 July 2026" style="max-width:120px;"> 521 </div> 522 </div> 523 <div class="field-group"> 524 <span class="field-label">Venue</span> 525 <input type="text" id="inVenue" value=""> 526 </div> 527 <div class="field-group"> 528 <span class="field-label">Flags or crests</span> 529 <div class="team-row"> 530 <input type="text" id="inHomeFlag" list="fifaNationsList" placeholder="Search home nation, or paste a crest URLâ¦" autocomplete="off"> 531 <input type="text" id="inAwayFlag" list="fifaNationsList" placeholder="Search away nation, or paste a crest URLâ¦" autocomplete="off"> 532 </div> 533 <datalist id="fifaNationsList"></datalist> 534 <details class="hint-details"> 535 <summary>Club match, not international?</summary> 536 <div class="hint">For a club instead of a nation, in the CSV for this match (e.g. downloaded from Tidal) paste a direct image URL to the club's crest â a Wikipedia club page is usually the easiest source: open the page, right-click the crest image in the infobox, and copy its image address. For example, Norwich City's crest: <code>https://upload.wikimedia.org/wikipedia/en/thumb/1/17/Norwich_City_FC_logo.svg/250px-Norwich_City_FC_logo.svg.png</code>. Typing a nation name still searches the list as normal; typing a raw ISO code (e.g. "fr", "gb-eng") also works.</div> 537 </details> 538 </div> 539 <div class="field-group"> 540 <span class="field-label">Data format (upload and download)</span> 541 <div id="formatToggle" style="display:flex;gap:8px;"> 542 <button class="chip-btn active" data-mode="csv" style="flex:1;">CSV</button> 543 <button class="chip-btn" data-mode="json" style="flex:1;">JSON</button> 544 <button class="chip-btn" data-mode="fotmob" style="flex:1;">Import</button> 545 </div> 546 </div> 547 548 <div id="fotmobFields" style="display:none;"> 549 <div class="field-group"> 550 <span class="field-label">Match stats API response (paste full JSON)</span> 551 <textarea id="fotmobJson" spellcheck="false" style="min-height:180px;" placeholder='Paste the WHOLE match-detail response from your stats provider (DevTools: right-click the request â Copy â Copy response). The app will pull out the timeline, team names, and goal events from it. Pasting just the momentum/timeline section still works too.'></textarea> 552 <details class="hint-details"> 553 <summary>How do I get this?</summary> 554 <div class="hint"> 555 From a match-stats website: open a match â DevTools (F12) â Network tab â reload â find the request that returns the match's full detail (timeline/momentum, events, lineups) â right-click it â Copy â <b>Copy response</b> (this avoids partial/truncated copies) â paste the whole thing here.<br><br> 556 <b>Timeline</b> (the momentum curve) is reliably extracted â confirmed against real match data. <b>Events (goals) and team colours are best-effort</b> â field names vary by provider and aren't all confirmed, so check the preview against what you know actually happened before using the result. Team names are used if found; colours are left alone if not found, rather than guessed. 557 </div> 558 </details> 559 <label style="display:flex;align-items:center;gap:8px;margin-top:10px;font-size:12px;color:var(--ink-dim);"> 560 <input type="checkbox" id="fotmobFlipSign"> Flip sign (tick if the result looks like home/away are swapped) 561 </label> 562 </div> 563 <div id="fotmobPreview" class="hint" style="display:none;"></div> 564 <div id="panelActionsFotmob" style="display:flex;gap:9px;margin-top:6px;"> 565 <button class="btn-primary" id="convertFotmobBtn">Convert</button> 566 </div> 567 </div> 568 569 570 <div id="csvFields"> 571 <div class="field-group"> 572 <span class="field-label">Match CSV</span> 573 <div style="display:flex;justify-content:flex-end;
573gap:6px;flex-wrap:wrap;"> 574 <button class="file-btn" id="downloadCombinedBtn" title="Download everything (match info + timeline + events + lineups) as one CSV">Download</button> 575 <button class="file-btn" id="uploadCsvBtn" title="Upload a CSV â auto-detects match info / timeline / events / combined by its header row">Upload</button> 576 <input type="file" id="uploadCsvInput" accept=".csv,text/csv" style="display:none;"> 577 </div> 578 <div class="hint">Team names/colours, competition, date, venue, timeline, goals, and lineups all live in one spreadsheet-friendly CSV file â see the Local match demo (linked from the home screen) for the expected format. Build a new match by editing a copy of that file directly, then upload it here.</div> 579 <div class="hint">â Anything changed in this app â fetched photos, attached audio, edits made here â only exists in this browser tab. Download the CSV (or create a Share link) to keep it; reloading this page or coming back to the original file later won't remember it.</div> 580 </div> 581 <div id="csvUploadStatus" class="hint" style="display:none;"></div> 582 583 <div class="field-group"> 584 <span class="field-label">Player photos (optional)</span> 585 <button class="file-btn" id="fetchWikiBtn" style="width:100%;text-align:left;" title="Fill in blank photo fields (goal scorers + lineup players + penalty takers) from Wikipedia, where a page/photo exists">ð¼ Fetch Wikipedia photos</button> 586 <details class="hint-details"> 587 <summary>What does this do?</summary> 588 <div class="hint">Use image URLs for players if they exist. It may be possible to batch-source well-known player images from Wikipedia â this looks up each blank photo field by name and fills in a page image where one's found; anyone not on Wikipedia (e.g. amateur/local players) is left blank for a manual URL instead.</div> 589 </details> 590 </div> 591 <div id="wikiFetchStatus" class="hint" style="display:none;"></div> 592 593 <div class="field-group"> 594 <label style="display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-dim);"> 595 <input type="checkbox" id="inHasExtraTime"> Match went to extra time 596 </label> 597 <details class="hint-details"> 598 <summary>What does this control?</summary> 599 <div class="hint">Controls period labelling and the halftimeâET audio cue. Leave unticked for a normal match â the second half (including any stoppage time) will always be labelled "2ND HALF" regardless of how many added minutes it runs to.</div> 600 <div class="hint">Match duration is worked out automatically from whichever data goes latest â the momentum timeline, a stoppage-time goal, or an ambient audio window. If none of those reflect genuine injury time with no goal in it (e.g. a scoreless stoppage period), add a <code>max_minute</code> row to the Meta CSV with the true final minute to override it directly.</div> 601 </details> 602 </div> 603 604 <div class="field-group"> 605 <span class="field-label">Commentary audio (optional)</span> 606 <div style="display:flex;gap:6px;align-items:center;flex-wrap:wrap;"> 607 <select id="audioEventPicker" style="flex:1;min-width:120px;background:var(--panel-2);border:1px solid var(--border);color:var(--ink);border-radius:7px;padding:6px 8px;font-size:11.5px;"></select> 608 <button class="file-btn" id="attachAudioBtn">ð Attach commentary clip</button> 609 <input type="file" id="attachAudioInput" accept="audio/*" style="display:none;"> 610 </div> 611 <details class="hint-details"> 612 <summary>What does this do?</summary> 613 <div class="hint">Attaches a short clip (e.g. commentary) that plays instead of the crowd roar for that specific event or penalty kick, with the match automatically slowing down for the audio clip's full length (capped at 25 seconds â the clip still finishes playing in full, but the match won't stay frozen indefinitely if an unusually long file is attached). Clips are stored as embedded data, so they're attached here rather than edited directly in the CSV.</div> 614 <div class="hint">The clip is embedded directly as data â not a link â so it's included automatically if you download the match as a CSV, and stays with the match wherever it's shared or reloaded from.</div> 615 <div class="hint"><b>Keep clips short and compressed</b>
615 â a few seconds is usually enough, and every clip adds to the total file size shared or saved. MP3 or M4A/AAC work everywhere the app runs; WAV is uncompressed and gets large fast once embedded (worse again after the ~33% size increase from encoding it as text); OGG isn't supported in Safari/iOS. Mono, modest quality (e.g. ~64â96kbps) is plenty for spoken commentary. There's no hard limit on how many clips a match can have, but a handful of short, compressed clips stays comfortably safe; many long or uncompressed ones risk hitting size limits when sharing.</div> 616 </details> 617 <div id="attachAudioStatus" class="hint" style="display:none;"></div> 618 </div> 619 620 <!-- The four boxes below are the pre-combined-CSV per-section format from 621 the app's early build. The combined CSV above supersedes them for 622 normal use, so they're hidden from the panel, but left in place 623 (not removed) since Apply Data / Wiki Fetch / Reset to sample all 624 still read and write these specific elements directly â hiding 625 them here is purely cosmetic simplification, not a data-model 626 change, so nothing about how a match actually loads has changed. --> 627 <div style="display:none;"> 628 <div class="field-group"> 629 <div style="display:flex;justify-content:space-between;align-items:center;"> 630 <span class="field-label">Match info CSV â key, value</span> 631 <button class="file-btn" id="downloadMetaBtn" title="Download match-info.csv">Download</button> 632 </div> 633 <textarea id="metaCsv" spellcheck="false" style="min-height:150px;"></textarea> 634 </div> 635 <div class="field-group"> 636 <div style="display:flex;justify-content:space-between;align-items:center;"> 637 <span class="field-label">Timeline CSV â minute, value (â1 to 1)</span> 638 <button class="file-btn" id="downloadTimelineBtn" title="Download timeline.csv">Download</button> 639 </div> 640 <textarea id="timelineCsv" spellcheck="false" style="min-height:150px;"></textarea> 641 </div> 642 <div class="field-group"> 643 <div style="display:flex;justify-content:space-between;align-items:center;"> 644 <span class="field-label">Events CSV â minute, team (home/away), label, photo, audio (optional)</span> 645 <button class="file-btn" id="downloadEventsBtn" title="Download events.csv">Download</button> 646 </div> 647 <textarea id="eventsCsv" spellcheck="false" style="min-height:120px;"></textarea> 648 </div> 649 <div class="field-group"> 650 <div style="display:flex;justify-content:space-between;align-items:center;"> 651 <span class="field-label">Lineups CSV â team, role (starter/sub), number, name, club, age</span> 652 <button class="file-btn" id="downloadLineupsBtn" title="Download lineups.csv">Download</button> 653 </div> 654 <textarea id="lineupsCsv" spellcheck="false" style="min-height:120px;"></textarea> 655 </div> 656 <div class="field-group"> 657 <div style="display:flex;justify-content:space-between;align-items:center;"> 658 <span class="field-label">Penalties CSV â team, taker, outcome (score/miss)</span> 659 <button class="file-btn" id="downloadPenaltiesBtn" title="Download penalties.csv">Download</button> 660 </div> 661 <textarea id="penaltiesCsv" spellcheck="false" style="min-height:100px;"></textarea> 662 </div> 663 </div> 664 </div> 665 666 <div id="jsonFields" style="display:none;"> 667 <div class="field-group"> 668 <div style="display:flex;justify-content:space-between;align-items:center;"> 669 <span class="field-label">Match data (JSON)</span> 670 <div style="display:flex;gap:6px;"> 671 <button class="file-btn" id="uploadJsonBtn" title="Upload match.json">Upload</button> 672 <button class="file-btn" id="downloadJsonBtn" title="Download match.json">Download</button> 673 </div> 674 </div> 675 <textarea id="dataJson" spellcheck="false"></textarea> 676 <input type="file" id="uploadJsonInput" accept=".json,application/json" style="display:none;"> 677 <div class="hint">timeline: [minute, value] pairs, value from â1 (away threatening) to 1 (home threatening). events: goals with minute + team ('home'/'away') + optional label + optional photo (image URL).</div> 678 </div> 679 </div> 680 681 <div class="panel-section-divider"><span>Share link</span></div> 682 <div id="shareFields"> 683 <div class="field-group">
684 <span class="field-label">Link type</span> 685 <div id="shareModeToggle" style="display:flex;gap:8px;flex-wrap:nowrap;"> 686 <div style="flex:1;min-width:0;"> 687 <button class="chip-btn active" data-sharemode="view" style="width:100%;">View only</button> 688 <div class="hint">View only opens straight into playback with no access to the Data & teams panel (default).</div> 689 </div> 690 <div style="flex:1;min-width:0;"> 691 <button class="chip-btn" data-sharemode="edit" style="width:100%;">Fully configurable</button> 692 <div class="hint">Fully configurable opens fully editable app with current match already loaded.</div> 693 </div> 694 </div> 695 </div> 696 <div id="shareLineupWarning" class="hint" style="display:none;color:var(--gold);"></div> 697 <div class="field-group"> 698 <span class="field-label">Share link</span> 699 <div style="display:flex;gap:6px;"> 700 <button class="btn-primary" id="shareCreateBtn">Create share link</button> 701 <input type="text" id="shareUrlOutput" readonly spellcheck="false" style="flex:1;"> 702 <button class="file-btn" id="shareCopyBtn">Copy</button> 703 </div> 704 <button class="file-btn" id="shareNewLinkBtn" style="margin-top:6px;">Start a new link (instead of updating the last one)</button> 705 <div id="shareStatus" class="hint" style="display:none;"></div> 706 <div class="hint">Creating a link updates the same URL each time by default, so anyone you've already sent it to always sees the latest version. Use "Start a new link" only when you actually want a separate, different URL â the old one keeps working on its own after that.</div> 707 </div> 708 <div class="field-group"> 709 <span class="field-label">Load a share link</span> 710 <div style="display:flex;gap:6px;"> 711 <input type="text" id="loadShareUrl" placeholder="Paste a share link here" spellcheck="false" style="flex:1;"> 712 <button class="file-btn" id="loadShareBtn">Load</button> 713 </div> 714 <div class="hint">Opening a share link directly in the browser loads it automatically â this box is only for pasting one in manually.</div> 715 </div> 716 </div> 717 718 <div id="errBox"></div> 719 <div id="panelActions"> 720 <button class="btn-secondary" id="resetSample">Reset to sample</button> 721 <button class="btn-primary" id="applyData">Apply data</button> 722 </div> 723 </div> 724</div> 725 726<div id="photoLightbox" onclick="closePhotoLightbox()"> 727 <img id="photoLightboxImg" src=""> 728 <div id="photoLightboxCaption"></div> 729</div> 730 731<div id="lineupsPanel"> 732 <div class="panelHead"><h2>Lineups</h2><button id="closeLineups">â</button></div> 733 <div class="panelBody"> 734 <div id="lineupsEmpty" class="hint">No lineup data loaded for this match yet â import it via the Import tab in Data & teams, or add lineup rows to the Match CSV there.</div> 735 <div id="lineupsPossession" style="display:none;padding:14px 20px 0;"></div> 736 <div id="lineupsContent" style="display:none;"> 737 <div class="lineups-grid"> 738 <div class="lineups-col"> 739 <div class="lineups-team-head" id="lineupsHomeHead"></div> 740 <div class="lineups-section-label">Starting XI</div> 741 <div id="lineupsHomeStarters"></div> 742 <div class="lineups-section-label">Substitutes</div> 743 <div id="lineupsHomeSubs"></div> 744 </div> 745 <div class="lineups-col"> 746 <div class="lineups-team-head" id="lineupsAwayHead"></div> 747 <div class="lineups-section-label">Starting XI</div> 748 <div id="lineupsAwayStarters"></div> 749 <div class="lineups-section-label">Substitutes</div> 750 <div id="lineupsAwaySubs"></div> 751 </div> 752 </div> 753 </div> 754 </div> 755</div> 756 757<div id="mapPanel"> 758 <div class="panelHead"><h2>Venue</h2><button id="closeMap">â</button></div> 759 <div class="panelBody"> 760 <div id="mapEmpty" class="hint">No venue coordinates set for this match â add "venue_lat" and "venue_long" rows to the Match CSV, or import a match via the Import tab (which fills these in automatically when available).</div> 761 <div id="mapContent" style="display:none;"> 762 <div id="mapVenueName" style="font-family:'Barlow Condensed';font-weight:700;font-size:17px;margin-bottom:10px;"></div> 763 <iframe id="mapFrame" style="width:100%;height:280px;border:1px solid var(--border);border-radius:10px;" loading="lazy"></iframe> 764 <div class="hint" style="margin-top:8px;">Map data © <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener" style="color:var(--accent);">OpenStreetMap</a> contributors.</div> 765 </div> 766 </div> 767</div> 768 769<div id="debugPanel" style="display:none;"> 770 <div id="debugHead"> 771 <span>Diagnostics</span> 772 <div style="display:flex;gap:8px;"> 773 <button id="copyLog">Copy</button> 774 <button id="hideDebug">Hide</button> 775 </div> 776 </div> 777 <div id="debugBody"></div> 778</div> 779
780<script> 781 window.__tlogs = []; 782 function tlog(msg){ 783 const t = new Date().toISOString().split('T')[1].replace('Z',''); 784 const line = t+' '+msg; 785 window.__tlogs.push(line); 786 const body = document.getElementById('debugBody'); 787 if(body){ 788 const p = document.createElement('div'); 789 p.textContent = line; 790 body.appendChild(p); 791 body.scrollTop = body.scrollHeight; 792 } 793 } 794 window.onerror = function(msg, url, line, col, error){ 795 tlog('JS ERROR: '+msg+' ('+(url?url.split('/').pop():'?')+':'+line+':'+col+')'); 796 return false; 797 }; 798 window.addEventListener('unhandledrejection', function(e){ 799 tlog('UNHANDLED PROMISE REJECTION: '+(e.reason && e.reason.message ? e.reason.message : e.reason)); 800 }); 801 tlog('Page script started.'); 802 tlog('User agent: '+navigator.userAgent); 803 (function(){ 804 try{ 805 const c = document.createElement('canvas'); 806 const gl = c.getContext('webgl') || c.getContext('experimental-webgl'); 807 tlog('WebGL available: '+(gl ? 'YES' : 'NO')); 808 if(gl){ 809 const dbg = gl.getExtension('WEBGL_debug_renderer_info'); 810 if(dbg) tlog('GPU renderer: '+gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL)); 811 } 812 }catch(err){ tlog('WebGL check threw: '+err.message); } 813 tlog('Device pixel ratio: '+window.devicePixelRatio+' | viewport: '+window.innerWidth+'x'+window.innerHeight); 814 })(); 815</script>
vendor: 1 bytes, line 815
815
vendor: 31,990 bytes, lines 816-824
816<script> 817/* three.js r128 â bundled inline to avoid any dependency on an external CDN, 818 since some mobile browsers/networks block cdnjs.cloudflare.com. */ 819/** 820 * @license 821 * Copyright 2010-2021 Three.js Authors 822 * SPDX-License-Identifier: MIT 823 */ 824!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}
vendor: 7,246 bytes, line 824
824round(){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.radiu
vendor: 15,121 bytes, line 824
824s=.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
824new 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)}
vendor: 8,767 bytes, line 824
824setRotationFromMatrix(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;
vendor: 5,889 bytes, line 824
824const 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}
vendor: 4,678 bytes, line 824
824if(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&&
vendor: 4,816 bytes, line 824
824(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}
vendor: 13,180 bytes, line 824
824function 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 "fal
824se".',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 "fal
824se".',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"}};
vendor: 20,458 bytes, line 824
824if(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;
vendor: 1,334 bytes, line 824
824p.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:
vendor: 7,835 bytes, line 824
824"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"
824,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
vendor: 30,775 bytes, line 824
824;\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(
824\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}
824\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 );
824\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 ) / (
vendor: 10,877 bytes, line 824
824( 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 ];
vendor: 7,258 bytes, line 824
824\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(
824\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t
vendor: 33,369 bytes, line 824
8241.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}"},
vendor: 590 bytes, line 824
824ui={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)}}
vendor: 5,158 bytes, line 824
824,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:"Backgroun
824dCubeMaterial",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
vendor: 1,372 bytes, line 824
824)}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}}
vendor: 20,760 bytes, line 824
824function 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>
vendor: 12,022 bytes, line 824
8240?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,matc
vendor: 4,768 bytes, line 824
824apEncoding: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);
vendor: 8,965 bytes, line 824
824(!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 ) );
824\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()}
vendor: 28,698 bytes, line 824
824t.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}
vendor: 11,556 bytes, line 824
824,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
824),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&&
824(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)&<.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}
824function 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(
824),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.isWebG
vendor: 18,525 bytes, line 824
824L2||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() n
824o 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>
vendor: 4,123 bytes, line 824
8240){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="C
824oneGeometry",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,
vendor: 14,718 bytes, line 824
82419,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={radiu
824s: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"}}
vendor: 29,647 bytes, line 824
824class 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;
vendor: 6,236 bytes, line 824
824case"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.t
vendor: 21,253 bytes, line 824
824ype&&(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="Orthogra
824phicCamera",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&&
vendor: 5,541 bytes, line 824
824(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);
824s=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.getIn
vendor: 10,945 bytes, line 824
824put()),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 no
824de 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 infrastru
824cture 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;
vendor: 5,935 bytes, line 824
824else{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())}}
824class 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)}
vendor: 10,703 bytes, line 824
824applyMatrix4(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(
824) 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(
824) 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(
824) 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(
824) 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.")}
vendor: 11,723 bytes, line 824
824,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(
824) 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
824is 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(
824)."),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
vendor: 6,082 bytes, line 824
824=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=
8247,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
vendor: 24,671 bytes, lines 824-827
824),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})})); 825 826tlog('Three.js loaded from inline bundle. typeof THREE = '+typeof THREE); 827</script>
vendor: 1 bytes, line 827
827
vendor: 4,729 bytes, lines 828-832
828<script> 829/* lz-string v1.5.0 â bundled inline (same reasoning as the Three.js bundle above: 830 no dependency on an external CDN). Source: pieroxy/lz-string, tag 1.5.0, 831 libs/lz-string.min.js, unmodified. Used only for the compressed-URL share path. */ 832var LZString=function(){var r=String.fromCharCode,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n<r.length;n++)e[r][r.charAt(n)]=n}return e[r][o]}var i={compressToBase64:function(r){if(null==r)return"";var n=i._compress(r,6,function(r){return o.charAt(r)});switch(n.length%4){default:case 0:return n;case 1:return n+"===";case 2:return n+"==";case 3:return n+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(n){return t(o,r.charAt(n))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(r){return null==r?"":""==r?null:i._decompress(r.length,16384,function(o){return r.charCodeAt(o)-32})},compressToUint8Array:function(r){for(var o=i.compress(r),n=new Uint8Array(2*o.length),e=0,t=o.length;e<t;e++){var s=o.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e<t;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(r){return null==r?"":i._compress(r,6,function(r){return n.charAt(r)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(o){return t(n,r.charAt(o))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(r,o,n){if(null==r)return"";var e,t,i,s={},u={},a="",p="",c="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<r.length;i+=1)if(a=r.charAt(i),Object.prototype.hasOwnProperty.call(s,a)||(s[a]=f++,u[a]=!0),p=c+a,Object.prototype.hasOwnProperty.call(s,p))c=p;else{if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(""!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join("")},decompress:function(r){return null==r?"":""==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m="",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return""}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return"";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}
832v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString}); 833tlog('LZString loaded from inline bundle. typeof LZString = '+typeof LZString); 834</script>
vendor: 1 bytes, line 834
834
835<script> 836(function(){ 837 838tlog('Main script starting. typeof THREE = '+typeof THREE); 839if(typeof THREE === 'undefined'){ 840 tlog('ABORTING: THREE is undefined, cannot build 3D scene.'); 841 document.getElementById('canvas-wrap').innerHTML = 842 '<div style="color:#e9ecf3;font-family:sans-serif;padding:40px;text-align:center;">'+ 843 'The 3D library failed to load, likely blocked by your network or an ad-blocker.<br>'+ 844 'Check the Diagnostics panel below for details.</div>'; 845 return; 846} 847 848/* ============================================================ 849 SAMPLE DATA (approximate reconstruction of France 4-6 England, 850 World Cup 2026 3rd place play-off, attacking-threat sequence) 851 ============================================================ */ 852const SAMPLE = { 853 home:{name:"Red Lion", color:"#FF0000"}, 854 away:{name:"White Lion", color:"#FFFFFF"}, 855 competition:"St Stephen's Trophy", 856 date:"26th December 2025", 857 venue:"Coram's Fields", 858 venueLat:51.5247, 859 venueLong:-0.1197, 860 homeFormation:"4-2-3-1", 861 awayFormation:"4-1-4-1", 862 maxMinute:95, 863 timeline:[ 864 [0,0.0],[1,-0.09],[2,-0.26],[3,-0.69],[4,0.0],[5,0.43],[6,0.33], 865 [7,-0.19],[8,-0.81],[9,-0.85],[10,-0.3],[11,0.43],[12,0.98],[13,1.0], 866 [14,0.87],[15,0.43],[16,0.27],[17,-0.4],[18,-0.7],[19,-0.6],[20,-0.45], 867 [21,0.05],[22,0.24],[23,0.24],[24,0.19],[25,0.0],[26,-0.11],[27,-0.16], 868 [28,-0.16],[29,0.6],[30,0.81],[31,0.5],[32,0.16],[33,-0.11],[34,-0.22], 869 [35,0.14],[36,0.41],[37,0.35],[38,0.16],[39,-0.27],[40,-0.27],[41,-0.54], 870 [42,-0.33],[43,-0.41],[44,-0.03],[45,-0.03],[46,-0.22],[47,-0.22],[48,0.27], 871 [49,0.44],[50,0.89],[51,0.39],[52,-0.03],[53,-0.11],[54,0.33],[55,0.43], 872 [56,0.43],[57,0.0],[58,0.05],[59,-0.54],[60,-0.54],[61,-0.33],[62,0.0], 873 [63,-0.8],[64,-0.9],[65,-1.0],[66,0.7],[67,0.62],[68,0.98],[69,0.46], 874 [70,0.46],[71,1.0],[72,0.6],[73,-0.16],[74,-0.22],[75,0.46],[76,0.84], 875 [77,1.0],[78,0.76],[79,0.65],[80,-1.0],[81,0.33],[82,0.22],[83,1.0], 876 [84,0.22],[85,0.03],[86,0.4],[87,0.9],[88,-0.2],[89,-0.05],[90,-0.05], 877 [91,0.9],[92,0.85],[93,-0.35],[94,-0.5],[95,0.0] 878 ], 879 events:[ 880 {minute:3, team:"away", label:"Owen Ellis · 3'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 881 {minute:9, team:"away", label:"Dean Mitchell · 9'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 882 {minute:13, team:"home", label:"Andy \"Erling\" Price ·13'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 883 {minute:18, team:"away", label:"Harry \"Kylian\" Walsh ·18'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 884 {minute:30, team:"home", label:"Jack Doyle · 30'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 885 {minute:50, team:"home", label:"Gary Wilkes · 50'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 886 {minute:65, team:"away", label:"Luke Bailey · 65'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 887 {minute:71, team:"home", label:"Mick Turner · 71'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 888 {minute:80, team:"away", label:"Harry \"Kylian\" Walsh ·80'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 889 {minute:87, team:"home", label:"Andy \"Erling\" Price · 87'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"} 890 ], 891 lineup:[ 892 {team:"home", role:"starter", number:"1", name:"Dave \"Safe Hands\" Carter (GK)", club:"Norwich City", age:"49", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 893 {team:"home", role:"starter", number:"2", name:"Liam Briggs (RB)", club:"Arsenal", age:"33", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 894 {team:"home", role:"starter", number:"3", name:"Ben Foster (LB)", club:"Milan", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 895 {team:"home", role:"starter", number:"4", name:"Mick Turner (CB)", club:"Chelsea", age:"52", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 896 {team:"home", role:"starter", number:"5", name:"Steve Collins (CB)", club:"Brentford", age:"25", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 897 {team:"home", role:"starter", number:"6", name:"Gary Wilkes (DM)", club:"Manchester United", age:"20", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 898 {team:"home", role:"starter", number:"7", name:"Tom Henson (RM)", club:"Manchester City", age:"24", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 899 {team:"home", role:"starter", number:"8", name:"Jack Doyle (CM)", club:"Real Madrid", age:"22", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 900 {team:"home", role:"starter", number:"9", name:"Ryan Cooper (LM)", club:"Atletico Madrid", age:"21", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 901 {team:"home", role:"starter", number:"10", name:"Chris Mason (ST)", club:"Brighton & Hove Albion", age:"39", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 902 {team:"home", role:"starter", number:"11", name:"Andy \"Erling\" Price (ST)", club:"Bayern München", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 903 {team:"home", role:"sub", number:"12", name:"Joe Parker (GK)", club:"Aston Villa", age:"32", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 904 {team:"home", role:"sub", number:"13", name:"Matt Harris", club:"Rennes", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 905 {team:"home", role:"sub", number:"14", name:"Lewis Grant", club:"West Ham United", age:"29", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 906 {team:"home", role:"sub", number:"15", name:"Dan Collins", club:"Lens", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 907 {team:"home", role:"sub", number:"16", name:"Sam Evans", club:"Leice
907ster City", age:"35", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}, 908 {team:"away", role:"starter", number:"1", name:"Pete \"The Cat\" Morgan (GK)", club:"Crystal Palace", age:"46", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 909 {team:"away", role:"starter", number:"2", name:"Nathan Reed (RB)", club:"Paris Saint-Germain", age:"30", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 910 {team:"away", role:"starter", number:"3", name:"Alex Brooks (LB)", club:"Barcelona", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 911 {team:"away", role:"starter", number:"4", name:"Rob Bennett (CB)", club:"Everton", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 912 {team:"away", role:"starter", number:"5", name:"Jamie Scott (CB)", club:"Liverpool", age:"26", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 913 {team:"away", role:"starter", number:"6", name:"Carl Hughes (CM)", club:"Sunderland", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 914 {team:"away", role:"starter", number:"7", name:"Luke Bailey (RW)", club:"Newcastle", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 915 {team:"away", role:"starter", number:"8", name:"Connor Shaw (CM)", club:"Leeds", age:"32", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 916 {team:"away", role:"starter", number:"9", name:"Owen Ellis (LW)", club:"Tottenham Hotspur", age:"34", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 917 {team:"away", role:"starter", number:"10", name:"Dean Mitchell (ST)", club:"Dortmund", age:"36", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 918 {team:"away", role:"starter", number:"11", name:"Harry \"Kylian\" Walsh (ST)", club:"Real Madrid", age:"25", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 919 {team:"away", role:"sub", number:"12", name:"Callum White (GK)", club:"Roma", age:"39", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 920 {team:"away", role:"sub", number:"13", name:"Josh King", club:"Benfica", age:"64", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 921 {team:"away", role:"sub", number:"14", name:"Ethan Moore", club:"Marseille", age:"45", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 922 {team:"away", role:"sub", number:"15", name:"Ben Sutton", club:"Fenerbahçe", age:"42", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}, 923 {team:"away", role:"sub", number:"16", name:"Kyle Robinson", club:"Brondby", age:"53", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"} 924 ] 925}; 926 927let match = JSON.parse(JSON.stringify(SAMPLE)); 928 929/* ============================================================ 930 SPLINE â Catmull-Rom over sparse (minute,value) control points 931 ============================================================ */ 932function makeSampler(points){ 933 const pts = points.slice().sort((a,b)=>a[0]-b[0]); 934 return function(m){ 935 if(m<=pts[0][0]) return pts[0][1]; 936 if(m>=pts[pts.length-1][0]) return pts[pts.length-1][1]; 937 let i=0; 938 while(i<pts.length-2 && pts[i+1][0]<m) i++; 939 const p0=pts[Math.max(0,i-1)], p1=pts[i], p2=pts[i+1], p3=pts[Math.min(pts.length-1,i+2)]; 940 const t=(m-p1[0])/(p2[0]-p1[0]); 941 const t2=t*t, t3=t2*t; 942 const v = 0.5*((2*p1[1]) + (-p0[1]+p2[1])*t + 943 (2*p0[1]-5*p1[1]+4*p2[1]-p3[1])*t2 + 944 (-p0[1]+3*p1[1]-3*p2[1]+p3[1])*t3); 945 return Math.max(-1.05, Math.min(1.05, v)); 946 }; 947} 948// --- Penalty shootout: extends the timeline past normal/extra time rather 949// than being a separate screen, per how this was asked for. Each kick 950// occupies exactly one extra "minute" beyond wherever normal/extra time
951// ended. The wave doesn't track real momentum here (there isn't any â it's 952// a shootout) â every kick shifts a running psychological tally: a team 953// scoring swings it toward them, but a team MISSING swings it toward their 954// opponent too (a miss is good news for the other side, not a non-event) â 955// so the wave genuinely swings back and forth kick by kick, never settling 956// until the outcome is actually sealed. The deciding kick â trusted to be 957// whichever one is last in the list, since real data simply stops once a 958// shootout is over â snaps straight to 100/0 regardless of the exact 959// tally at that point, based on who actually has more scored kicks (the 960// tally is a "momentum" read, not the real decider). This segment is 961// sampled with plain linear interpolation (see makeLinearSampler) rather 962// than the same Catmull-Rom spline used for real momentum, which produced 963// a visible dip/wobble around runs of unchanged values. 964function computePenaltyTimelinePoints(m){ 965 if(!m.penalties || !m.penalties.length) return []; 966 const startMinute = m.maxMinute; 967 const points = [[startMinute, 0]]; // anchors exactly at the 50/50 baseline when the shootout starts 968 let homeMakes = 0, awayMakes = 0, tally = 0; 969 m.penalties.forEach((kick, i)=>{ 970 const scored = kick.outcome === 'score'; 971 if(scored){ if(kick.team==='home') homeMakes++; else awayMakes++; } 972 // Every kick moves the tally â scoring swings it toward you, missing 973 // swings it toward your opponent. 974 if(kick.team==='home') tally += scored ? 1 : -1; 975 else tally += scored ? -1 : 1; 976 const isLastKick = i === m.penalties.length-1; 977 // Non-final kicks are capped strictly below full certainty (0.9, not 1.0) 978 // â only the actual deciding kick should ever read as "total"/100%. With 979 // no cap, a lopsided run of kicks before the real decider (e.g. a long 980 // shootout) could otherwise hit the full ±1 early, making it look like 981 // the match was over when it wasn't yet. 982 const lead = homeMakes - awayMakes; // this is what actually decides the shootout, not the tally 983 const value = isLastKick ? (lead>0?1:(lead<0?-1:0)) : Math.max(-0.9, Math.min(0.9, tally*0.2)); 984 points.push([startMinute + i + 1, value]); 985 }); 986 return points; 987} 988function makeLinearSampler(points){ 989 const pts = points.slice().sort((a,b)=>a[0]-b[0]); 990 return function(m){ 991 if(pts.length===0) return 0; 992 if(m<=pts[0][0]) return pts[0][1]; 993 if(m>=pts[pts.length-1][0]) return pts[pts.length-1][1]; 994 let i=0; 995 while(i<pts.length-1 && pts[i+1][0]<m) i++; 996 const p0=pts[i], p1=pts[i+1]; 997 const t=(m-p0[0])/(p1[0]-p0[0]); 998 return p0[1] + (p1[1]-p0[1])*t; 999 }; 1000} 1001function getEffectiveMaxMinute(m){ 1002 return m.maxMinute + (m.penalties ? m.penalties.length : 0); 1003} 1004// Real match momentum uses the smooth spline as before; anything past 1005// match.maxMinute (i.e. the shootout, if there is one) uses the linear 1006// sampler instead â two different kinds of data, two appropriately 1007// different interpolation styles, joined seamlessly at the boundary since 1008// computePenaltyTimelinePoints anchors its first point there. 1009function makeCombinedSampler(m){ 1010 const mainSampler = makeSampler(m.timeline); 1011 const penaltyPoints = computePenaltyTimelinePoints(m); 1012 if(!penaltyPoints.length) return mainSampler; 1013 const penaltySampler = makeLinearSampler(penaltyPoints); 1014 return function(minute){ 1015 return minute <= m.maxMinute ? mainSampler(minute) : penaltySampler(minute); 1016 }; 1017} 1018let sampleValue = makeCombinedSampler(match); 1019 1020/* ============================================================ 1021 THREE.JS SCENE 1022 ============================================================ */ 1023const wrap = document.getElementById('canvas-wrap'); 1024const scene = new THREE.Scene(); 1025scene.background = new THREE.Color(0x0a0d13); 1026tlog('Scene created.'); 1027 1028const camera = new THREE.PerspectiveCamera(26, window.innerWidth/window.innerHeight, 5, 1000); 1029const BASE_CAM_POS = {x:0, y:140, z:290}; 1030const CAM_LOOKAT = {x:0, y:2, z:10}; 1031function positionCamera(){ 1032 const aspect = window.innerWidth/window.innerHeight; 1033 // on narrow/portrait screens the horizontal FOV shrinks a lot relative to vertical, 1034 // cropping the pitch's sides â pull the camera back further to compensate 1035 const scale = aspect < 1 ? Math.min(2.4, 1/aspect) : 1; 1036 camera.position.set(BASE_CAM_POS.x*scale, BASE_CAM_POS.y*scale, BASE_CAM_POS.z*scale); 1037 camera.lookAt(CAM_LOOKAT.x, CAM_LOOKAT.y, CAM_LOOKAT.z); 1038} 1039positionCamera(); 1040 1041const renderer = new THREE.WebGLRenderer({antialias:true, powerPreference:'high-performance'}); 1042const isSmallScreen = Math.min(window.innerWidth, window.innerHeight) < 700; 1043renderer.setPixelRatio(Math.min(window.devicePixelRatio, isSmallScreen ? 1.5 : 2)); 1044renderer.setSize(window.innerWidth, window.innerHeight); 1045wrap.appendChild(renderer.domElement); 1046tlog('Renderer created and canvas appended. Context: '+(renderer.getContext()?'OK':'MISSING')); 1047 1048// strong neutral ambient + a soft, uncoloured key light â keeps the vertex colours (the actual 1049// data signal) true instead of washing them toward grey/green 1050scene.add(new THREE.AmbientLight(0xffffff, 2.3)); 1051const keyLight = new THREE.DirectionalLight(0xffffff, 0.35); 1052keyLight.position.set(-25, 45, 25); 1053scene.add(keyLight); 1054 1055/* ---- pitch group, sized to real FIFA proportions (105m x 68m), rotated at an angle ---- */ 1056const PITCH_LEN = 105, PITCH_WID = 68; // real-world metres: length (goal-to-goal), width (touchline-to-touchline) 1057const pitchGroup = new THREE.Group(); 1058pitchGroup.rotation.y = THREE.MathUtils.degToRad(-52); // clockwise, more oblique 1059scene.add(pitchGroup); 1060 1061function makePitchTexture(){ 1062 const pxPerM = 9; 1063 const c = document.createElement('canvas'); 1064 c.width = PITCH_WID*pxPerM; c.height = PITCH_LEN*pxPerM; 1065 const ctx = c.getContext('2d'); 1066 ctx.fillStyle = "#0f1826"; ctx.fillRect(0,0,c.width,c.height); 1067 ctx.strokeStyle = "rgba(255,255,255,0.32)"; ctx.lineWidth = 2.5; 1068 const m = v => v*pxPerM; 1069 ctx.strokeRect(m(1),m(1),c.width-m(2),c.height-m(2)); 1070 ctx.beginPath(); ctx.moveTo(m(1),c.height/2); ctx.lineTo(c.width-m(1),c.height/2); ctx.stroke(); 1071 ctx.beginPath(); ctx.arc(c.width/2,c.height/2,m(9.15),0,Math.PI*2); ctx.stroke(); 1072 // penalty areas (40.3m x 16.5m) + 6-yard boxes (18.32m x 5.5m) at each end
1073 [0, c.height-m(16.5)].forEach(y=>{ 1074 ctx.strokeRect(c.width/2-m(20.15), y, m(40.3), m(16.5)); 1075 }); 1076 [0, c.height-m(5.5)].forEach(y=>{ 1077 ctx.strokeRect(c.width/2-m(9.16), y, m(18.32), m(5.5)); 1078 }); 1079 return new THREE.CanvasTexture(c); 1080} 1081// same markings, but on a transparent background â drawn ON TOP of the opaque possession 1082// shading so the lines stay crisp and visible instead of getting washed out underneath it 1083function makeMarkingsTexture(){ 1084 const pxPerM = 9; 1085 const c = document.createElement('canvas'); 1086 c.width = PITCH_WID*pxPerM; c.height = PITCH_LEN*pxPerM; 1087 const ctx = c.getContext('2d'); 1088 ctx.strokeStyle = "rgba(255,255,255,0.85)"; ctx.lineWidth = 2.5; 1089 const m = v => v*pxPerM; 1090 ctx.strokeRect(m(1),m(1),c.width-m(2),c.height-m(2)); 1091 ctx.beginPath(); ctx.moveTo(m(1),c.height/2); ctx.lineTo(c.width-m(1),c.height/2); ctx.stroke(); 1092 ctx.beginPath(); ctx.arc(c.width/2,c.height/2,m(9.15),0,Math.PI*2); ctx.stroke(); 1093 [0, c.height-m(16.5)].forEach(y=>{ 1094 ctx.strokeRect(c.width/2-m(20.15), y, m(40.3), m(16.5)); 1095 }); 1096 [0, c.height-m(5.5)].forEach(y=>{ 1097 ctx.strokeRect(c.width/2-m(9.16), y, m(18.32), m(5.5)); 1098 }); 1099 return new THREE.CanvasTexture(c); 1100} 1101const pitch = new THREE.Mesh( 1102 new THREE.PlaneGeometry(PITCH_WID+4, PITCH_LEN+4), 1103 new THREE.MeshBasicMaterial({map:makePitchTexture(), transparent:true, opacity:0.85, fog:false, depthWrite:false}) 1104); 1105pitch.rotation.x = -Math.PI/2; 1106pitch.position.y = -0.4; 1107pitch.renderOrder = 0; 1108pitchGroup.add(pitch); 1109 1110/* ---- halfway line: the true 50:50 reference â the possession line sits on it 1111 exactly when the match is even, and slides toward a goal end otherwise ---- */ 1112/* ---- possession shading: the ground either side of the line is fully shaded 1113 in that team's colour, hard-edged right at the line's position ---- */ 1114const SHADE_LEN_SEG = 70, SHADE_WID_SEG = 18; 1115const shadeGeo = new THREE.BufferGeometry(); 1116const shadeVertCount = (SHADE_LEN_SEG+1)*(SHADE_WID_SEG+1); 1117const shadePositions = new Float32Array(shadeVertCount*3); 1118const shadeColors = new Float32Array(shadeVertCount*3); 1119const shadeBaseZ = new Float32Array(shadeVertCount); 1120let sIdx=0; 1121for(let i=0;i<=SHADE_LEN_SEG;i++){ 1122 const z = PITCH_LEN/2 - (i/SHADE_LEN_SEG)*PITCH_LEN; 1123 for(let j=0;j<=SHADE_WID_SEG;j++){ 1124 const x = -PITCH_WID/2 + (j/SHADE_WID_SEG)*PITCH_WID; 1125 shadeBaseZ[sIdx]=z; 1126 shadePositions[sIdx*3]=x; shadePositions[sIdx*3+1]=-0.15; shadePositions[sIdx*3+2]=z; 1127 shadeColors[sIdx*3]=1; shadeColors[sIdx*3+1]=1; shadeColors[sIdx*3+2]=1; 1128 sIdx++; 1129 } 1130} 1131const shadeIndices=[]; 1132for(let i=0;i<SHADE_LEN_SEG;i++){ 1133 for(let j=0;j<SHADE_WID_SEG;j++){ 1134 const a=i*(SHADE_WID_SEG+1)+j, b=(i+1)*(SHADE_WID_SEG+1)+j, c=(i+1)*(SHADE_WID_SEG+1)+(j+1), d=i*(SHADE_WID_SEG+1)+(j+1); 1135 shadeIndices.push(a,b,d, b,c,d); 1136 } 1137} 1138shadeGeo.setIndex(shadeIndices); 1139shadeGeo.setAttribute('position', new THREE.BufferAttribute(shadePositions,3)); 1140shadeGeo.setAttribute('color', new THREE.BufferAttribute(shadeColors,3)); 1141const shadeMat = new THREE.MeshBasicMaterial({vertexColors:true, fog:false, side:THREE.DoubleSide}); 1142const possessionShade = new THREE.Mesh(shadeGeo, shadeMat); 1143possessionShade.renderOrder = 1; 1144pitchGroup.add(possessionShade); 1145 1146const pitchMarkings = new THREE.Mesh( 1147 new THREE.PlaneGeometry(PITCH_WID+4, PITCH_LEN+4), 1148 new THREE.MeshBasicMaterial({map:makeMarkingsTexture(), transparent:true, depthWrite:false, fog:false}) 1149); 1150pitchMarkings.rotation.x = -Math.PI/2; 1151pitchMarkings.position.y = 0.0; 1152pitchMarkings.renderOrder = 2; 1153pitchGroup.add(pitchMarkings); 1154 1155const halfwayLine = new THREE.Mesh( 1156 new THREE.PlaneGeometry(PITCH_WID+4, 0.12), 1157 new THREE.MeshBasicMaterial({color:0xffffff, transparent:true, opacity:0.55, side:THREE.DoubleSide, fog:false, depthWrite:false}) 1158); 1159halfwayLine.rotation.x = -Math.PI/2; 1160halfwayLine.position.set(0, 0.02, 0); 1161halfwayLine.renderOrder = 3; 1162pitchGroup.add(halfwayLine); 1163 1164/* ---- the possession line: ONE continuous curved line is the entire signal. 1165 Its position along the goal-to-goal axis is directly proportional to the 1166 current possession value â home's goal end at +1, away's goal end at -1,
1167 the halfway line only at exactly 0. Nothing else on the pitch carries data, 1168 so there's no ambiguity about what's animating. ---- */ 1169const LINE_SEG = 90; 1170const lineGeo = new THREE.BufferGeometry(); 1171const linePositions = new Float32Array((LINE_SEG+1)*3); 1172const lineColors = new Float32Array((LINE_SEG+1)*3); 1173lineGeo.setAttribute('position', new THREE.BufferAttribute(linePositions,3)); 1174lineGeo.setAttribute('color', new THREE.BufferAttribute(lineColors,3)); 1175const lineMat = new THREE.LineBasicMaterial({vertexColors:true, linewidth:3, fog:false}); 1176const possessionLine = new THREE.Line(lineGeo, lineMat); 1177possessionLine.renderOrder = 4; 1178pitchGroup.add(possessionLine); 1179 1180// a flat ribbon gives the line visible surface area/thickness (a plain THREE.Line 1181// renders as a near-invisible 1px hairline in most browsers) 1182const RIBBON_N = LINE_SEG+1; 1183const ribbonGeo = new THREE.BufferGeometry(); 1184const ribbonPositions = new Float32Array(RIBBON_N*2*3); 1185const ribbonColors = new Float32Array(RIBBON_N*2*3); 1186const ribbonIndices = []; 1187for(let i=0;i<LINE_SEG;i++){ 1188 const a=i*2, b=i*2+1, c=(i+1)*2+1, d=(i+1)*2; 1189 ribbonIndices.push(a,b,d, b,c,d); 1190} 1191ribbonGeo.setIndex(ribbonIndices); 1192ribbonGeo.setAttribute('position', new THREE.BufferAttribute(ribbonPositions,3)); 1193ribbonGeo.setAttribute('color', new THREE.BufferAttribute(ribbonColors,3)); 1194const ribbonMat = new THREE.MeshStandardMaterial({vertexColors:true, roughness:0.4, metalness:0.05, side:THREE.DoubleSide, fog:false, emissive:0x0a0a0a}); 1195const possessionRibbon = new THREE.Mesh(ribbonGeo, ribbonMat); 1196possessionRibbon.renderOrder = 5; 1197pitchGroup.add(possessionRibbon); 1198 1199/* ---- helpers for colors ---- */ 1200function hexToRgb01(hex){ 1201 const h = hex.replace('#',''); 1202 return [parseInt(h.substr(0,2),16)/255, parseInt(h.substr(2,2),16)/255, parseInt(h.substr(4,2),16)/255]; 1203} 1204let homeRgb = hexToRgb01(match.home.color); 1205let awayRgb = hexToRgb01(match.away.color); 1206 1207let displayedValue = 0; // eased possession value, so the line flows rather than jumps 1208const RIBBON_DEPTH = 1.6; // how thick (front-to-back) the painted line looks 1209const CURVE_AMP = 2.2; // gentle wave along the line's own length, purely cosmetic 1210let surgeUntil = 0, surgeSign = 0, surgeFlat = false; 1211let clockSlowUntil = 0; // briefly slows match-time advancement so a goal isn't over in a blink 1212let clockSlowLocked = false; // when true, never let the pause/surge lapse (the match-winning goal) 1213// Ceiling on how long any single custom audio clip (goal commentary or a 1214// penalty clip) can hold the match visually paused for â the clip itself 1215// still plays out in full in the background regardless, this only stops an 1216// unusually long attached file from freezing the match for an unreasonable 1217// stretch (raised after earlier glitchiness concerns with long pauses). 1218const MAX_CLIP_PAUSE_S = 25; 1219function extendPauseUntil(t){ 1220 clockSlowUntil = Math.max(clockSlowUntil, t); 1221 surgeUntil = Math.max(surgeUntil, t); 1222} 1223/* flat=true skips forcing the tide to full dominance during this goal's pause â 1224 for a goal immediately followed by a whistle (e.g. an equaliser right before 1225 full time) rather than a spell of sustained pressure, the tide should keep 1226 following the timeline's own (already-tapering) values instead of snapping 1227 to the extreme and holding there for the pause's duration. */ 1228function triggerPossessionSurge(sign, slowBuild, flat){ 1229 surgeSign = sign; 1230 surgeFlat = !!flat; 1231 surgeEaseRate = slowBuild ? 0.008 : 0.08; // ~6.5s to peak vs ~0.6s to peak 1232 extendPauseUntil(performance.now() + 3200); 1233} 1234 1235let surgeEaseRate = 0.08; 1236function computeAnticipationCap(minute, spd){ 1237 let cap = 1; // no cap by default 1238 match.events.forEach(e=>{ 1239 const key = e.minute+"_"+e.team; 1240 if(seenEvents.has(key) || e.minute<=minute) return; // already fired or already past 1241 const minutesAway = e.minute-minute; 1242 const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2); 1243 if(realSecondsAway < 7){ 1244 // held at a fixed, moderate cap for the WHOLE anticipation window â only 1245 // released via the surge once the goal actually fires. Letting this ease 1246 // toward 1.0 as the goal approached (the previous version) was self-defeating: 1247 // it released the cap right when it mattered most. 1248 cap = Math.min(cap, 0.6); 1249 } 1250 }); 1251 return cap; 1252} 1253/* Fires the final-highlight clip (a short, self-contained cheer-and-fade-out 1254 recording) a fixed number of REAL seconds â not match-minutes â before 1255 whichever goal it's attached to, so it lands the same way regardless of 1256 playback speed. Reuses the same real-seconds-away math as the anticipation 1257 cap above. Any event can carry its own highlightAudio clip (e.g. the 101' 1258 and 120' goals each have one), not just a single hardcoded goal. */ 1259const HIGHLIGHT_LEAD_SECONDS = 6.5; 1260const playedHighlights = new Set(); 1261function checkHighlightCues(minute, spd){
1262 match.events.forEach(e=>{ 1263 if(!e.highlightAudio) return; 1264 const key = e.minute+"_"+e.team; 1265 if(playedHighlights.has(key)) return; 1266 if(minute >= e.minute){ playedHighlights.add(key); return; } // already past â don't fire late 1267 const minutesAway = e.minute - minute; 1268 const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2); 1269 if(realSecondsAway <= HIGHLIGHT_LEAD_SECONDS){ 1270 playedHighlights.add(key); 1271 try{ 1272 const el = trackAudio(getCachedAudio(e.highlightAudio)); 1273 el.loop = false; // one-shot â it already has its own built-in cheer and fade-out 1274 el.volume = 0.7; 1275 el.play().catch(()=>{}); 1276 tlog('Highlight clip started for '+e.minute+"' goal ("+realSecondsAway.toFixed(1)+'s lead-in).'); 1277 }catch(err){} 1278 } 1279 }); 1280} 1281function updateCloth(currentMinute, t, recomputeNormals){ 1282 let targetValue = sampleValue(currentMinute); // -1 (away has it all) .. +1 (home has it all) 1283 const surging = clockSlowLocked || performance.now() < surgeUntil; 1284 if(surging){ 1285 targetValue = surgeFlat ? sampleValue(currentMinute) : surgeSign; 1286 }else{ 1287 const cap = computeAnticipationCap(currentMinute, speed); 1288 targetValue = Math.max(-cap, Math.min(cap, targetValue)); 1289 } 1290 displayedValue += (targetValue - displayedValue) * (surging ? surgeEaseRate : 0.2); 1291 1292 // direct, unambiguous mapping: total dominance pushes the line all the way to the 1293 // OPPONENT's goal line (a goal reaches it exactly), sitting on the halfway line at 0 1294 const centerZ = -displayedValue * (PITCH_LEN/2 - 0.4); 1295 const mag = Math.min(1, Math.abs(displayedValue)); 1296 const colorMix = (displayedValue+1)/2; // 0 = full away colour, 1 = full home colour 1297 const r = awayRgb[0]*(1-colorMix) + homeRgb[0]*colorMix; 1298 const g = awayRgb[1]*(1-colorMix) + homeRgb[1]*colorMix; 1299 const b = awayRgb[2]*(1-colorMix) + homeRgb[2]*colorMix; 1300 const lineHeight = 0.25 + mag*0.7; 1301 1302 // shade every point on the pitch fully in whichever team's colour it currently falls on 1303 const shadeCol = shadeGeo.attributes.color.array; 1304 for(let i=0;i<shadeVertCount;i++){ 1305 const isHome = shadeBaseZ[i] > centerZ; // home occupies from their own goal end up to the line 1306 const c = isHome ? homeRgb : awayRgb; 1307 shadeCol[i*3]=c[0]; shadeCol[i*3+1]=c[1]; shadeCol[i*3+2]=c[2]; 1308 } 1309 shadeGeo.attributes.color.needsUpdate = true; 1310 1311 const linePos = lineGeo.attributes.position.array; 1312 const lineCol = lineGeo.attributes.color.array; 1313 const ribPos = ribbonGeo.attributes.position.array; 1314 const ribCol = ribbonGeo.attributes.color.array; 1315 1316 for(let i=0;i<=LINE_SEG;i++){ 1317 const u = i/LINE_SEG; 1318 const x = -PITCH_WID/2 + u*PITCH_WID; 1319 const wave = CURVE_AMP*Math.sin(u*Math.PI*2 + t*0.6) * (0.4+0.6*mag); 1320 const z = centerZ + wave; 1321 1322 linePos[i*3]=x; linePos[i*3+1]=lineHeight+0.05; linePos[i*3+2]=z; 1323 lineCol[i*3]=Math.min(1,r+0.25); lineCol[i*3+1]=Math.min(1,g+0.25); lineCol[i*3+2]=Math.min(1,b+0.25); 1324 1325 const zNear = z - RIBBON_DEPTH/2, zFar = z + RIBBON_DEPTH/2; 1326 const p0 = i*2, p1 = i*2+1; 1327 ribPos[p0*3]=x; ribPos[p0*3+1]=lineHeight; ribPos[p0*3+2]=zNear; 1328 ribPos[p1*3]=x; ribPos[p1*3+1]=lineHeight; ribPos[p1*3+2]=zFar; 1329 ribCol[p0*3]=r; ribCol[p0*3+1]=g; ribCol[p0*3+2]=b; 1330 ribCol[p1*3]=r; ribCol[p1*3+1]=g; ribCol[p1*3+2]=b; 1331 } 1332 lineGeo.attributes.position.needsUpdate=true; 1333 lineGeo.attributes.color.needsUpdate=true; 1334 ribbonGeo.attributes.position.needsUpdate=true; 1335 ribbonGeo.attributes.color.needsUpdate=true; 1336 if(recomputeNormals) ribbonGeo.computeVertexNormals(); 1337} 1338 1339window.addEventListener('resize', ()=>{ 1340 camera.aspect = window.innerWidth/window.innerHeight; 1341 positionCamera(); 1342 camera.updateProjectionMatrix(); 1343 renderer.setSize(window.innerWidth, window.innerHeight); 1344}); 1345 1346/* ============================================================ 1347 AUDIO â synthesised stadium crowd. Key difference from surf/wind: 1348 surf is smooth, slow, and regular (periodic swells); a crowd is 1349 granular and irregular (many overlapping voices). So modulation 1350 here is driven by filtered NOISE, not a smooth sine LFO. 1351 ============================================================ */ 1352const GOAL_SAMPLE_B64 = "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UGpmYBchrBlCvWzYoIMIfHL8DDNYsQlv7CNlBczgK26v/qnis5gBJEIwnVa0yv/Xv2//8I2Ptz7aBMXJQpnux46q6BJgo1WYyKrnuTq//GjPen9v8N/p9P/V//3L8RAAAAABLmFC01wXBqN2jbWoERtIjMhN1lUKeUbUMkWkPgYBBTNMQ4TKa1a1kKQholVSk88iqUz/y+byvpZvK/nDPpreqVBLSi1MVqWDBRrZLi7PBoN8rcpS5P2UB5OKLhP7/remUirf8v7yw1EjJhbpfu/OH00xUl3uOH+7jcGMvRZb///////0dCgAAAAAApgOwyxIUNQw0S9GUeh2h1Czq3/+3JkDIbjRiHRaew0ICFhaecEqTYNEHE7Q2HhCHsIpsgTCOA8i8F/Tg7jAYAZ4lWyOAAC5DMgbnYEQ9HUxSj4iBowKzrItgYCWwT+lm8kXHL+lLUT3tjyziJNMcgm4SNnY60q1aBxVnEgfKGAVFmp6XINLgAAAAVAcsSrBQqx0rHRg2aaZsBtmc53y3+76vr//u+7y9wBTo0EYkzmEMAXM4yExaIOYyNCglaTBkFOTVGCFgtA5gXyJTE6NRyWWiAqY1CyOJCGRSIxWozfVrqWaV7L/R73SNGizRXF+x1jXXajS2FDimc88Dxu59fvnNWff8Xex+d/dx38oFal4GGszRfJ5yBxYEH5RNET43QcG68/VN6f3/9v/d/1fQoRIAAAAAAuQbsexMVyT4/SQAqkmBhFvAgiEiEgTv/7cGQOgvNuM01p5h2gJMTJQAklPAu4hR7sMRJAkgjiwAGkEJNVpPNQKcuITKmnL7AYGt4hyqmWzxXTImwMPI0DJloonEpgwBECYTTouokVV5Tilrp3i6NnSiw8+5DigTHTRENsWWSSklvYGgkTYlFw2yzXo6QtXY0MIiYiAMi3rgp255PWtslIPDj4SBv+NFfiT///iLv2/pMgkZqtmad6DWcvzmtFYYtkzdguq0dd2W4MOSdATVsIAlBmJASBqIsT33CUfSU4csXG0ybyq0IQCxu1rKxcB0POgrLEg6SIHolAWRCQuIpYOlTpZ50S//+10serO+SpQU0IkIVPItjGpWFTJE2zlilq41sYIh4ZOg0/EQ8Nlv9RU75GAABqEUACwhGCMkPkpEQiERCEaGxARkhtHHSTolL/+3JkDo/yRx2pyS8bsh/CBKANKXBAAAGkAAAAIAAANIAAAAQZwYoUgQsIQH0KaJ0NMcg+y2GmaCsf5ZZKysFBAwQYGCBoGLK1VVV00001VLKhkyxrHQ1DAIpEQhGg+MCMQCMuUTUXAwO//9dNNNNVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="; 1353let goalSampleBuffer = null; 1354function loadGoalSample(){ 1355 if(goalSampleBuffer || !actx) return; 1356 try{ 1357 const binary = atob(GOAL_SAMPLE_B64); 1358 const bytes = new Uint8Array(binary.length); 1359 for(let i=0;i<binary.length;i++) bytes[i] = binary.charCodeAt(i); 1360 actx.decodeAudioData(bytes.buffer.slice(0), function(buf){ goalSampleBuffer = buf; tlog('Goal sample decoded, duration '+buf.duration.toFixed(2)+'s'); }, function(err){ tlog('Goal sample decode failed: '+err); }); 1361 }catch(err){ tlog('Goal sample load error: '+err.message); } 1362} 1363const AMBIENT_LOOP_B64 = "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"; 1364let actx=null, crowdGain=null, muted=false; 1365// Every distinct clip gets exactly ONE persistent Audio element, reused for 1366// its whole lifetime rather than a fresh `new Audio()` each time it plays. 1367// This matters for iOS: the "unlock" grant from playing a decoy element in 1368// a user gesture does not reliably transfer to unrelated elements created 1369// later from async code â but replaying the SAME element that was already 1370// played once from the gesture is allowed. See primeAllMatchAudio() below. 1371const audioElementCache = new Map(); 1372function getCachedAudio(url){ 1373 if(!url) return null; 1374 let el = audioElementCache.get(url); 1375 if(!el){ el = new Audio(url); audioElementCache.set(url, el); } 1376 return el; 1377} 1378// Web Audio (actx) and plain `new Audio()` elements are two SEPARATE media 1379// pipelines on iOS Safari, each needing its own permission from a direct 1380// user gesture. actx.resume() below unlocks the first; this flag tracks 1381// whether the second has been unlocked yet, since every custom clip in 1382// this app (goals, commentary, stingers) uses new Audio() and is created 1383// later from inside the animation loop â not from a direct tap â so 1384// without this, iOS silently blocks all of them. 1385let audioElementsUnlocked = false; 1386let ambientGain = null; 1387function initAudio(){ 1388 if(actx) return; 1389 actx = new (window.AudioContext||window.webkitAudioContext)(); 1390 actx.addEventListener('statechange', ()=>tlog('AudioContext statechange event: state is now '+actx.state)); 1391 crowdGain = actx.createGain(); crowdGain.gain.value=0.5; 1392 crowdGain.connect(actx.destination); 1393 loadGoalSample(); 1394 1395 // general ambient crowd noise â a real recorded loop rather than synthesised noise. 1396 // A per-match custom recording (match.ambientAudio) takes priority when set, 1397 // falling back to the app's built-in default loop otherwise. 1398 ambientGain = actx.createGain(); ambientGain.gain.value=0.58; 1399 ambientGain.connect(crowdGain); 1400 1401 function startAmbientBuffer(buf){ 1402 const src = actx.createBufferSource(); 1403 src.buffer = buf; src.loop = true; 1404 src.connect(ambientGain); 1405 src.start(); 1406 tlog('Ambient loop decoded and started, duration '+buf.duration.toFixed(2)+'s'); 1407 } 1408 function loadDefaultAmbient(){ 1409 try{ 1410 const binary = atob(AMBIENT_LOOP_B64); 1411 const bytes = new Uint8Array(binary.length); 1412 for(let i=0;i<binary.length;i++) bytes[i] = binary.charCodeAt(i); 1413 actx.decodeAudioData(bytes.buffer.slice(0), startAmbientBuffer, function(err){ tlog('Ambient loop decode failed: '+err); }); 1414 }catch(err){ tlog('Ambient loop load error: '+err.message); } 1415 } 1416 1417 if(match.ambientAudio){ 1418 fetch(match.ambientAudio) 1419 .then(r=>r.arrayBuffer()) 1420 .then(buf=>actx.decodeAudioData(buf, startAmbientBuffer, err=>{ 1421 tlog('Custom ambient audio decode failed, falling back to default: '+err); 1422 loadDefaultAmbient(); 1423 })) 1424 .catch(err=>{ tlog('Custom ambient audio fetch failed, falling back to default: '+err.message); loadDefaultAmbient(); }); 1425 }else{ 1426 loadDefaultAmbient(); 1427 } 1428} 1429// fades ambient crowd noise in around kickoff and out around full-time, so it's silent 1430// before the match starts and after it ends, rather than audible the instant Play is pressed 1431function crowdEnvelope(m){ 1432 // window is defined in match-minutes, but match-minutes pass at speed*3.2 per real second â 1433 // so scale the window by that rate to keep the fade at a constant ~2.5 REAL seconds 1434 // regardless of playback speed, rather than a fixed (and too-fast) minute count 1435 const windowMin = 2.5 * Math.max(0.5, speed) * 3.2; 1436 const fadeIn = Math.min(1, Math.max(0, m/windowMin)); 1437 const fadeOut = Math.min(1, Math.max(0, (match.maxMinute-m)/windowMin)); 1438 return Math.max(0, Math.min(fadeIn, fadeOut)); 1439} 1440function setCrowdLevel(intensity){ 1441 if(!actx||muted||!ambientGain) return; 1442 const mag = Math.min(1, Math.abs(intensity)); 1443 const envelope = crowdEnvelope(currentMinute); 1444 ambientGain.gain.setTargetAtTime((0.58 + mag*0.22)*envelope, actx.currentTime, 0.6); 1445} 1446let activeRoarGain = null; 1447function playGoalCelebrationTail(){ 1448 try{ 1449 const cel = trackAudio(getCachedAudio(match.goalCelebrationAudio)); 1450 cel._ivs = []; 1451 cel.volume = 1.0; 1452 cel.addEventListener('loadedmetadata', ()=>{ 1453 const dur = isFinite(cel.duration) && cel.duration>0 ? cel.duration : 8; 1454 // keep the match slowed/paused through the celebration too, not just the commentary 1455 const celEnd = performance.now() + (dur+0.5)*1000; 1456 extendPauseUntil(celEnd); 1457 // fade the celebration's own volume out over its last ~3s (or half its length if shorter) 1458 const fadeSeconds = Math.min(3.5, dur*0.5); 1459 const fadeStartMs = Math.max(0, (dur-fadeSeconds))*1000; 1460 setTimeout(()=>{ 1461 const steps = 24; 1462 let i=0; 1463 const iv = setInterval(()=>{ 1464 i++; 1465 cel.volume = Math.max(0, 1-(i/steps)); 1466 if(i>=steps) clearInterval(iv); 1467 }, (fadeSeconds*1000)/steps); 1468 cel._ivs.push(iv); 1469 }
1469, fadeStartMs); 1470 }); 1471 cel.addEventListener('ended', ()=>{ 1472 if(ambientGain && actx) ambientGain.gain.setTargetAtTime( 1473 (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute), 1474 actx.currentTime, 1.8 1475 ); 1476 }); 1477 cel.play().catch(()=>{ if(ambientGain && actx) setCrowdLevel(sampleValue(currentMinute)); }); 1478 }catch(err){ if(ambientGain && actx) setCrowdLevel(sampleValue(currentMinute)); } 1479} 1480let ambientVarietyPlayer = null; 1481let ambientVarietyCooldownUntil = 0; 1482let dominantSince = null; 1483let lastDominantSign = 0; 1484let homeDominanceAccum = 0, awayDominanceAccum = 0; 1485function maybeTriggerAmbientVariety(dt){ 1486 if(!actx) return; 1487 if(!playing || muted || ambientVarietyPlayer){ 1488 // still decay gently even when not actively accumulating, so it doesn't feel stuck 1489 homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*0.4); 1490 awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*0.4); 1491 return; 1492 } 1493 const v = displayedValue; // the same eased value driving the 3D line â smoother than raw sampleValue 1494 if(v>0.28){ homeDominanceAccum = Math.min(9, homeDominanceAccum+dt); awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*1.5); } 1495 else if(v<-0.28){ awayDominanceAccum = Math.min(9, awayDominanceAccum+dt); homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*1.5); } 1496 else { homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*0.4); awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*0.4); } 1497 1498 const now = performance.now(); 1499 if(now<ambientVarietyCooldownUntil) return; 1500 let pool = null; 1501 if(homeDominanceAccum>=6 && match.homeVarietyAudio && match.homeVarietyAudio.length){ pool = match.homeVarietyAudio; homeDominanceAccum = 0; } 1502 else if(awayDominanceAccum>=6 && match.awayVarietyAudio && match.awayVarietyAudio.length){ pool = match.awayVarietyAudio; awayDominanceAccum = 0; } 1503 if(!pool) return; 1504 const clip = pool[Math.floor(Math.random()*pool.length)]; 1505 ambientVarietyCooldownUntil = now + 14000 + Math.random()*6000; 1506 try{ 1507 const el = trackAudio(getCachedAudio(clip)); 1508 ambientVarietyPlayer = el; 1509 if(ambientGain) ambientGain.gain.setTargetAtTime(0.22, actx.currentTime, 1.2); 1510 el.addEventListener('ended', ()=>{ 1511 ambientVarietyPlayer = null; 1512 if(ambientGain) ambientGain.gain.setTargetAtTime( 1513 (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute), 1514 actx.currentTime, 1.5 1515 ); 1516 }, {once:true}); 1517 el.addEventListener('error', ()=>{ ambientVarietyPlayer=null; }, {once:true}); 1518 el.play().catch(()=>{ ambientVarietyPlayer=null; }); 1519 }catch(err){ ambientVarietyPlayer=null; } 1520} 1521function playRoar(volumeScale){ 1522 if(!actx||muted) return; 1523 const vol = volumeScale===undefined ? 1 : volumeScale; 1524 // if the previous goal's roar is still ringing out (quick succession of goals), 1525 // duck it fast rather than letting the two overlap into a mush 1526 if(activeRoarGain){ 1527 try{ 1528 activeRoarGain.gain.cancelScheduledValues(actx.currentTime); 1529 activeRoarGain.gain.setValueAtTime(activeRoarGain.gain.value, actx.currentTime); 1530 activeRoarGain.gain.linearRampToValueAtTime(0.0001, actx.currentTime+0.25); 1531 }catch(err){} 1532 } 1533 if(goalSampleBuffer){ 1534 const src = actx.createBufferSource(); 1535 src.buffer = goalSampleBuffer; 1536 const g = actx.createGain(); 1537 const dur = goalSampleBuffer.duration; 1538 g.gain.setValueAtTime(0.0001, actx.currentTime); 1539 g.gain.exponentialRampToValueAtTime(0.85*vol, actx.currentTime+0.35); // fade up 1540 g.gain.setValueAtTime(0.85*vol, actx.currentTime+Math.max(0.35, dur-1.2)); 1541 g.gain.exponentialRampToValueAtTime(0.0001, actx.currentTime+dur-0.05); // fade down 1542 src.connect(g); g.connect(crowdGain); 1543 src.start(); 1544 activeRoarGain = g; 1545 return; 1546 } 1547 // fallback if the sample hasn't decoded yet (e.g. audio context just started) 1548 const bufferSize = actx.sampleRate*2.2; 1549 const buffer = actx.createBuffer(1, bufferSize, actx.sampleRate); 1550 const data = buffer.getChannelData(0); 1551 let lastOut=0; 1552 for(let i=0;i<bufferSize;i++){ const w=Math.random()*2-1; lastOut=(lastOut+0.02*w)/1.02; data[i]=lastOut*5; } 1553 const src = actx.createBufferSource(); src.buffer=buffer; 1554 const filter = actx.createBiquadFilter(); filter.type='bandpass'; filter.Q.value=0.5; 1555 filter.frequency.setValueAtTime(600, actx.currentTime); 1556 filter.frequency.linearRampToValueAtTime(1900, actx.currentTime+1.
15560); 1557 const g = actx.createGain(); g.gain.setValueAtTime(0.05*vol, actx.currentTime); 1558 g.gain.linearRampToValueAtTime(0.55*vol, actx.currentTime+0.12); 1559 g.gain.linearRampToValueAtTime(0.0, actx.currentTime+2.1); 1560 src.connect(filter); filter.connect(g); g.connect(crowdGain); 1561 src.start(); src.stop(actx.currentTime+2.2); 1562} 1563 1564/* ============================================================ 1565 PLAYBACK STATE 1566 ============================================================ */ 1567let currentMinute = 0; 1568let playing = false; 1569let speed = 1; 1570let lastTs = null; 1571let clockT = 0; 1572const seenEvents = new Set(); 1573const seenPenalties = new Set(); 1574let playedShootoutIntro = false; 1575 1576function computeScores(uptoMinute){ 1577 let h=0,a=0; 1578 match.events.forEach(e=>{ if(e.minute<=uptoMinute){ if(e.team==='home') h++; else a++; } }); 1579 return {h,a}; 1580} 1581 1582function halfLabel(m){ 1583 if(match.penalties && match.penalties.length && m > match.maxMinute + 0.001) return "PENALTIES"; 1584 if(m<=45.9) return "1ST HALF"; 1585 if(!match.hasExtraTime) return "2ND HALF"; 1586 if(m<=90.9) return "2ND HALF"; 1587 if(m<=105.9) return "ET 1ST HALF"; 1588 return "ET 2ND HALF"; 1589} 1590 1591function refreshUI(){ 1592 const s = computeScores(currentMinute); 1593 document.getElementById('scoreHome').textContent = s.h; 1594 document.getElementById('scoreAway').textContent = s.a; 1595 document.getElementById('minuteNum').textContent = Math.floor(currentMinute)+"'"; 1596 document.getElementById('halfLbl').textContent = halfLabel(currentMinute); 1597 document.getElementById('timeReadout').textContent = Math.floor(currentMinute)+"' / "+getEffectiveMaxMinute(match)+"'"; 1598 1599 const v = Math.max(-1, Math.min(1, sampleValue(currentMinute))); 1600 const homePct = Math.round(((v+1)/2)*100); 1601 const awayPct = 100 - homePct; 1602 document.getElementById('shareHomeFill').style.width = homePct+'%'; 1603 document.getElementById('shareAwayFill').style.width = awayPct+'%'; 1604 document.getElementById('shareHomePct').textContent = homePct+'%'; 1605 document.getElementById('shareAwayPct').textContent = awayPct+'%'; 1606 1607 const domEl = document.getElementById('dominantLabel'); 1608 const dv = displayedValue; 1609 if(Math.abs(dv) < 0.06){ 1610 domEl.textContent = 'Balanced'; 1611 domEl.style.color = 'var(--ink-dim)'; 1612 }else if(dv > 0){ 1613 domEl.textContent = (match.home.name||'Home')+' â¶'; 1614 domEl.style.color = match.home.color; 1615 }else{ 1616 domEl.textContent = 'â '+(match.away.name||'Away'); 1617 domEl.style.color = match.away.color; 1618 } 1619 1620 drawPossessionChart(); 1621} 1622 1623const chartCanvas = document.getElementById('possessionChart'); 1624const chartCtx = chartCanvas.getContext('2d'); 1625let chartCachedWidth = 0, chartCachedHeight = 0; 1626function drawPossessionChart(){ 1627 const rect = chartCanvas.getBoundingClientRect(); 1628 const dpr = Math.min(window.devicePixelRatio||1, 2); 1629 const w = Math.max(1,Math.round(rect.width*dpr)), h = Math.max(1,Math.round(rect.height*dpr)); 1630 if(w!==chartCachedWidth || h!==chartCachedHeight){ 1631 chartCanvas.width = w; chartCanvas.height = h; 1632 chartCachedWidth = w; chartCachedHeight = h; 1633 } 1634 chartCtx.clearRect(0,0,w,h); 1635 const midY = h/2; 1636 const maxM = getEffectiveMaxMinute(match); 1637 // padding so goals right at the very start/end (e.g. a stoppage-time winner) aren't 1638 // squashed against the edge and easy to miss 1639 const padX = Math.max(28, w*0.06); 1640 const plotW = w - padX*2; 1641 chartXOfCache = {padX, plotW, maxM}; 1642 const xOf = m => padX + (m/maxM)*plotW; 1643 1644 // sample the timeline at a fine, even resolution for a smooth curve 1645 const N = Math.max(40, Math.round(plotW/3)); 1646 const pts = []; 1647 for(let i=0;i<=N;i++){ 1648 const m = (i/N)*maxM; 1649 pts.push([ xOf(m), sampleValue(m) ]); 1650 } 1651 1652 // filled area: above midline in home colour, below in away colour 1653 function fillSide(homeSide){ 1654 chartCtx.beginPath();
1655 chartCtx.moveTo(padX, midY); 1656 for(const [x,v] of pts){ 1657 const y = midY - v*(h*0.46); 1658 const clipped = homeSide ? Math.min(y, midY) : Math.max(y, midY); 1659 chartCtx.lineTo(x, clipped); 1660 } 1661 chartCtx.lineTo(padX+plotW, midY); 1662 chartCtx.closePath(); 1663 chartCtx.fillStyle = homeSide ? match.home.color : match.away.color; 1664 chartCtx.globalAlpha = 0.55; 1665 chartCtx.fill(); 1666 chartCtx.globalAlpha = 1; 1667 } 1668 fillSide(true); 1669 fillSide(false); 1670 1671 // the curve itself 1672 chartCtx.beginPath(); 1673 pts.forEach(([x,v],i)=>{ 1674 const y = midY - v*(h*0.46); 1675 if(i===0) chartCtx.moveTo(x,y); else chartCtx.lineTo(x,y); 1676 }); 1677 chartCtx.strokeStyle = 'rgba(255,255,255,0.55)'; 1678 chartCtx.lineWidth = Math.max(1, 1.2*dpr); 1679 chartCtx.stroke(); 1680 1681 // midline 1682 chartCtx.strokeStyle = 'rgba(255,255,255,0.25)'; 1683 chartCtx.lineWidth = 1*dpr; 1684 chartCtx.beginPath(); chartCtx.moveTo(padX,midY); chartCtx.lineTo(padX+plotW,midY); chartCtx.stroke(); 1685 1686 // goal markers â anchored exactly to the event's real minute, independent of 1687 // where the (smoothed) curve happens to peak, so goals are never ambiguous 1688 match.events.forEach(e=>{ 1689 const ex = xOf(e.minute); 1690 const ey = midY - sampleValue(e.minute)*(h*0.46); 1691 const col = e.team==='home' ? match.home.color : match.away.color; 1692 chartCtx.beginPath(); 1693 chartCtx.arc(ex, ey, Math.max(2.5,3*dpr), 0, Math.PI*2); 1694 chartCtx.fillStyle = col; 1695 chartCtx.strokeStyle = '#0a0d13'; 1696 chartCtx.lineWidth = 1*dpr; 1697 chartCtx.fill(); chartCtx.stroke(); 1698 }); 1699 1700 // penalty kick markers â same idea as goal markers above, but diamond-shaped 1701 // and hollow for a miss, matching the ticker dot convention next to the 1702 // scorebug. Only drawn for kicks the playhead has actually reached â same 1703 // spoiler principle as everything else penalty-related. 1704 if(match.penalties && match.penalties.length){ 1705 const penStartMinute = match.maxMinute; 1706 match.penalties.forEach((kick, i)=>{ 1707 const kickMinute = penStartMinute + i + 1; 1708 if(kickMinute > currentMinute) return; 1709 const ex = xOf(kickMinute); 1710 const ey = midY - sampleValue(kickMinute)*(h*0.46); 1711 const col = kick.team==='home' ? match.home.color : match.away.color; 1712 const r = Math.max(3,3.6*dpr); 1713 chartCtx.save(); 1714 chartCtx.translate(ex, ey); 1715 chartCtx.rotate(Math.PI/4); 1716 chartCtx.beginPath(); 1717 chartCtx.rect(-r, -r, r*2, r*2); 1718 if(kick.outcome==='miss'){ 1719 chartCtx.strokeStyle = col; 1720 chartCtx.lineWidth = Math.max(1.5, 1.8*dpr); 1721 chartCtx.stroke(); 1722 }else{ 1723 chartCtx.fillStyle = col; 1724 chartCtx.strokeStyle = '#0a0d13'; 1725 chartCtx.lineWidth = 1*dpr; 1726 chartCtx.fill(); chartCtx.stroke(); 1727 } 1728 chartCtx.restore(); 1729 }); 1730 } 1731 1732 // auto pop-up label for whichever goal the playhead has just reached â mirrors the 1733 // "goal card" look from the reference clip, anchored right on the chart 1734 const RECENT_WINDOW = 2.2; 1735 let recent = null; 1736 match.events.forEach(e=>{ 1737 const dt = currentMinute - e.minute; 1738 if(dt>=0 && dt<=RECENT_WINDOW) recent = e; 1739 }); 1740 if(recent){ 1741 const ex = xOf(recent.minute); 1742 const ey = midY - sampleValue(recent.minute)*(h*0.46); 1743 const label = (recent.team==='home'?match.home.name:match.away.name)+' · '+(recent.label||Math.floor(recent.minute)+"'"); 1744 chartCtx.font = (11*dpr)+'px JetBrains Mono, monospace'; 1745 const textW = chartCtx.measureText(label).width; 1746 const boxW = textW + 14*dpr, boxH = 20*dpr; 1747 // flip the callout to whichever side keeps it fully on-canvas near the edges 1748 let bx = ex - boxW/2; 1749 bx = Math.max(padX*0.2, Math.min(w-boxW-padX*0.2, bx)); 1750 const by = ey<h/2 ? Math.min(ey+10*dpr, h-boxH-2) : Math.max(ey-boxH-10*dpr, 2); 1751 chartCtx.fillStyle = 'rgba(11,14,21,0.92)'; 1752 chartCtx.strokeStyle = '#ffb400'; 1753 chartCtx.lineWidth = 1*dpr; 1754 chartCtx.beginPath(); 1755 chartCtx.roundRect(bx, by, boxW, boxH, 5*dpr); 1756 chartCtx.fill(); chartCtx.stroke(); 1757 chartCtx.fillStyle = '#ffb400'; 1758 chartCtx.textBaseline = 'middle'; 1759 chartCtx.fillText(label, bx+7*dpr, by+boxH/2); 1760 } 1761 1762 // playhead 1763 const playX = xOf(Math.min(currentMinute,maxM)); 1764 chartCtx.strokeStyle = 'rgba(18,224,168,0.9)'; 1765 chartCtx.lineWidth = Math.max(1.5, 2*dpr); 1766 chartCtx.beginPath(); chartCtx.moveTo(playX,0);
1766 chartCtx.lineTo(playX,h-8*dpr); chartCtx.stroke(); 1767 // draggable handle dot at the base â this + the click/drag handlers below let the 1768 // chart itself act as the scrubber, so a separate slider isn't needed 1769 chartCtx.beginPath(); 1770 chartCtx.arc(playX, h-8*dpr, 7*dpr, 0, Math.PI*2); 1771 chartCtx.fillStyle = '#12e0a8'; 1772 chartCtx.fill(); 1773 chartCtx.strokeStyle = '#0a0d13'; chartCtx.lineWidth = 1.5*dpr; chartCtx.stroke(); 1774} 1775let chartXOfCache = {padX:0, plotW:1, maxM:1}; 1776function chartMinuteFromEvent(evt){ 1777 const rect = chartCanvas.getBoundingClientRect(); 1778 const clientX = (evt.touches && evt.touches[0] ? evt.touches[0].clientX : evt.clientX); 1779 const xCss = clientX - rect.left; 1780 const padXCss = chartXOfCache.padX / (chartCachedWidth/rect.width || 1); 1781 const plotWCss = chartXOfCache.plotW / (chartCachedWidth/rect.width || 1); 1782 const frac = (xCss - padXCss) / plotWCss; 1783 return Math.max(0, Math.min(chartXOfCache.maxM, frac*chartXOfCache.maxM)); 1784} 1785let chartDragging = false; 1786function resyncSeenPenalties(){ 1787 seenPenalties.clear(); 1788 if(!match.penalties || !match.penalties.length) return; 1789 const startMinute = match.maxMinute; 1790 match.penalties.forEach((kick,i)=>{ 1791 if(startMinute+i+1 <= currentMinute) seenPenalties.add('pen_'+i); 1792 }); 1793 playedShootoutIntro = currentMinute >= startMinute; 1794 // Same "no rollback" treatment as a match-winning goal â only sets the lock 1795 // on, never off, since resyncSeenEvents (which calls this) has already 1796 // reset it to false based on the goal condition just before this runs. 1797 const decidingKickMinute = startMinute + match.penalties.length; 1798 if(currentMinute >= decidingKickMinute - 0.6){ 1799 clockSlowLocked = true; 1800 triggerPossessionSurge(0, false, true); // same fix as checkPenalties â without this, scrubbing past the decider locks the wave at halfway too 1801 } 1802} 1803function resyncSeenEvents(){ 1804 seenEvents.clear(); 1805 match.events.forEach(e=>{ 1806 if(e.minute <= currentMinute) seenEvents.add(e.minute+"_"+e.team); 1807 }); 1808 playedKickoffStinger = currentMinute > 0.05; 1809 playedExtraTimeStinger = currentMinute >= 90; 1810 // the match-winning goal's permanent "no rollback" lock must release if we've 1811 // scrubbed back to before it â otherwise the match stays frozen forever, even 1812 // after scrubbing away and pressing Play again 1813 clockSlowLocked = (match.goalCelebrationMinute!==undefined && currentMinute >= match.goalCelebrationMinute - 0.6); 1814 playedHighlights.clear(); 1815 match.events.forEach(e=>{ 1816 if(e.highlightAudio && e.minute <= currentMinute) playedHighlights.add(e.minute+"_"+e.team); 1817 }); 1818 resyncSeenPenalties(); 1819 rebuildTicker(); 1820} 1821function chartSeekTo(evt, isDragStart){ 1822 if(isDragStart) pause(); 1823 currentMinute = chartMinuteFromEvent(evt); 1824 if(isDragStart) resyncSeenEvents(); 1825 syncAll(); 1826} 1827chartCanvas.addEventListener('pointerdown', (e)=>{ chartDragging = true; chartCanvas.setPointerCapture(e.pointerId); chartSeekTo(e, true); }); 1828chartCanvas.addEventListener('pointermove', (e)=>{ if(chartDragging) chartSeekTo(e, false); }); 1829chartCanvas.addEventListener('pointerup', ()=>{ chartDragging = false; resyncSeenEvents(); }); 1830chartCanvas.addEventListener('pointercancel', ()=>{ chartDragging = false; }); 1831chartCanvas.style.cursor = 'pointer'; 1832chartCanvas.style.touchAction = 'none'; 1833 1834function computePreGoalEase(minute, spd){ 1835 let ease = 1; 1836 match.events.forEach(e=>{ 1837 const key = e.minute+"_"+e.team; 1838 if(seenEvents.has(key) || e.minute<=minute) return; // already fired or already past 1839 const minutesAway = e.minute-minute; 1840 const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2); 1841 if(realSecondsAway < 4){ 1842 // eased down to ~30% speed over the last 4 real seconds â the previous 7s/8% 1843 // version made the app linger too long on quieter, lower-magnitude parts of 1844 // the timeline before the real build-up, reading as an unnaturally hushed lull 1845 ease = Math.min(ease, Math.max(0.3, realSecondsAway/4)); 1846 } 1847 }); 1848 return ease; 1849} 1850function checkEvents(prevMinute){ 1851 match.events.forEach(e=>{ 1852 const key = e.minute+"_"+e.team; 1853 if(e.minute>prevMinute && e.minute<=currentMinute && !seenEvents.has(key)){ 1854 seenEvents.add(key); 1855 rebuildTicker(); // reveal this goal's dot now that it's actually happened, not before 1856 flashGoal(e); 1857 triggerPossessionSurge(e.team==='home' ? 1 : -1, e.skipCrescendo, e.flatTide); 1858 if(match.goalCelebrationMinute!==undefined && Math.abs(e.minute-match.goalCelebrationMinute)<0.6){
1859 clockSlowLocked = true; // the match-defining goal â no rollback at all from here on 1860 } 1861 playGoalWithCrescendo(e); 1862 } 1863 }); 1864 if(match.hasExtraTime && prevMinute<90 && currentMinute>=90 && !playedExtraTimeStinger){ 1865 playedExtraTimeStinger = true; 1866 playHalfTimeToExtraTimeSequence(); 1867 } 1868} 1869// Penalty shootout: each kick sits at match.maxMinute + kick-index-plus-one on 1870// the (extended) clock â see computePenaltyTimelinePoints for why. Kept 1871// entirely separate from checkEvents/seenEvents since a shootout kick isn't a 1872// goal â it doesn't touch the actual score, ticker, or goal tally. 1873// Persistent penalty-count labels above the tick columns â unlike the 1874// ephemeral flash popup, these stay up permanently once the shootout starts, 1875// including after it's over. Spoiler-safe: only counts kicks the playhead 1876// has actually reached. 1877// Picks readable text colour (black or white) against an arbitrary 1878// background colour, using the standard perceived-brightness formula â this 1879// matters directly for team colours that are very dark or black, where 1880// white text is needed instead of the usual dark text used elsewhere in the 1881// app's own UI. 1882function getContrastTextColor(hex){ 1883 if(!hex) return '#fff'; 1884 const h = hex.replace('#',''); 1885 const full = h.length===3 ? h.split('').map(c=>c+c).join('') : h; 1886 const r = parseInt(full.substr(0,2),16), g = parseInt(full.substr(2,2),16), b = parseInt(full.substr(4,2),16); 1887 if(isNaN(r)||isNaN(g)||isNaN(b)) return '#fff'; 1888 const brightness = (r*299 + g*587 + b*114) / 1000; 1889 return brightness > 140 ? '#0a0d13' : '#fff'; 1890} 1891function updatePenaltyCountLabels(){ 1892 const homeEl = document.getElementById('penCountHome'); 1893 const awayEl = document.getElementById('penCountAway'); 1894 if(!homeEl || !awayEl) return; 1895 const wasShowing = homeEl.style.display === 'flex'; 1896 if(!match.penalties || !match.penalties.length){ 1897 homeEl.style.display = 'none'; 1898 awayEl.style.display = 'none'; 1899 if(wasShowing) syncScorebugHeight(); // pull the dots back in now the badges are gone 1900 return; 1901 } 1902 const startMinute = match.maxMinute; 1903 let homeMakes=0, awayMakes=0, anyRevealed=false; 1904 match.penalties.forEach((kick,i)=>{ 1905 if(startMinute+i+1 <= currentMinute){ 1906 anyRevealed = true; 1907 if(kick.outcome==='score'){ if(kick.team==='home') homeMakes++; else awayMakes++; } 1908 } 1909 }); 1910 if(!anyRevealed){ 1911 homeEl.style.display = 'none'; 1912 awayEl.style.display = 'none'; 1913 if(wasShowing) syncScorebugHeight(); 1914 return; 1915 } 1916 homeEl.style.background = match.home.color || '#2451e0'; 1917 homeEl.style.color = getContrastTextColor(match.home.color); 1918 awayEl.style.background = match.away.color || '#ffffff'; 1919 awayEl.style.color = getContrastTextColor(match.away.color); 1920 homeEl.textContent = homeMakes; 1921 awayEl.textContent = awayMakes; 1922 const firstReveal = !wasShowing; 1923 homeEl.style.display = 'flex'; 1924 awayEl.style.display = 'flex'; 1925 if(firstReveal) syncScorebugHeight(); // push the dots further out now the badges have appeared 1926} 1927// One-off intro when play crosses from normal/extra time into the shootout â 1928// explains why a shootout is happening at all (level after extra time) 1929// rather than just cutting straight into the first kick with no context. 1930function checkShootoutIntro(prevMinute){ 1931 if(!match.penalties || !match.penalties.length || playedShootoutIntro) return; 1932 if(prevMinute < match.maxMinute && currentMinute >= match.maxMinute){ 1933 playedShootoutIntro = true; 1934 flashShootoutIntro(); 1935 extendPauseUntil(performance.now() + 3500); 1936 } 1937} 1938function flashShootoutIntro(){ 1939 const el = document.getElementById('goalFlash'); 1940 document.getElementById('flashLbl').textContent = 'PENALTY SHOOTOUT'; 1941 document.getElementById('flashSub').textContent = 'Level after extra time â going to penalties'; 1942 document.getElementById('flashPhoto').style.display = 'none'; 1943 el.style.left = '50%'; 1944 el.style.top = '50%'; 1945 el.style.transform = 'translate(-50%, -50%)'; 1946 el.classList.add('show'); 1947 clearTimeout(el._t); 1948 clearInterval(el._checkIv); 1949 el._checkIv = setInterval(()=>{ 1950 if(performance.now() >= clockSlowUntil){ 1951 clearInterval(el._checkIv); 1952 el.classList.remove('show'); 1953 el.style.top = ''; el.style.transform = ''; 1954 } 1955 }, 300); 1956} 1957function checkPenalties(prevMinute){ 1958 if(!match.penalties || !match.penalties.length) return; 1959 const startMinute = match.maxMinute;
1960 match.penalties.forEach((kick, i)=>{ 1961 const kickMinute = startMinute + i + 1; 1962 const key = 'pen_'+i; 1963 if(kickMinute>prevMinute && kickMinute<=currentMinute && !seenPenalties.has(key)){ 1964 seenPenalties.add(key); 1965 rebuildTicker(); // reveal this kick's own dot too, same as a goal 1966 updatePenaltyCountLabels(); 1967 flashPenalty(kick, i+1); 1968 playPenaltySound(kick); 1969 const isLastKick = i === match.penalties.length-1; 1970 // The decider gets a couple of seconds longer to let the celebration 1971 // breathe, rather than the same brisk pause as every other kick. 1972 extendPauseUntil(performance.now() + (isLastKick ? 6000 : 4000)); 1973 // extendPauseUntil (just above, and again inside playPenaltySound for a 1974 // real clip) also extends surgeUntil, which makes updateCloth treat 1975 // this whole pause window as "surging" â without configuring an actual 1976 // surge, that falls back to the stale default surgeSign/flat, locking 1977 // the wave at whatever they last were (usually 0) for the entire 1978 // pause. flat:true here means every kick's pause window correctly 1979 // shows this kick's real computed value throughout, not just for a 1980 // brief instant right at the end once the pause window happens to 1981 // expire before the next kick's begins. 1982 triggerPossessionSurge(0, false, true); 1983 if(isLastKick){ 1984 clockSlowLocked = true; // the deciding kick â the match-defining moment here, same treatment as a match-winning goal 1985 } 1986 } 1987 }); 1988} 1989function flashPenalty(kick, kickNumber){ 1990 const teamName = kick.team==='home' ? match.home.name : match.away.name; 1991 const el = document.getElementById('goalFlash'); 1992 document.getElementById('flashLbl').textContent = kick.outcome==='score' ? 'PENALTY SCORED' : 'PENALTY MISSED'; 1993 // Running shootout score folded into the popup itself, rather than a 1994 // separate persistent indicator â that indicator was overlapping the main 1995 // scoreline, and since it's the only thing conveying shootout state, it's 1996 // simpler and safer to fold it into this pop-up, which already exists. 1997 const startMinute = match.maxMinute; 1998 let homeMakes=0, awayMakes=0; 1999 (match.penalties||[]).forEach((k,i)=>{ 2000 if(startMinute+i+1 <= currentMinute && k.outcome==='score'){ 2001 if(k.team==='home') homeMakes++; else awayMakes++; 2002 } 2003 }); 2004 document.getElementById('flashSub').textContent = teamName+' · '+kick.taker+' · kick '+kickNumber+' · PENS '+homeMakes+'-'+awayMakes; 2005 const photoEl = document.getElementById('flashPhoto'); 2006 if(kick.photo){ 2007 photoEl.classList.remove('landscape'); 2008 photoEl.src = kick.photo; 2009 photoEl.style.display = 'block'; 2010 photoEl.style.cursor = 'pointer'; 2011 photoEl.onclick = ()=>openPhotoLightbox(kick.photo, teamName+' · '+kick.taker); 2012 photoEl.onerror = ()=>{ photoEl.style.display='none'; tlog('Penalty photo failed to load for '+kick.taker+': '+kick.photo); }; 2013 photoEl.onload = ()=>{ 2014 tlog('Penalty photo loaded OK for '+kick.taker+'.'); 2015 if(photoEl.naturalWidth && photoEl.naturalHeight && (photoEl.naturalWidth/photoEl.naturalHeight) > 1.3){ 2016 photoEl.classList.add('landscape'); 2017 } 2018 }; 2019 }else{ 2020 tlog('No photo field set for penalty taker '+kick.taker+' â Wikipedia fetch likely found nothing for this name.'); 2021 photoEl.style.display = 'none'; 2022 } 2023 // Centred on the pitch rather than the top-anchored goal spot: by this 2024 // point normal play is over, so the shootout is the only thing happening, 2025 // and the pitch is the natural focal point rather than the (now largely 2026 // irrelevant) scorebug area goals anchor to. 2027 el.style.left = '50%'; 2028 el.style.top = '50%'; 2029 el.style.transform = 'translate(-50%, -50%)'; 2030 el.classList.add('show'); 2031 clearTimeout(el._t); 2032 clearInterval(el._checkIv); 2033 el._checkIv = setInterval(()=>{ 2034 if(performance.now() >= clockSlowUntil){ 2035 clearInterval(el._checkIv); 2036 el.classList.remove('show'); 2037 el.style.top = ''; el.style.transform = ''; // restore goal-flash defaults for next time 2038 } 2039 }, 300); 2040} 2041// Falls back sensibly if a specific clip isn't attached: a scored penalty 2042// reuses the generic crowd roar (a decent default â a goal is a goal for 2043// crowd-noise purposes); a miss has no equivalent generic sound in the app, 2044// so it just pauses briefly in silence rather than playing something wrong. 2045function playPenaltySound(kick){ 2046 const clipUrl = kick.audio || (kick.outcome==='score' ? match.penaltyScoredAudio : match.penaltyMissedAudio); 2047 if(!clipUrl){ 2048 // Built-in default either way â a scored kick gets the same full-volume 2049 // roar as any other goal; a miss still gets a cheer (the other side's 2050 // relief/celebration that their opponent didn't score), just quieter, 2051 // rather than nothing at all. 2052 playRoar(kick.outcome==='score' ? 1 : 0.45); 2053 return; 2054 } 2055 if(muted) return; 2056 try{ 2057 const clip = trackAudio(getCachedAudio(clipUrl)); 2058 clip.addEventListener('loadedmetadata', ()=>{ 2059 const dur = isFinite(clip.duration) && clip.duration>0 ? clip.duration : 3; 2060 // Capped well short of the clip's own length if it's unusually long â 2061 // the clip still plays out in full in the background, but the match 2062 // itself won't stay visually frozen for an unreasonable stretch (this 2063 // is the same cap used for goal commentary clips, for consistency). 2064 extendPauseUntil(performance.now() + Math.min(dur+0.8, MAX_CLIP_PAUSE_S)*1000); 2065 }); 2066 clip.addEventListener('error', ()=>{ tlog('Penalty clip failed to play â continuing silently.'); }); 2067 clip.play().catch(()=>{}); 2068 }catch(err){} 2069} 2070// Spoiler-safe running shootout scoreline (e.g. "PENS 3-2") â only counts 2071// kicks already reached by the clock, same principle as the goal ticker dots. 2072function playHalfTimeToExtraTimeSequence(){ 2073 if(muted) return; 2074 extendPauseUntil(performance.now() + 2000); // conservative initial hold, extended below once real durations are known 2075 function playClip2(){ 2076 if(!match.extraTimeAudio) return; 2077 try{ 2078 const el2 = trackAudio(getCachedAudio(match.extraTimeAudio)); 2079 el2.addEventListener('loadedmetadata', ()=>{ 2080 const dur2 = isFinite(el2.duration) && el2.duration>0 ? el2.duration : 6; 2081 extendPauseUntil(performance.now() + (dur2+0.6)*1000); 2082 }); 2083 el2.play().catch(()=>{}); 2084 }catch(err){} 2085 } 2086 if(!match.endOfNormalTimeAudio){ playClip2(); return; } 2087 try{ 2088 const el1 = trackAudio(getCachedAudio(match.endOfNormalTimeAudio)); 2089 el1.addEventListener('loadedmetadata', ()=>{ 2090 const dur1 = isFinite(el1.duration) && el1.duration>0 ? el1.duration : 8; 2091 extendPauseUntil(performance.now() + (dur1+1.5)*1000); // covers clip1 plus the gap before clip2 2092 }); 2093 el1.addEventListener('ended', ()=>{ setTimeout(playClip2, 1200); }); // a breather between the two stingers 2094 el1.play().catch(()=>{ playClip2(); }); 2095 }catch(err){ playClip2(); } 2096} 2097function playGoalWithCrescendo(e){ 2098 if(muted || e.skipCrescendo){ playGoalSound(e); return; }
2098 // some clips already have natural crowd roar baked in 2099 // the same celebration clip works as the crescendo lead-in for goals by either team 2100 const swellClip = match.goalCelebrationAudio || null; 2101 if(!swellClip){ playGoalSound(e); return; } // nothing to swell with â just do the plain commentary/roar 2102 try{ 2103 const swell = trackAudio(getCachedAudio(swellClip)); 2104 swell._ivs = []; 2105 swell.volume = 0.15; 2106 // keep the match paused/slowed at least through the lead-in; playGoalSound's own 2107 // metadata handler extends this further once the commentary's real duration is known 2108 const leadInEnd = performance.now() + 2300; 2109 extendPauseUntil(leadInEnd); 2110 if(ambientGain && actx) ambientGain.gain.setTargetAtTime(0.42, actx.currentTime, 0.35); 2111 swell.play().catch(()=>{}); 2112 // the crescendo: ramp the swell's own volume up fast, like a sudden roar â 2113 // completes well before the fade-out starts below, so it actually reaches peak 2114 const rampSteps = 9, rampMs = 450; 2115 let ri = 0; 2116 const rampIv = setInterval(()=>{ 2117 ri++; 2118 swell.volume = Math.min(1, 0.15 + (ri/rampSteps)*0.85); 2119 if(ri>=rampSteps) clearInterval(rampIv); 2120 }, rampMs/rampSteps); 2121 swell._ivs.push(rampIv); 2122 // hold at peak for a good while (450ms ramp + ~1.7s hold), THEN start the commentary 2123 // while fading the roar out â the previous ~350ms hold was evidently too brief to 2124 // register as a real roar rather than a blip 2125 const LEAD_IN_MS = 2200; 2126 setTimeout(()=>{ 2127 const fadeSteps = 9, fadeMs = 600; 2128 let fi = 0; 2129 const fadeIv = setInterval(()=>{ 2130 fi++; 2131 swell.volume = Math.max(0, 1-(fi/fadeSteps)); 2132 if(fi>=fadeSteps){ clearInterval(fadeIv); swell.pause(); } 2133 }, fadeMs/fadeSteps); 2134 swell._ivs.push(fadeIv); 2135 playGoalSound(e); 2136 }, LEAD_IN_MS); 2137 }catch(err){ playGoalSound(e); } 2138} 2139function playGoalSound(e){ 2140 if(!e.audio){ playRoar(); return; } 2141 if(muted) return; 2142 try{ 2143 const clip = trackAudio(getCachedAudio(e.audio)); 2144 clip.addEventListener('loadedmetadata', ()=>{ 2145 // slow the match down for the clip's full length (plus a little breathing room), 2146 // rather than the fixed ~3s window used for the generic goal roar 2147 const dur = isFinite(clip.duration) && clip.duration>0 ? clip.duration : 5; 2148 // Capped the same way as penalty clips â plays out in full regardless, 2149 // but the match won't stay visually frozen for an unreasonable stretch 2150 // if an unusually long clip gets attached. 2151 const commentaryEnd = performance.now() + Math.min(dur+1.0, MAX_CLIP_PAUSE_S)*1000; 2152 extendPauseUntil(commentaryEnd); 2153 // duck the ambient crowd noise so the commentary is actually audible â 2154 // a slower time constant here so the dip itself feels like a fade, not a cut 2155 if(ambientGain && actx) ambientGain.gain.setTargetAtTime(0.18, actx.currentTime, 1.1); 2156 }); 2157 clip.addEventListener('ended', ()=>{ 2158 const isCelebrationGoal = match.goalCelebrationAudio && match.goalCelebrationMinute!==undefined && 2159 Math.abs(e.minute - match.goalCelebrationMinute) < 0.6; 2160 if(isCelebrationGoal){ 2161 playGoalCelebrationTail(); 2162 }else{ 2163 // restore smoothly too â ramp back up over a couple of seconds rather than 2164 // snapping straight back to the normal level the instant the clip ends 2165 if(ambientGain && actx) ambientGain.gain.setTargetAtTime( 2166 (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute), 2167 actx.currentTime, 1.8 2168 ); 2169 } 2170 }); 2171 clip.addEventListener('error', ()=>{ tlog('Commentary clip failed to play for '+(e.label||e.minute+"'")+' â falling back to roar.'); playRoar(); }); 2172 clip.play().catch(()=>{ playRoar(); }); 2173 }catch(err){ playRoar(); } 2174} 2175function projectGoalEndToScreen(team){ 2176 try{ 2177 // the goal being scored INTO is the opponent's end â same convention the 2178 // possession line itself uses (it reaches this same point on a goal) 2179 const localZ = (team==='home') ? -PITCH_LEN/2 : PITCH_LEN/2; 2180 const vec = new THREE.Vector3(0, 3, localZ); 2181 pitchGroup.localToWorld(vec); 2182 vec.project(camera); 2183 if(!isFinite(vec.x) || !isFinite(vec.y)) return null; 2184 const x = (vec.x*0.5+0.5) * window.innerWidth; 2185 const y = (1-(vec.y*0.5+0.5)) * window.innerHeight; 2186 return {x, y}; 2187 }catch(err){ return null; } 2188} 2189function flashGoal(e){ 2190 const teamName = e.team==='home' ? match.home.name : match.away.name; 2191 const el = document.getElementById('goalFlash'); 2192 document.getElementById('flashLbl').textContent = e.penalty ? "GOAL (PEN)" : "GOAL"; 2193 document.getElementById('flashSub').textContent = teamName+" · "+(e.label||Math.floor(e.minute)+"'"); 2194 const photoEl = document.getElementById('flashPhoto'); 2195 if(e.photo){ 2196 photoEl.classList.remove('landscape'); // reset before the new image's real dimensions are known 2197 photoEl.src = e.photo; 2198 photoEl.style.display = 'block'; 2199 photoEl.style.cursor = 'pointer'; 2200 photoEl.onclick = ()=>openPhotoLightbox(e.photo, teamName+' · '+(e.label||'')); 2201 photoEl.onerror = ()=>{ photoEl.style.display='none'; }; // silently hide if the URL is bad/blocked 2202 photoEl.onload = ()=>{ 2203 // a wide action shot (e.g. the goal itself) needs a wider box and a 2204 // centered crop;
2204 a portrait headshot needs the narrower, top-biased one 2205 if(photoEl.naturalWidth && photoEl.naturalHeight && (photoEl.naturalWidth/photoEl.naturalHeight) > 1.3){ 2206 photoEl.classList.add('landscape'); 2207 } 2208 }; 2209 }else{ 2210 photoEl.style.display = 'none'; 2211 } 2212 const pos = projectGoalEndToScreen(e.team); 2213 if(pos){ 2214 const clampedX = Math.max(110, Math.min(window.innerWidth-110, pos.x)); 2215 const clampedY = Math.max(70, Math.min(window.innerHeight-170, pos.y-46)); // "above" that point on the pitch 2216 el.style.left = clampedX+'px'; 2217 el.style.top = clampedY+'px'; 2218 }else{ 2219 el.style.left = '50%'; 2220 el.style.top = '148px'; 2221 } 2222 el.classList.add('show'); 2223 clearTimeout(el._t); 2224 clearInterval(el._checkIv); 2225 const flashStartTime = performance.now(); 2226 el._checkIv = setInterval(()=>{ 2227 const stillActive = clockSlowLocked ? (performance.now()-flashStartTime < 15000) : performance.now() < clockSlowUntil; 2228 if(!stillActive){ 2229 clearInterval(el._checkIv); 2230 el.classList.remove('show'); 2231 } 2232 }, 300); 2233} 2234 2235function rebuildTicker(){ 2236 ['tickHome','tickAway'].forEach(id=>document.getElementById(id).innerHTML=''); 2237 match.events.slice().sort((a,b)=>a.minute-b.minute).forEach(e=>{ 2238 if(e.minute > currentMinute) return; // don't reveal a goal (or the final tally) before it's actually happened â spoilers 2239 const col = document.getElementById(e.team==='home'?'tickHome':'tickAway'); 2240 const dot = document.createElement('div'); 2241 dot.className='tick-dot reached'; dot.dataset.minute=e.minute; 2242 dot.style.background = e.team==='home'?match.home.color:match.away.color; 2243 dot.title = e.label||Math.floor(e.minute)+"'"; 2244 dot.addEventListener('click', ()=>{ pause(); currentMinute=e.minute; syncAll(); }); 2245 col.appendChild(dot); 2246 }); 2247 // Penalty kicks get their own dots too â same navigation, same spoiler-safe 2248 // reveal, but diamond-shaped (and hollow for a miss) so they read as 2249 // distinctly different moments from run-of-play goals at a glance. 2250 if(match.penalties && match.penalties.length){ 2251 const startMinute = match.maxMinute; 2252 match.penalties.forEach((kick, i)=>{ 2253 const kickMinute = startMinute + i + 1; 2254 if(kickMinute > currentMinute) return; 2255 const col = document.getElementById(kick.team==='home'?'tickHome':'tickAway'); 2256 const dot = document.createElement('div'); 2257 dot.className = 'tick-dot reached tick-dot-penalty' + (kick.outcome==='miss' ? ' miss' : ''); 2258 dot.dataset.minute = kickMinute; 2259 const teamColor = kick.team==='home'?match.home.color:match.away.color; 2260 if(kick.outcome==='miss'){ dot.style.borderColor = teamColor; } 2261 else{ dot.style.background = teamColor; } 2262 dot.title = kick.taker+' · kick '+(i+1)+' · '+(kick.outcome==='score'?'scored':'missed'); 2263 dot.addEventListener('click', ()=>{ pause(); currentMinute=kickMinute; syncAll(); }); 2264 col.appendChild(dot); 2265 }); 2266 } 2267} 2268function updateTickerReached(){ 2269 document.querySelectorAll('.tick-dot').forEach(d=>{ 2270 d.classList.toggle('reached', parseFloat(d.dataset.minute)<=currentMinute); 2271 }); 2272} 2273 2274function syncAll(){ 2275 updateCloth(currentMinute, clockT, true); 2276 refreshUI(); 2277 updateTickerReached(); 2278 setCrowdLevel(sampleValue(currentMinute)); 2279 updatePenaltyCountLabels(); 2280} 2281 2282let frameCount = 0; 2283let firstFrameLogged = false; 2284function animate(ts){ 2285 requestAnimationFrame(animate); 2286 try{ 2287 if(lastTs===null) lastTs=ts; 2288 const dt = Math.min(0.25,(ts-lastTs)/1000); lastTs=ts; 2289 clockT += dt; 2290 if(activeExtraAudio.size > 8) stopAllExtraAudio(); // safety net against any accumulation path 2291 maybeTriggerAmbientVariety(dt); 2292 updateAmbientWindows(); 2293 if(playing){ 2294 const prev = currentMinute; 2295 const goalSlow = (clockSlowLocked || performance.now() < clockSlowUntil) ? 0 : 1; 2296 const preGoalEase = computePreGoalEase(currentMinute, speed); 2297 currentMinute = Math.min(getEffectiveMaxMinute(match), currentMinute + dt*speed*3.2*goalSlow*preGoalEase); 2298 checkEvents(prev); 2299 checkShootoutIntro(prev); 2300 checkPenalties(prev); 2301 checkHighlightCues(currentMinute, speed); 2302 // Wait for any active pause/celebration window (extendPauseUntil, set by 2303 // a goal or penalty kick) to actually finish before auto-stopping â 2304 // otherwise a moment that lands exactly on the effective max minute 2305 // (which a deciding penalty kick always does, and a last-second regular
2306 // goal occasionally does) gets its own audio killed instantly: pause() 2307 // calls stopAllExtraAudio(), which stops every tracked clip, including 2308 // the one that had just started playing a moment earlier in the same 2309 // frame. This is exactly why Chloe Kelly's winning kick played nothing. 2310 if(currentMinute>=getEffectiveMaxMinute(match) && performance.now()>=clockSlowUntil) pause(); 2311 } 2312 frameCount++; 2313 updateCloth(currentMinute, clockT, frameCount % 3 === 0); 2314 refreshUI(); 2315 updateTickerReached(); 2316 setCrowdLevel(sampleValue(currentMinute)); 2317 renderer.render(scene, camera); 2318 if(!firstFrameLogged){ firstFrameLogged=true; tlog('First frame rendered successfully.'); } 2319 }catch(err){ 2320 console.error('render loop error:', err); 2321 tlog('RENDER LOOP ERROR: '+err.message); 2322 } 2323} 2324requestAnimationFrame(animate); 2325tlog('Render loop scheduled.'); 2326 2327/* ============================================================ 2328 UI WIRING 2329 ============================================================ */ 2330const playBtn = document.getElementById('playBtn'); 2331tlog('Wiring up Play button listener.'); 2332let activeAmbientWindow = null; 2333let activeAmbientWindowPlayer = null; 2334let activeAmbientWindowPlayer2 = null; // optional second clip, mixed in alongside the first (w.audio2) 2335const AMBIENT_WINDOW_BASE_VOL = 0.35; // volume the moment the attack finishes 2336const AMBIENT_WINDOW_PEAK_VOL = 0.85; // volume reached right at the window's end minute â the 2337 // "build toward the goal" swell, rather than a flat level 2338const AMBIENT_WINDOW2_PEAK_VOL = 0.6; // the blended second clip sits a bit lower by default so 2339 // it reads as texture under the first, not a competing layer 2340/* Attack/release are real-time envelopes, not tied to match-minutes: several 2341 windows only span 5-6 match-minutes, which at normal playback speed is 2342 under 2 real seconds â the previous ~1.4s setInterval fade-in often hadn't 2343 finished (and so never got audible) before the window was already over and 2344 fading back out again, making it sound like nothing played at all. 350ms 2345 is fast enough to be clearly audible even in the shortest windows, while 2346 still avoiding a click. */ 2347const AMBIENT_ENVELOPE_MS = 350; 2348/* Cache one Audio element per window object rather than constructing a new 2349 one (which means re-decoding its whole base64 payload) every time a window 2350 is re-entered. Scrubbing back and forth across window boundaries was 2351 creating a fresh multi-hundred-KB Audio element on every crossing, which is 2352 exactly the kind of main-thread work that shows up as "play/pause become 2353 unresponsive" during scrubbing. Keyed by window object identity + which 2354 audio slot, since match.ambientWindows is rebuilt fresh on each data load. */ 2355const ambientClipCache = new Map(); 2356function getOrCreateAmbientClip(w, slot){ 2357 const src = slot===2 ? w.audio2 : w.audio; 2358 if(!src) return null; 2359 const key = w; // window objects are stable for the lifetime of a loaded match 2360 let bySlot = ambientClipCache.get(key); 2361 if(!bySlot){ bySlot = {}; ambientClipCache.set(key, bySlot); } 2362 if(!bySlot[slot]){ 2363 const el = trackAudio(new Audio(src)); 2364 el.loop = true; 2365 el.volume = 0; 2366 bySlot[slot] = el; 2367 } 2368 return bySlot[slot]; 2369} 2370/* How far through its window the match-clock currently is (0 at w.start, 1 at 2371 w.end), used to swell the volume up toward the goal instead of holding flat. */ 2372function ambientWindowProgress(w){ 2373 if(!w || w.end<=w.start) return 1; 2374 const raw = (currentMinute - w.start) / (w.end - w.start); 2375 // Reach full peak at 70% of the way through the window and hold there for 2376 // the rest. The previous version only reached peak exactly at w.end, so 2377 // it was still climbing right up to the goal itself â audible as "quiet"
2378 // because it never got to actually sustain full loudness before the climax. 2379 return Math.max(0, Math.min(1, raw / 0.7)); 2380} 2381function updateAmbientWindows(){ 2382 if(!actx || muted || !match.ambientWindows || !match.ambientWindows.length) return; 2383 const w = match.ambientWindows.find(w=>currentMinute>=w.start && currentMinute<=w.end) || null; 2384 const now0 = performance.now(); 2385 if(w!==activeAmbientWindow){ 2386 // start releasing whatever was playing for the previous window â release 2387 // begins from whatever volume it actually was (not a fixed assumption), 2388 // and is time-based so it always completes in AMBIENT_ENVELOPE_MS 2389 // regardless of how often windows change while scrubbing 2390 [activeAmbientWindowPlayer, activeAmbientWindowPlayer2].forEach(old=>{ 2391 if(!old) return; 2392 old._releaseStartedAt = now0; 2393 old._releaseFromVol = old.volume; 2394 old._releasing = true; 2395 old._attacking = false; 2396 }); 2397 activeAmbientWindow = w; 2398 activeAmbientWindowPlayer = w ? getOrCreateAmbientClip(w, 1) : null; 2399 activeAmbientWindowPlayer2 = w ? getOrCreateAmbientClip(w, 2) : null; 2400 // Only actually (re)start playback if the match is currently playing. 2401 // Without this, pausing (which calls stopAllExtraAudio and so wipes 2402 // activeAmbientWindow to null) or the safety net below tripping mid-window 2403 // would both look identical to "we just entered a new window" on the very 2404 // next frame â since currentMinute hasn't moved, w is unchanged â and this 2405 // function would immediately restart the clip from scratch. That produced 2406 // exactly the symptom reported: audio that won't stay stopped, replaying 2407 // in short bursts, because it was being restarted every single frame. 2408 if(playing){ 2409 [activeAmbientWindowPlayer, activeAmbientWindowPlayer2].forEach(el=>{ 2410 if(!el) return; 2411 el._releasing = false; 2412 el._attacking = true; 2413 el._attackStartedAt = now0; 2414 el._attackFromVol = el.volume; // may already be mid-release if re-entered quickly 2415 activeExtraAudio.add(el); // re-track: loop=true media never fires 'ended', so a 2416 // previous release cycle explicitly untracks it (see below) 2417 if(el.paused){ try{ el.currentTime = 0; }catch(e){} el.play().catch(()=>{}); } 2418 }); 2419 } 2420 } 2421 if(!playing) return; // don't run the envelope (which would call .play()) while paused/stopped 2422 // continuous per-frame envelope for whatever's currently assigned, whether 2423 // attacking, releasing, or holding â replaces the old setInterval fades, 2424 // which could be left stale/still-running if a window changed again mid-fade 2425 function applyEnvelope(el, peak){ 2426 if(!el) return; 2427 if(el._releasing){ 2428 const t = Math.min(1, (now0-el._releaseStartedAt)/AMBIENT_ENVELOPE_MS); 2429 el.volume = el._releaseFromVol*(1-t); 2430 if(t>=1){ 2431 el._releasing = false; 2432 try{ el.pause(); }catch(e){} 2433 // loop=true elements never fire 'ended', so this is the only place 2434 // they get removed from activeExtraAudio once actually idle â without 2435 // this, every ambient window ever played stays "active" forever, 2436 // eventually tripping the >8 safety net and nuking whatever else 2437 // (e.g. a goal's own commentary) happened to be playing at that moment 2438 activeExtraAudio.delete(el); 2439 } 2440 return; 2441 } 2442 const swell = AMBIENT_WINDOW_BASE_VOL + (peak-AMBIENT_WINDOW_BASE_VOL)*ambientWindowProgress(w); 2443 if(el._attacking){ 2444 const t = Math.min(1, (now0-el._attackStartedAt)/AMBIENT_ENVELOPE_MS); 2445 el.volume = el._attackFromVol + (swell-el._attackFromVol)*t; 2446 if(t>=1) el._attacking = false; 2447 }else{ 2448 el.volume = swell; 2449 } 2450 } 2451 applyEnvelope(activeAmbientWindowPlayer, (w && w.peakVolume) || AMBIENT_WINDOW_PEAK_VOL); 2452 applyEnvelope(activeAmbientWindowPlayer2, (w && w.peakVolume2) || AMBIENT_WINDOW2_PEAK_VOL); 2453} 2454let pendingAmbientWindows = []; 2455let pendingMaxMinuteOverride = undefined; 2456let pendingPossessionOverride = undefined; 2457let playedKickoffStinger = false; 2458let playedExtraTimeStinger = false;
2459// Every "extra" Audio element (goal roar/commentary/crescendo, ambient windows, 2460// ambient variety, stingers) plays outside the main Web Audio graph, so Pause 2461// (which only ducks crowdGain) had no effect on them, and interrupted fade 2462// intervals could run forever. This registry lets us stop everything cleanly. 2463const activeExtraAudio = new Set(); 2464function trackAudio(el){ 2465 activeExtraAudio.add(el); 2466 el.addEventListener('ended', ()=>{ clearAudioIntervals(el); activeExtraAudio.delete(el); }, {once:true}); 2467 return el; 2468} 2469function clearAudioIntervals(el){ 2470 if(el._ivs) el._ivs.forEach(id=>clearInterval(id)); 2471 el._ivs = []; 2472} 2473function stopAllExtraAudio(){ 2474 activeExtraAudio.forEach(el=>{ 2475 try{ clearAudioIntervals(el); el.pause(); }catch(err){} 2476 }); 2477 activeExtraAudio.clear(); 2478 activeAmbientWindow = null; 2479 activeAmbientWindowPlayer = null; 2480 activeAmbientWindowPlayer2 = null; 2481 ambientVarietyPlayer = null; 2482} 2483function playOneShotStinger(dataUri, vol){ 2484 if(!dataUri || muted) return; 2485 try{ 2486 const el = trackAudio(getCachedAudio(dataUri)); 2487 el.volume = vol!==undefined ? vol : 0.9; 2488 el.addEventListener('loadedmetadata', ()=>{ 2489 const dur = isFinite(el.duration) && el.duration>0 ? el.duration : 6; 2490 extendPauseUntil(performance.now() + (dur+0.3)*1000); 2491 }); 2492 el.play().catch(()=>{}); 2493 }catch(err){} 2494} 2495// One throwaway play()+pause() on a plain Audio element, done synchronously 2496// inside the tap that starts playback, "primes" iOS Safari's autoplay 2497// permission for the whole page â every custom clip created later (from 2498// async code, not a direct gesture) can then play normally. Without this, 2499// every new Audio() created afterward gets silently blocked on iOS. 2500// 2501// v115 note: this alone was NOT enough â iOS Safari's autoplay grant from 2502// playing one decoy element does not reliably extend to unrelated <audio> 2503// elements created later from async code (the animation loop, timers, 2504// etc). The grant is much more reliably honoured when it's the SAME 2505// element being replayed. So on top of the decoy, primeAllMatchAudio() 2506// below walks every real clip in the loaded match, creates its (cached, 2507// reused-for-life) Audio element right now, and plays+pauses each one 2508// synchronously inside this same tap gesture. Every later playback then 2509// just replays one of these already-gesture-unlocked elements instead of 2510// constructing a brand new one. 2511function primeAllMatchAudio(){ 2512 const urls = new Set(); 2513 if(match.goalCelebrationAudio) urls.add(match.goalCelebrationAudio); 2514 if(match.kickoffAudio) urls.add(match.kickoffAudio); 2515 if(match.extraTimeAudio) urls.add(match.extraTimeAudio); 2516 if(match.endOfNormalTimeAudio) urls.add(match.endOfNormalTimeAudio); 2517 if(match.penaltyScoredAudio) urls.add(match.penaltyScoredAudio); 2518 if(match.penaltyMissedAudio) urls.add(match.penaltyMissedAudio); 2519 (match.homeVarietyAudio||[]).forEach(u=>{ if(u) urls.add(u); }); 2520 (match.awayVarietyAudio||[]).forEach(u=>{ if(u) urls.add(u); }); 2521 (match.events||[]).forEach(e=>{ 2522 if(e.audio) urls.add(e.audio); 2523 if(e.highlightAudio) urls.add(e.highlightAudio); 2524 }); 2525 (match.penalties||[]).forEach(kick=>{ if(kick.audio) urls.add(kick.audio); }); 2526 (match.ambientWindows||[]).forEach(w=>{ 2527 try{ 2528 if(w.audio){ const el = getOrCreateAmbientClip(w,1); const p = el.play(); if(p&&p.catch) p.catch(()=>{}); el.pause(); el.currentTime=0; } 2529 if(w.audio2){ const el2 = getOrCreateAmbientClip(w,2); const p2 = el2.play(); if(p2&&p2.catch) p2.catch(()=>{}); el2.pause(); el2.currentTime=0; } 2530 }catch(err){} 2531 }); 2532 let primed = 0; 2533 urls.forEach(u=>{ 2534 try{ 2535 const el = getCachedAudio(u); 2536 const p = el.play(); 2537 if(p && p.catch) p.catch(()=>{}); 2538 el.pause(); 2539 el.currentTime = 0; 2540 primed++; 2541 }catch(err){} 2542 }); 2543 tlog('Primed '+primed+' match audio clip(s) inside the tap gesture.'); 2544} 2545function unlockAudioElements(){ 2546 if(audioElementsUnlocked) return; 2547 audioElementsUnlocked = true; 2548 try{ 2549 // shortest valid silent WAV (44-byte header, zero samples) 2550 const silence = new Audio('data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAA='); 2551 const p = silence.play(); 2552 if(p && p.catch) p.catch(()=>{}); 2553 silence.pause(); 2554 }catch(err){ tlog('Audio element unlock failed (continuing): '+err.message); } 2555 try{ primeAllMatchAudio(); }catch(err){ tlog('primeAllMatchAudio failed (continuing): '+err.message); } 2556} 2557function play(){ 2558 unlockAudioElements(); 2559 tlog('play() called. Was playing='+playing); 2560 if(currentMinute >= getEffectiveMaxMinute(match) - 0.001){ 2561 currentMinute = 0; 2562 seenEvents.clear(); 2563 seenPenalties.clear(); 2564 displayedValue = 0; 2565 playedKickoffStinger = false;
2566 playedExtraTimeStinger = false; 2567 playedShootoutIntro = false; 2568 playedHighlights.clear(); 2569 tlog('Reached full-time â restarting from kickoff.'); 2570 } 2571 try{ 2572 initAudio(); 2573 if(actx && actx.state==='suspended'){ 2574 tlog('AudioContext state suspended before resume() â attempting resume.'); 2575 actx.resume().then(()=>tlog('AudioContext.resume() resolved. state='+actx.state)) 2576 .catch(err=>tlog('AudioContext.resume() rejected: '+err.message)); 2577 } 2578 tlog('AudioContext state right after resume() call: '+(actx?actx.state:'no actx')); 2579 if(crowdGain && !muted) crowdGain.gain.setTargetAtTime(0.5, actx.currentTime, 0.3); 2580 setCrowdLevel(sampleValue(currentMinute)); 2581 } 2582 catch(err){ tlog('Audio init failed (continuing without sound): '+err.message); } 2583 if(currentMinute<=0.05 && !playedKickoffStinger && match.kickoffAudio){ 2584 playedKickoffStinger = true; 2585 extendPauseUntil(performance.now() + 2000); // conservative initial hold; extended once real duration is known 2586 playOneShotStinger(match.kickoffAudio); 2587 } 2588 playing=true; playBtn.textContent='â¸'; 2589} 2590function pause(){ 2591 playing=false; playBtn.textContent='â¶'; 2592 try{ if(crowdGain && actx) crowdGain.gain.setTargetAtTime(0.0001, actx.currentTime, 0.25); }catch(err){} 2593 stopAllExtraAudio(); 2594} 2595playBtn.addEventListener('pointerdown', function(){ tlog('pointerdown on Play button.'); }); 2596playBtn.addEventListener('click', (e)=>{ e.preventDefault(); tlog('click event on Play button fired.'); playing ? pause() : play(); }); 2597tlog('Play button listener attached.'); 2598 2599document.querySelectorAll('[data-speed]').forEach(btn=>{ 2600 btn.addEventListener('click', ()=>{ 2601 document.querySelectorAll('[data-speed]').forEach(b=>b.classList.remove('active')); 2602 btn.classList.add('active'); 2603 speed = parseFloat(btn.dataset.speed); 2604 }); 2605}); 2606 2607const muteBtn = document.getElementById('muteBtn'); 2608muteBtn.addEventListener('click', ()=>{ 2609 muted = !muted; 2610 muteBtn.textContent = muted ? 'ð' : 'ð'; 2611 if(muted && crowdGain) crowdGain.gain.setTargetAtTime(0, actx.currentTime, 0.1); 2612}); 2613 2614/* ---- CSV <-> match data helpers ---- */ 2615function splitCSVLine(line){ 2616 const result=[]; let cur=''; let inQuotes=false; 2617 for(let i=0;i<line.length;i++){ 2618 const ch=line[i]; 2619 if(ch==='"'){ if(inQuotes && line[i+1]==='"'){ cur+='"'; i++; } else inQuotes=!inQuotes; } 2620 else if(ch===',' && !inQuotes){ result.push(cur); cur=''; } 2621 else cur+=ch; 2622 } 2623 result.push(cur); 2624 return result.map(s=>s.trim()); 2625} 2626function parseCSVRows(text){ 2627 const lines = text.split(/\r?\n/).map(l=>l.trim()).filter(l=>l.length); 2628 if(lines.length<2) return []; 2629 return lines.slice(1).map(splitCSVLine); 2630} 2631function timelineToCSV(timeline){ 2632 let out='minute,value\n'; 2633 timeline.forEach(p=>{ out += p[0]+','+p[1]+'\n'; }); 2634 return out; 2635} 2636function eventsToCSV(events){ 2637 let out='minute,team,label,photo,audio,skip_crescendo,flat_tide\n'; 2638 events.forEach(e=>{ 2639 let label = e.label!==undefined ? e.label : ''; 2640 if(label.indexOf(',')>-1 || label.indexOf('"')>-1) label = '"'+label.replace(/"/g,'""')+'"'; 2641 let photo = e.photo!==undefined ? e.photo : ''; 2642 if(photo.indexOf(',')>-1 || photo.indexOf('"')>-1) photo = '"'+photo.replace(/"/g,'""')+'"'; 2643 // data: URIs contain a comma as part of their own syntax (data:<type>;base64,<payload>), 2644 // so this needs quoting just like any other field with a comma in it 2645 let audio = e.audio!==undefined ? e.audio : ''; 2646 if(audio.indexOf(',')>-1 || audio.indexOf('"')>-1) audio = '"'+audio.replace(/"/g,'""')+'"'; 2647 const skip = e.skipCrescendo ? 'true' : ''; 2648 const flat = e.flatTide ? 'true' : ''; 2649 out += e.minute+','+e.team+','+label+','+photo+','+audio+','+skip+','+flat+'\n'; 2650 }); 2651 return out; 2652} 2653function csvToTimeline(text){ 2654 return parseCSVRows(text) 2655 .map(r=>[parseFloat(r[0]), parseFloat(r[1])]) 2656 .filter(p=>!isNaN(p[0]) && !isNaN(p[1])); 2657} 2658function csvToEvents(text){ 2659 return parseCSVRows(text) 2660 .map(r=>({minute:parseFloat(r[0]), team:(r[1]||'').trim(), label:r[2]||'', photo:r[3]||'', audio:r[4]||'', skipCrescendo:/^(true|yes|1)$/i.test((r[5]||'').trim()), flatTide:/^(true|yes|1)$/i.test((r[6]||'').trim())})) 2661 .filter(e=>!isNaN(e.minute) && (e.team==='home' || e.team==='away')); 2662} 2663// Penalty shootout kicks, in the order taken. Not part of the events/goals 2664// array â a shootout doesn't change the actual match score, it decides who 2665// advances, so keeping this as its own list avoids corrupting the goal 2666// tally, ticker dots, or anything else that reads match.events. 2667function penaltiesToCSV(penalties){ 2668 let out = 'team,taker,outcome,photo,audio\n';
2669 (penalties||[]).forEach(p=>{ 2670 out += p.team+','+csvField(p.taker)+','+p.outcome+','+csvField(p.photo)+','+csvField(p.audio)+'\n'; 2671 }); 2672 return out; 2673} 2674function csvToPenalties(text){ 2675 return parseCSVRows(text) 2676 .map(r=>({team:(r[0]||'').trim(), taker:r[1]||'', outcome:(r[2]||'').trim().toLowerCase(), photo:r[3]||'', audio:r[4]||''})) 2677 .filter(p=>(p.team==='home'||p.team==='away') && (p.outcome==='score'||p.outcome==='miss') && p.taker); 2678} 2679async function fetchWikipediaThumbnail(name){ 2680 // first try an exact title match (fast) 2681 try{ 2682 const url = 'https://en.wikipedia.org/w/api.php?action=query&titles='+encodeURIComponent(name)+ 2683 '&prop=pageimages&format=json&pithumbsize=300&redirects=1&origin=*'; 2684 const resp = await fetch(url); 2685 if(resp.ok){ 2686 const data = await resp.json(); 2687 const pages = data.query && data.query.pages; 2688 if(pages){ 2689 const page = Object.values(pages)[0]; 2690 if(page && page.pageid && page.thumbnail && page.thumbnail.source) return page.thumbnail.source; 2691 } 2692 } 2693 }catch(err){} 2694 // fall back to a fuzzy full-text search â catches cases where the source data has 2695 // inconsistent/missing diacritics (e.g. "Raul Jimenez" vs the actual title "Raúl Jiménez"), 2696 // which an exact title match won't find even with redirects 2697 try{ 2698 const url2 = 'https://en.wikipedia.org/w/api.php?action=query&generator=search&gsrsearch='+ 2699 encodeURIComponent(name)+'&gsrlimit=1&prop=pageimages&format=json&pithumbsize=300&origin=*'; 2700 const resp2 = await fetch(url2); 2701 if(!resp2.ok) return null; 2702 const data2 = await resp2.json(); 2703 const pages2 = data2.query && data2.query.pages; 2704 if(!pages2) return null; 2705 const page2 = Object.values(pages2)[0]; 2706 if(page2 && page2.thumbnail && page2.thumbnail.source) return page2.thumbnail.source; 2707 return null; 2708 }catch(err){ return null; } 2709} 2710function csvField(v){ 2711 v = v!==undefined && v!==null ? String(v) : ''; 2712 if(v.indexOf(',')>-1 || v.indexOf('"')>-1) v = '"'+v.replace(/"/g,'""')+'"'; 2713 return v; 2714} 2715// Excel/Google Sheets aggressively reinterpret values that look like dates â 2716// "4-3-3" becomes an actual date. Prefixing with an apostrophe is the standard 2717// spreadsheet convention to force literal text; we strip it back out on import 2718// so it's invisible everywhere except inside an actual spreadsheet app. 2719function csvFieldProtected(v){ 2720 return csvField("'"+(v!==undefined && v!==null ? String(v) : '')); 2721} 2722function stripSpreadsheetGuard(v){ 2723 return (typeof v==='string' && v.charAt(0)==="'") ? v.slice(1) : v; 2724} 2725function metaToCSV(m){ 2726 let out='key,value\n'; 2727 const knownOrder = ['home_name','home_color','away_name','away_color','competition','date','venue','venue_lat','venue_long','home_formation','away_formation','home_flag','away_flag','ambient_audio','kickoff_audio','end_of_normal_time_audio','extra_time_audio','has_extra_time','max_minute','possession_home','possession_away','goal_celebration_audio','goal_celebration_minute','penalty_scored_audio','penalty_missed_audio','referee','linesman','attendance']; 2728 const protectedKeys = ['home_formation','away_formation']; 2729 const seen = {}; 2730 function writeRow(k){ 2731 if(seen[k] || m[k]===undefined) return; 2732 seen[k] = true; 2733 const val = protectedKeys.indexOf(k)>-1 ? csvFieldProtected(m[k]) : csvField(m[k]); 2734 out += k+','+val+'\n'; 2735 } 2736 knownOrder.forEach(writeRow); 2737 // any other keys present that aren't in the list above â e.g. home_variety_audio_1, 2738 // home_variety_audio_2, away_variety_audio_1... â so nothing is ever silently dropped 2739 // just because this list didn't get updated when a new field was added elsewhere 2740 Object.keys(m).forEach(writeRow); 2741 return out; 2742} 2743function csvToMeta(text){ 2744 const rows = parseCSVRows(text); 2745 const m = {}; 2746 rows.forEach(r=>{ if(r[0]) m[r[0].trim()] = stripSpreadsheetGuard(r[1]||''); }); 2747 return m; 2748} 2749function lineupsToCSV(lineup){ 2750 let out = 'team,role,number,name,club,age,photo\n'; 2751 (lineup||[]).forEach(p=>{ 2752 out += p.team+','+p.role+','+csvField(p.number)+','+csvField(p.name)+','+csvField(p.club)+','+csvField(p.age)+','+csvField(p.p
2752hoto)+'\n'; 2753 }); 2754 return out; 2755} 2756function csvToLineups(text){ 2757 return parseCSVRows(text) 2758 .map(r=>({team:(r[0]||'').trim(), role:(r[1]||'').trim(), number:r[2]||'', name:r[3]||'', club:r[4]||'', age:r[5]||'', photo:r[6]||''})) 2759 .filter(p=>(p.team==='home'||p.team==='away') && (p.role==='starter'||p.role==='sub') && p.name); 2760} 2761function currentMetaFromInputs(){ 2762 return { 2763 home_name: document.getElementById('inHomeName').value, 2764 home_color: document.getElementById('inHomeColor').value, 2765 away_name: document.getElementById('inAwayName').value, 2766 away_color: document.getElementById('inAwayColor').value, 2767 competition: document.getElementById('inComp').value, 2768 date: document.getElementById('inDate').value, 2769 venue: document.getElementById('inVenue').value, 2770 venue_lat: match.venueLat!==undefined ? match.venueLat : '', 2771 venue_long: match.venueLong!==undefined ? match.venueLong : '' 2772 }; 2773} 2774function metaFromMatch(m){ 2775 const out = { 2776 home_name: m.home && m.home.name, home_color: m.home && m.home.color, 2777 away_name: m.away && m.away.name, away_color: m.away && m.away.color, 2778 competition: m.competition, date: m.date, venue: m.venue, 2779 venue_lat: m.venueLat, venue_long: m.venueLong, 2780 home_formation: m.homeFormation, away_formation: m.awayFormation,
2781 home_flag: m.homeFlag, away_flag: m.awayFlag, ambient_audio: m.ambientAudio, 2782 kickoff_audio: m.kickoffAudio, end_of_normal_time_audio: m.endOfNormalTimeAudio, extra_time_audio: m.extraTimeAudio, 2783 has_extra_time: m.hasExtraTime ? '1' : '', max_minute: m.maxMinute!==undefined ? m.maxMinute : '', 2784 possession_home: m.possession ? m.possession.home : '', possession_away: m.possession ? m.possession.away : '', 2785 goal_celebration_audio: m.goalCelebrationAudio, goal_celebration_minute: m.goalCelebrationMinute, 2786 penalty_scored_audio: m.penaltyScoredAudio, penalty_missed_audio: m.penaltyMissedAudio 2787 }; 2788 (m.homeVarietyAudio||[]).forEach((a,i)=>{ out['home_variety_audio_'+(i+1)] = a; }); 2789 (m.awayVarietyAudio||[]).forEach((a,i)=>{ out['away_variety_audio_'+(i+1)] = a; }); 2790 return out; 2791} 2792// combined single-file format: one CSV holding all three tables, distinguished by a 2793// leading "section" column (meta / timeline / event), since they have different shapes. 2794// This is an alternate export/import â the three separate CSVs above remain the 2795// primary editing surface, since a flat combined file is less friendly to hand-edit. 2796function combinedToCSV(meta, timeline, events, lineup, ambientWindows, penalties){ 2797 let out = 'section,minute,value,team,label,photo,key,keyvalue,role,number,club,age,audio\n'; 2798 const metaKeys = ['home_name','home_color','away_name','away_color','competition','date','venue','venue_lat','venue_long','home_formation','away_formation','home_flag','away_flag','referee','linesman','attendance','ambient_audio','kickoff_audio','end_of_normal_time_audio','extra_time_audio','has_extra_time','max_minute','possession_home','possession_away','goal_celebration_audio','goal_celebration_minute','penalty_scored_audio','penalty_missed_audio']; 2799 const protectedKeys = ['home_formation','away_formation']; 2800 const seen = {}; 2801 function writeMetaRow(k){ 2802 if(seen[k] || meta[k]===undefined) return; 2803 seen[k] = true; 2804 const val = protectedKeys.indexOf(k)>-1 ? csvFieldProtected(meta[k]) : csvField(meta[k]); 2805 out += 'meta,,,,,,'+k+','+val+',,,,,\n'; 2806 } 2807 metaKeys.forEach(writeMetaRow); 2808 // any additional keys not in the known list above (e.g. home_variety_audio_1, 2809 // home_variety_audio_2, away_variety_audio_1... â a variable number of ambient 2810 // variety clips per team, so this isn't a fixed count) 2811 Object.keys(meta).forEach(writeMetaRow); 2812 timeline.forEach(p=>{ 2813 out += 'timeline,'+p[0]+','+p[1]+',,,,,,,,,,\n'; 2814 }); 2815 events.forEach(e=>{ 2816 out += 'event,'+e.minute+','+(e.skipCrescendo?'1':'')+','+e.team+','+csvField(e.label)+','+csvField(e.photo)+','+(e.flatTide?'1':'')+','+csvField(e.highlightAudio||'')+',,,,,'+csvField(e.audio)+'\n'; 2817 }); 2818 (lineup||[]).forEach(p=>{ 2819 out += 'lineup,,,'+p.team+','+csvField(p.name)+','+csvField(p.photo)+',,,'+p.role+','+csvField(p.number)+','+csvField(p.club)+','+csvField(p.age)+',\n'; 2820 }); 2821 (ambientWindows||[]).forEach(w=>{ 2822 out += 'ambient_window,'+w.start+','+w.end+','+(w.peakVolume!==undefined?w.peakVolume:'')+','+(w.peakVolume2!==undefined?w.peakVolume2:'')+','+csvField(w.audio2||'')+',,,,,,,'+csvField(w.audio)+'\n'; 2823 }); 2824 // Penalty shootout kicks, in order taken (kick order also stored explicitly 2825 // in the "number" column so it survives even if rows get reordered). 2826 (penalties||[]).forEach((p,i)=>{ 2827 out += 'penalty,,'+p.outcome+','+p.team+','+csvField(p.taker)+','+csvField(p.photo)+',,,,'+(i+1)+',,,'+csvField(p.audio)+'\n'; 2828 }); 2829 return out; 2830} 2831function csvToCombined(text){ 2832 const rows = parseCSVRows(text); // [section,minute,value,team,label,photo,key,keyvalue,role,number,club,age,audio] 2833 const meta = {}, timeline = [], events = [], lineup = [], ambientWindows = [], penalties = []; 2834 rows.forEach(r=>{ 2835 const section = (r[0]||'').trim().toLowerCase(); 2836 if(section==='meta'){ 2837 if(r[6]) meta[r[6].trim()] = stripSpreadsheetGuard(r[7]||''); 2838 }else if(section==='ambient_window'){ 2839 const start = parseFloat(r[1]), end = parseFloat(r[2]); 2840 const peakVolume = parseFloat(r[3]); 2841 const peakVolume2 = parseFloat(r[4]);
2842 if(!isNaN(start) && !isNaN(end) && r[12]) ambientWindows.push({ 2843 start, end, audio:r[12], 2844 peakVolume: isNaN(peakVolume)?undefined:peakVolume, 2845 audio2: r[5]||undefined, 2846 peakVolume2: isNaN(peakVolume2)?undefined:peakVolume2 2847 }); 2848 }else if(section==='timeline'){ 2849 const m = parseFloat(r[1]), v = parseFloat(r[2]); 2850 if(!isNaN(m) && !isNaN(v)) timeline.push([m,v]); 2851 }else if(section==='event'){ 2852 const m = parseFloat(r[1]), team = (r[3]||'').trim(); 2853 if(!isNaN(m) && (team==='home'||team==='away')) events.push({minute:m, team, label:r[4]||'', photo:r[5]||'', audio:r[12]||'', skipCrescendo: r[2]==='1', flatTide: r[6]==='1', highlightAudio: r[7]||undefined}); 2854 }else if(section==='lineup'){ 2855 const team = (r[3]||'').trim(), role = (r[8]||'').trim(); 2856 if((team==='home'||team==='away') && (role==='starter'||role==='sub') && r[4]){ 2857 lineup.push({team, role, number:r[9]||'', name:r[4]||'', club:r[10]||'', age:r[11]||'', photo:r[5]||''}); 2858 } 2859 }else if(section==='penalty'){ 2860 const team = (r[3]||'').trim(), outcome = (r[2]||'').trim().toLowerCase(); 2861 const order = parseInt(r[9], 10); 2862 if((team==='home'||team==='away') && (outcome==='score'||outcome==='miss') && r[4]){ 2863 penalties.push({team, taker:r[4]||'', outcome, photo:r[5]||'', audio:r[12]||'', _order: isNaN(order)?penalties.length:order}); 2864 } 2865 } 2866 }); 2867 penalties.sort((a,b)=>a._order-b._order); 2868 penalties.forEach(p=>delete p._order); 2869 return {meta, timeline, events, lineup, ambientWindows, penalties}; 2870} 2871 2872/* ---- commentary audio attach ---- */ 2873function refreshAudioPicker(){ 2874 const picker = document.getElementById('audioEventPicker'); 2875 const events = csvToEvents(document.getElementById('eventsCsv').value); 2876 const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value); 2877 picker.innerHTML = ''; 2878 events.forEach((e,i)=>{ 2879 const opt = document.createElement('option'); 2880 opt.value = 'event:'+i; 2881 opt.textContent = (e.label||('Minute '+e.minute))+(e.audio ? ' ð' : ''); 2882 picker.appendChild(opt); 2883 }); 2884 penalties.forEach((p,i)=>{ 2885 const opt = document.createElement('option'); 2886 opt.value = 'penalty:'+i; 2887 opt.textContent = 'Penalty '+(i+1)+' â '+p.taker+' ('+p.outcome+')'+(p.audio ? ' ð' : ''); 2888 picker.appendChild(opt); 2889 }); 2890} 2891document.getElementById('attachAudioBtn').addEventListener('click', ()=>{ 2892 document.getElementById('attachAudioInput').click(); 2893}); 2894document.getElementById('attachAudioInput').addEventListener('change', ()=>{ 2895 const input = document.getElementById('attachAudioInput'); 2896 const status = document.getElementById('attachAudioStatus'); 2897 const picker = document.getElementById('audioEventPicker'); 2898 const file = input.files[0]; 2899 if(!file) return; 2900 const [kind, idxStr] = (picker.value||'').split(':'); 2901 const idx = parseInt(idxStr, 10); 2902 if(!kind || isNaN(idx)){ 2903 status.textContent = 'Nothing selected â add at least one row to Events CSV or Penalties CSV first.'; 2904 status.style.display = 'block'; 2905 return; 2906 } 2907 const reader = new FileReader(); 2908 reader.onload = ()=>{ 2909 if(kind==='event'){ 2910 const events = csvToEvents(document.getElementById('eventsCsv').value); 2911 if(!events[idx]) return; 2912 events[idx].audio = reader.result; // base64 data URI 2913 document.getElementById('eventsCsv').value = eventsToCSV(events); 2914 refreshAudioPicker(); 2915 picker.value = 'event:'+idx; 2916 status.textContent = 'Attached "'+file.name+'" ('+Math.round(file.size/1024)+' KB) to "'+(events[idx].label||events[idx].minute+"'")+'".'; 2917 }else{ 2918 const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value); 2919 if(!penalties[idx]) return; 2920 penalties[idx].audio = reader.result; 2921 document.getElementById('penaltiesCsv').value = penaltiesToCSV(penalties); 2922 refreshAudioPicker(); 2923 picker.value = 'penalty:'+idx; 2924 status.textContent = 'Attached "'+file.name+'" ('+Math.round(file.size/1024)+' KB) to penalty '+(idx+1)+' â '+penalties[idx].taker+'. This replaces the default cheer for this kick and plays out in full (capped at a sensible maximum â see the hint above).'; 2925 } 2926 status.style.display = 'block'; 2927 }; 2928 reader.onerror = ()=>{ 2929 status.textContent = "Couldn't read that audio file â "+reader.error; 2930 status.style.display = 'block'; 2931 };
2932 reader.readAsDataURL(file); 2933 input.value = ''; 2934}); 2935 2936/* ---- data panel ---- */ 2937let panelMode = 'csv'; 2938document.querySelectorAll('#formatToggle [data-mode]').forEach(btn=>{ 2939 btn.addEventListener('click', ()=>{ 2940 document.querySelectorAll('#formatToggle [data-mode]').forEach(b=>b.classList.remove('active')); 2941 btn.classList.add('active'); 2942 panelMode = btn.dataset.mode; 2943 document.getElementById('csvFields').style.display = panelMode==='csv' ? 'block' : 'none'; 2944 document.getElementById('jsonFields').style.display = panelMode==='json' ? 'block' : 'none'; 2945 document.getElementById('fotmobFields').style.display = panelMode==='fotmob' ? 'block' : 'none'; 2946 if(panelMode==='json') document.getElementById('dataJson').value = JSON.stringify(match,null,2); 2947 else if(panelMode==='csv'){ 2948 document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(match)); 2949 document.getElementById('timelineCsv').value = timelineToCSV(match.timeline); 2950 document.getElementById('eventsCsv').value = eventsToCSV(match.events); 2951 document.getElementById('lineupsCsv').value = lineupsToCSV(match.lineup||[]); 2952 document.getElementById('penaltiesCsv').value = penaltiesToCSV(match.penalties||[]); 2953 refreshAudioPicker(); 2954 } 2955 }); 2956}); 2957 2958/* ---- FotMob import: confirmed field structure (from a real matchDetails response) ---- 2959 general.homeTeam.name / general.awayTeam.name â team names 2960 general.teamColors.darkMode.{home,away} â hex colours 2961 header.events.{homeTeamGoals,awayTeamGoals} â goals, keyed by player surname, 2962 each entry: {time, overloadTime, isHome, ownGoal, goalDescription, player:{name}} 2963 content.matchFacts.momentum.main.data (or content.momentum.main.data) â the timeline 2964 Searched recursively (not by a fixed path) so it's resilient to paths shifting slightly 2965 between matches/competitions â but this is still one real confirmed sample, not a 2966 guarantee every match/sport is laid out identically. */ 2967function deepFindByKey(obj, key, maxDepth, seen){ 2968 maxDepth = maxDepth===undefined ? 14 : maxDepth; 2969 seen = seen || new Set(); 2970 if(maxDepth<0 || obj===null || typeof obj!=='object' || seen.has(obj)) return undefined; 2971 seen.add(obj); 2972 if(!Array.isArray(obj) && Object.prototype.hasOwnProperty.call(obj,key)) return obj[key]; 2973 const children = Array.isArray(obj) ? obj : Object.values(obj); 2974 for(let i=0;i<children.length;i++){ 2975 const found = deepFindByKey(children[i], key, maxDepth-1, seen); 2976 if(found!==undefined) return found; 2977 } 2978 return undefined; 2979} 2980function findFotMobData(parsed){ 2981 // tolerant to several paste shapes: the raw array itself, {"data":[...]}, 2982 // {"main":{"data":[...]}}, or {"momentum":{"main":{"data":[...]}}} â anywhere in the tree 2983 if(Array.isArray(parsed)) return parsed; 2984 if(parsed && Array.isArray(parsed.data)) return parsed.data; 2985 if(parsed && parsed.main && Array.isArray(parsed.main.data)) return parsed.main.data; 2986 if(parsed && parsed.momentum && parsed.momentum.main && Array.isArray(parsed.momentum.main.data)) return parsed.momentum.main.data; 2987 const momentum = deepFindByKey(parsed, 'momentum'); 2988 if(momentum){ 2989 if(momentum.main && Array.isArray(momentum.main.data)) return momentum.main.data; 2990 if(Array.isArray(momentum.data)) return momentum.data; 2991 } 2992 return null; 2993} 2994// fallback for malformed/truncated JSON (e.g. a copy that got cut off before the closing 2995// brackets) â pattern-matches {"minute":X,"value":Y} pairs directly, which works even 2996// when the surrounding structure is broken, as long as the individual entries are intact 2997function extractFotMobPairsByRegex(text){ 2998 const re = /"minute"\s*:\s*(-?\d+(?:\.\d+)?)\s*,\s*"value"\s*:\s*(-?\d+(?:\.\d+)?)/g; 2999 const out = []; 3000 let m; 3001 while((m = re.exec(text)) !== null){ 3002 out.push({minute: parseFloat(m[1]), value: parseFloat(m[2])}); 3003 } 3004 return out; 3005} 3006function extractFotMobLineups(parsed){ 3007 const lineupRoot = deepFindByKey(parsed, 'lineup'); 3008 if(!lineupRoot || (!lineupRoot.homeTeam && !lineupRoot.awayTeam)) return null; 3009 const out = {players:[], homeFormation:'', awayFormation:''}; 3010 function collect(teamObj, side){ 3011 if(!teamObj) return; 3012 if(teamObj.formation){ if(side==='home') out.homeFormation = teamObj.formation; else out.awayFormation = teamObj.formation; }
3013 (teamObj.starters||[]).forEach(p=>{ 3014 out.players.push({team:side, role:'starter', number:p.shirtNumber||'', name:p.name||'', club:p.primaryTeamName||'', age:(typeof p.age==='number')?p.age:'', photo:''}); 3015 }); 3016 (teamObj.subs||[]).forEach(p=>{ 3017 out.players.push({team:side, role:'sub', number:p.shirtNumber||'', name:p.name||'', club:p.primaryTeamName||'', age:(typeof p.age==='number')?p.age:'', photo:''}); 3018 }); 3019 } 3020 collect(lineupRoot.homeTeam, 'home'); 3021 collect(lineupRoot.awayTeam, 'away'); 3022 return out.players.length ? out : null; 3023} 3024function normalizeForMatch(s){ 3025 return s.normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLowerCase().replace(/[^a-z]/g,''); 3026} 3027// finds real editorial photo URLs anywhere in the response (match-report thumbnails etc). 3028// Note: these are NOT a systematic per-player photo directory â just whichever 3029// players happen to be the subject of news articles about this match, so most 3030// goals won't have a photo available this way. 3031function findFotMobArticleImageUrls(parsed){ 3032 const out = []; 3033 const seen = new Set(); 3034 function walk(obj, depth){ 3035 if(depth>12 || obj===null || typeof obj!=='object' || seen.has(obj)) return; 3036 seen.add(obj); 3037 if(!Array.isArray(obj)){ 3038 if(typeof obj.image==='string' && /\.(jpg|jpeg|png)/i.test(obj.image)) out.push(obj.image); 3039 Object.values(obj).forEach(v=>walk(v, depth+1)); 3040 }else{ 3041 obj.forEach(v=>walk(v, depth+1)); 3042 } 3043 } 3044 walk(parsed, 0); 3045 return Array.from(new Set(out)); 3046} 3047// matches by the image URL's filename slug (e.g. "bukayo-saka_xyz.jpg"), not the 3048// article title â titles often mention multiple players together (e.g. comparing 3049// two goalscorers), which caused wrong matches when tested; the image filename 3050// reliably names only the actual subject of that specific photo. 3051function autoMatchGoalPhotos(events, imageUrls){ 3052 let matched = 0; 3053 events.forEach(e=>{ 3054 if(e.photo) return; // never override a photo that's already set 3055 const namePart = (e.label||'').split('·')[0].trim(); 3056 if(!namePart) return; 3057 const surname = normalizeForMatch(namePart.split(' ').pop()); 3058 if(!surname || surname.length<3) return; 3059 const hit = imageUrls.find(url=>normalizeForMatch(url).includes(surname)); 3060 if(hit){ e.photo = hit; matched++; } 3061 }); 3062 return matched; 3063} 3064// FotMob's momentum widget commonly stops around minute 90(-ish) even when the 3065// match ran well past that in real added time â confirmed against a real 3066// response where the momentum array ended at 90.75 despite ~12 real minutes 3067// of second-half stoppage (no goal in that window either, so there's no event 3068// to infer it from). header.status.halfs gives genuine wall-clock start/end 3069// timestamps for each half, which is the one reliable source for the true 3070// final minute â this reads those directly instead of trusting the momentum 3071// array's own range or requiring a goal to have happened late. 3072function parseFotMobHalfTimestamp(s){ 3073 if(!s) return null; 3074 const m = /^(\d{2})\.(\d{2})\.(\d{4})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(s.trim()); 3075 if(!m) return null; 3076 return new Date(+m[3], +m[2]-1, +m[1], +m[4], +m[5], +m[6]).getTime(); 3077} 3078function extractFotMobMatchDuration(parsed){ 3079 const halfs = deepFindByKey(parsed, 'halfs'); 3080 if(!halfs) return null; 3081 const gameEnded = parseFotMobHalfTimestamp(halfs.gameEnded); 3082 const hasExtraTime = !!(halfs.firstExtraHalfStarted && halfs.firstExtraHalfStarted.trim()); 3083 const finalPeriodStart = parseFotMobHalfTimestamp(hasExtraTime ? halfs.secondExtraHalfStarted : halfs.secondHalfStarted); 3084 if(gameEnded==null || finalPeriodStart==null || gameEnded<=finalPeriodStart) return null; 3085 const finalPeriodDurationMin = (gameEnded - finalPeriodStart) / 60000; 3086 // nominal kickoff minute of whichever period actually finishes the match â 3087 // 45' for a normal 2nd half, 105' for a 2nd extra-time half â plus however 3088 // long that period really ran gives the true final displayed minute, 3089 // regardless of what the momentum widget itself covers. 3090 const nominalStart = hasExtraTime ? 105 : 45; 3091 const maxMinute = Math.round((nominalStart + finalPeriodDurationMin) * 10) / 10; 3092 return { maxMinute, hasExtraTime, finalPeriodDurationMin: Math.round(finalPeriodDurationMin*10)/10 }; 3093} 3094// FotMob's Top stats live at content.stats.Periods.All.stats, a list of stat 3095// groups; the group with key 'top_stats' has individual rows like Ball 3096// possession (FotMob's own key spelling: 'BallPossesion', not a typo here), 3097// each with a [home, away] pair. Only possession is pulled out for display â 3098// everything else in that group (xG, shots, etc.) is left alone for now. 3099function extractFotMobPossession(parsed){ 3100 const statsRoot = deepFindByKey(parsed, 'stats'); 3101 if(!statsRoot || !statsRoot.Periods || !statsRoot.Periods.All || !Array.isArray(statsRoot.Periods.All.stats)) return null; 3102 const topStatsGroup = statsRoot.Periods.All.stats.find(g=>g && g.key==='top_stats' && Array.isArray(g.stats)); 3103 if(!topStatsGroup) return null;
3104 const row = topStatsGroup.stats.find(s=>s && s.key==='BallPossesion' && Array.isArray(s.stats) && s.stats.length===2); 3105 if(!row) return null; 3106 const home = parseFloat(row.stats[0]), away = parseFloat(row.stats[1]); 3107 if(isNaN(home) || isNaN(away)) return null; 3108 return { home, away }; 3109} 3110function extractFotMobGoals(parsed){ 3111 let goalsContainer = null; 3112 const eventsObj = deepFindByKey(parsed, 'events'); 3113 if(eventsObj && (eventsObj.homeTeamGoals || eventsObj.awayTeamGoals)) goalsContainer = eventsObj; 3114 if(!goalsContainer && parsed.header && parsed.header.events) goalsContainer = parsed.header.events; 3115 if(!goalsContainer) return null; 3116 const out = []; 3117 function collect(goalsByPlayer, side){ 3118 if(!goalsByPlayer) return; 3119 Object.values(goalsByPlayer).forEach(arr=>{ 3120 if(!Array.isArray(arr)) return; 3121 arr.forEach(g=>{ 3122 const base = typeof g.time==='number' ? g.time : parseFloat(g.time); 3123 if(isNaN(base)) return; 3124 const added = typeof g.overloadTime==='number' ? g.overloadTime : 0; 3125 const minute = base+added; 3126 const team = (typeof g.isHome==='boolean') ? (g.isHome?'home':'away') : side; 3127 const playerName = (g.player && g.player.name) ? g.player.name : (g.nameStr||'Unknown'); 3128 let label = playerName+' · '+base+(added>0?('+'+added):'')+"'"; 3129 if(g.goalDescription==='Penalty') label += ' (Pen)'; 3130 if(g.ownGoal) label += ' (OG)'; 3131 out.push({minute, team, label, photo:''}); 3132 }); 3133 }); 3134 } 3135 collect(goalsContainer.homeTeamGoals, 'home'); 3136 collect(goalsContainer.awayTeamGoals, 'away'); 3137 out.sort((a,b)=>a.minute-b.minute); 3138 return out.length ? out : null; 3139} 3140function extractFotMobTeamInfo(parsed){ 3141 const general = deepFindByKey(parsed, 'general') || parsed.general; 3142 const info = {homeName:null, awayName:null, homeColor:null, awayColor:null, competition:null, date:null, venue:null, venueLat:null, venueLong:null}; 3143 if(general){ 3144 if(general.homeTeam && general.homeTeam.name) info.homeName = general.homeTeam.name; 3145 if(general.awayTeam && general.awayTeam.name) info.awayName = general.awayTeam.name; 3146 if(general.teamColors){ 3147 const tc = general.teamColors.darkMode || general.teamColors.lightMode; 3148 if(tc && tc.home) info.homeColor = tc.home; 3149 if(tc && tc.away) info.awayColor = tc.away; 3150 } 3151 if(general.leagueName) info.competition = general.leagueName; 3152 if(general.matchTimeUTC){ 3153 // "Mon, Jul 6, 2026, 01:00 UTC" -> "Jul 6, 2026" (strip weekday prefix and time/UTC suffix) 3154 info.date = general.matchTimeUTC.replace(/^\w+,\s*/, '').replace(/,?\s*\d{1,2}:\d{2}\s*UTC$/, '').trim(); 3155 } 3156 } 3157 const stadium = deepFindByKey(parsed, 'Stadium'); 3158 if(stadium && stadium.name){ 3159 info.venue = stadium.name + (stadium.city ? ', '+stadium.city : ''); 3160 if(typeof stadium.lat==='number') info.venueLat = stadium.lat; 3161 if(typeof stadium.long==='number') info.venueLong = stadium.long; 3162 } 3163 return info; 3164} 3165document.getElementById('convertFotmobBtn').addEventListener('click', ()=>{ 3166 const errBox = document.getElementById('errBox'); 3167 const preview = document.getElementById('fotmobPreview'); 3168 errBox.style.display='none'; preview.style.display='none'; 3169 try{ 3170 let raw = document.getElementById('fotmobJson').value.trim(); 3171 if(!raw) throw new Error("Paste a match stats API response (or at least the momentum/timeline section) first."); 3172 let parsed = null; 3173 let arr = null; 3174 let usedFallback = false; 3175 try{ 3176 let toParse = raw; 3177 if(!toParse.startsWith('[') && !toParse.startsWith('{')) toParse = '{'+toParse+'}'; 3178 parsed = JSON.parse(toParse); 3179 arr = findFotMobData(parsed); 3180 }catch(parseErr){ 3181 // JSON was malformed (very often a truncated copy missing closing brackets) â 3182 // fall back to pulling out whatever complete {minute,value} pairs exist. 3183 // Events/team-info extraction need valid JSON structure, so those are skipped 3184 // in this path â only the timeline can be recovered from broken JSON. 3185 arr = extractFotMobPairsByRegex(raw); 3186 usedFallback = true; 3187 } 3188 if(!arr || arr.length===0){ arr = extractFotMobPairsByRegex(raw); usedFallback = arr.length>0; } 3189 if(!arr || arr.length===0) throw new Error("Couldn't find any minute/value pairs in that text â check you've pasted the momentum section (or the full matchDetails response containing it)."); 3190 3191 const flip = document.getElementById('fotmobFlipSign').checked ? -1 : 1; 3192 const timeline = arr 3193 .filter(d=>d && typeof d.minute==='number' && typeof d.value==='number' && !isNaN(d.minute) && !isNaN(d.value)) 3194 .map(d=>[d.minute, Math.max(-1, Math.min(1, (d.value/100)*flip))]); 3195 if(timeline.length<2) throw new Error("Found the data but couldn't read at least 2 valid {minute,value} entries from it."); 3196 document.getElementById('timelineCsv').value = timelineToCSV(timeline); 3197 3198 const previewLines = []; 3199 previewLines.push((usedFallback ? 'â JSON was malformed (likely a truncated copy) â recovered ' : 'Timeline: converted ') 3200 +timeline.length+' points (minute '+timeline[0][0]+' to '+timeline[timeline.length-1][0]+')' 3201 +(usedFallback ? ' by pattern-matching directly.' : '.')); 3202 3203 if(parsed && !usedFallback){ 3204 const goals = extractFotMobGoals(parsed); 3205 if(goals){ 3206 const articleImages = findFotMobArticleImageUrls(parsed); 3207 const photoMatches = autoMatchGoalPhotos(goals, articleImages); 3208 document.getElementById('eventsCsv').value = eventsToCSV(goals); 3209 refreshAudioPicker(); 3210 previewLines.push('Events: found '+goals.length+' goal(s) â team/minute/scorer extracted, photo left blank for you to add. Please check these against the actual match before relying on them.'); 3211 if(photoMatches>0){ 3212 previewLines.push('Photos: auto-matched '+photoMatches+' of '+goals.length+' goals to a real photo found in this data (matched by image filename, not just name mentions in text â reduces false matches, but still worth a quick visual check). The rest are blank, since this data only contains incidental match-report images, not a full player photo directory â add those manually (e.g. Wikimedia Commons) as before.'); 3213 } 3214 }else{ 3215 previewLines.push('Events: none found in this paste â add manually if needed.'); 3216 } 3217 const info = extractFotMobTeamInfo(parsed); 3218 if(info.homeName) document.getElementById('inHomeName').value = info.homeName; 3219 if(info.awayName) document.getElementById('inAwayName').value = info.awayName; 3220 if(info.homeColor) document.getElementById('inHomeColor').value = info.homeColor; 3221 if(info.awayColor) document.getElementById('inAwayColor').value = info.awayColor; 3222 if(info.competition) document.getElementById('inComp').value = info.competition; 3223 if(info.date) document.getElementById('inDate').value = info.date; 3224 if(info.homeName || info.awayName || info.homeColor || info.awayColor){ 3225 previewLines.push('Teams: '+(info.homeName||'?')+' (home'+(info.homeColor?', '+info.homeColor:'')+') vs '+(info.awayName||'?')+' (away'+(info.awayColor?', '+info.awayColor:'')+') â filled
3225in above, click Apply data to use them.'); 3226 } 3227 const duration = extractFotMobMatchDuration(parsed); 3228 if(duration){ 3229 pendingMaxMinuteOverride = duration.maxMinute; 3230 document.getElementById('inHasExtraTime').checked = duration.hasExtraTime; 3231 const momentumMax = timeline.length ? timeline[timeline.length-1][0] : 0; 3232 previewLines.push('Duration: real half timestamps show the match ran to '+duration.maxMinute+"' (" 3233 +(duration.hasExtraTime ? 'extra time, 2nd ET half' : '2nd half')+' lasted '+duration.finalPeriodDurationMin+' real minutes) â set as the match duration for Apply Data.' 3234 +(momentumMax < duration.maxMinute - 0.5 ? ' Note the momentum widget itself only covers up to '+momentumMax+"', so the timeline will hold flat for the remaining stoppage time rather than showing more possession swings â that's a genuine gap in FotMob's momentum data, not something this app can recover." : '')); 3235 } 3236 const possession = extractFotMobPossession(parsed); 3237 if(possession){ 3238 pendingPossessionOverride = possession; 3239 previewLines.push('Possession: '+possession.home+'% / '+possession.away+'% â will show in the Lineups panel after Apply Data.'); 3240 } 3241 if(info.venue) document.getElementById('inVenue').value = info.venue; 3242 if(info.competition || info.date || info.venue){ 3243 previewLines.push('Match: '+(info.competition||'?')+' · '+(info.date||'?')+(info.venue?' · '+info.venue:'')+' â filled in above too.'); 3244 } 3245 const lineupData = extractFotMobLineups(parsed); 3246 document.getElementById('metaCsv').value = metaToCSV({ 3247 home_name: document.getElementById('inHomeName').value, 3248 home_color: document.getElementById('inHomeColor').value, 3249 away_name: document.getElementById('inAwayName').value, 3250 away_color: document.getElementById('inAwayColor').value, 3251 competition: document.getElementById('inComp').value, 3252 date: document.getElementById('inDate').value, 3253 venue: document.getElementById('inVenue').value, 3254 venue_lat: info.venueLat!==null ? info.venueLat : '', 3255 venue_long: info.venueLong!==null ? info.venueLong : '', 3256 home_formation: lineupData ? lineupData.homeFormation : '', 3257 away_formation: lineupData ? lineupData.awayFormation : '' 3258 }); 3259 if(lineupData){ 3260 document.getElementById('lineupsCsv').value = lineupsToCSV(lineupData.players); 3261 previewLines.push('Lineups: found '+lineupData.players.length+' players ('+lineupData.homeFormation+' vs '+lineupData.awayFormation+').'); 3262 }else{ 3263 previewLines.push('Lineups: none found in this paste.'); 3264 } 3265 } 3266 previewLines.push('Switched to the CSV tab â review below, then Apply or Download.'); 3267 preview.innerHTML = previewLines.join('<br>'); 3268 preview.style.display = 'block'; 3269 3270 // switch to the CSV tab so they land straight on the editable/downloadable result 3271 // (done manually, not via .click(), so it doesn't re-populate over our converted data) 3272 document.querySelectorAll('#formatToggle [data-mode]').forEach(b=>b.classList.remove('active')); 3273 const csvTabBtn = document.querySelector('#formatToggle [data-mode="csv"]'); 3274 if(csvTabBtn) csvTabBtn.classList.add('active'); 3275 panelMode = 'csv'; 3276 document.getElementById('csvFields').style.display = 'block'; 3277 document.getElementById('jsonFields').style.display = 'none'; 3278 document.getElementById('fotmobFields').style.display = 'none'; 3279 }catch(err){ 3280 errBox.textContent = "Couldn't convert â "+err.message; 3281 errBox.style.display='block'; 3282 } 3283}); 3284 3285function openPanel(){ 3286 document.getElementById('dataJson').value = JSON.stringify(match,null,2); 3287 document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(match)); 3288 document.getElementById('timelineCsv').value = timelineToCSV(match.timeline); 3289 document.getElementById('eventsCsv').value = eventsToCSV(match.events); 3290 document.getElementById('lineupsCsv').value = lineupsToCSV(match.lineup||[]); 3291 document.getElementById('penaltiesCsv').value = penaltiesToCSV(match.penalties||[]); 3292 refreshAudioPicker(); 3293 updateShareLineupWarning(); 3294 overlay.classList.add('show'); panel.classList.add('show'); 3295} 3296function closePanelFn(){ 3297 overlay.classList.remove('show'); 3298 panel.classList.remove('show'); 3299 lineupsPanel.classList.remove('show'); 3300 mapPanel.classList.remove('show'); 3301} 3302 3303/* ---- lineups panel ---- */ 3304const lineupsPanel = document.getElementById('lineupsPanel'); 3305function escapeHtml(s){ return String(s).replace(/[&<>"']/g, c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } 3306function openPhotoLightbox(src, name){ 3307 document.getElementById('photoLightboxImg').src = src; 3308 document.getElementById('photoLightboxCaption').textContent = name || ''; 3309 document.getElementById('photoLightbox').classList.add('show'); 3310} 3311function closePhotoLightbox(){ 3312 document.getElementById('photoLightbox').classList.remove('show'); 3313} 3314function renderPlayerRow(p){ 3315 const photoHtml = p.photo 3316 ? '<img class="lineup-thumb" src="'+escapeHtml(p.photo)+'" onerror="this.style.display=\'none\'" onclick="openPhotoLightbox(this.src, \''+escapeHtml((p.name||'').replace(/'/g,"\\'"))+'\')">' 3317 : '<span class="lineup-thumb lineup-thumb-empty"></span>'; 3318 return '<div class="lineup-player">'+photoHtml+'<span class="num">'+escapeHtml(p.number||'')+'</span>'+ 3319 '<div class="nm-wrap"><span class="nm">'+escapeHtml(p.name||'')+'</span>'+ 3320 '<span class="cl">'+escapeHtml(p.club||'')+(p.age?' · '+escapeHtml(p.age):'')+'</span></div></div>'; 3321} 3322// Fallback for matches with no real possession stat (hand-entered historical 3323// matches like 1966, or any non-FotMob source): every match already has a 3324// momentum/threat timeline, so a rough estimate can be derived by time- 3325// weighting it across the match. This is NOT the same signal as actual 3326// time-of-possession â a team can dominate the ball while creating little 3327// threat (e.g. defensive possession) â so it's deliberately labelled as an 3328// estimate rather than presented as if it were a real sourced stat. 3329function estimatePossessionFromMomentum(timeline){ 3330 if(!timeline || timeline.length<2) return null; 3331 const pts = timeline.slice().sort((a,b)=>a[0]-b[0]); 3332 let weightedSum = 0, totalDuration = 0; 3333 for(let i=0;i<pts.length-1;i++){ 3334 const dt = pts[i+1][0]-pts[i][0]; 3335 if(dt<=0) continue; 3336 const avgVal = (pts[i][1]+pts[i+1][1])/2; // trapezoidal â avoids biasing toward densely-sampled stretches 3337 weightedSum += avgVal*dt; 3338 totalDuration += dt; 3339 } 3340 if(totalDuration<=0) return null; 3341 const avg = Math.max(-1, Math.min(1, weightedSum/totalDuration)); 3342 const home = Math.round(((avg+1)/2)*100); 3343 return { home, away: 100-home, estimated: true }; 3344} 3345function updatePossessionDisplays(){ 3346 const sourced = match.possession && typeof match.possession.home==='number' && typeof match.possession.away==='number'; 3347 const poss = sourced ? { home: match.possession.home, away: match.possession.away, estimated: false } 3348 : estimatePossessionFromMomentum(match.timeline); 3349 const lineupsEl = document.getElementById('lineupsPossession'); 3350 const mainEl = document.getElementById('mainPossessionBar'); 3351 if(!poss){ 3352 lineupsEl.style.display = 'none'; 3353 mainEl.style.display = 'none'; 3354 return; 3355 } 3356 const h = poss.home, a = poss.away; 3357 const label = poss.estimated ? 'OVERALL POSSESSION (EST. FROM MOMENTUM)' : 'OVERALL POSSESSION'; 3358 lineupsEl.style.display = 'block'; 3359 lineupsEl.innerHTML = 3360 '<div style="font-size:11px;letter-spacing:0.04em;color:var(--ink-dim);margin-bottom:8px;">'+label+'</div>'+ 3361 '<div style="display:flex;justify-content:space-between;font-size:14px;font-weight:700;margin-bottom:6px;">'+ 3362 '<span>'+h+'%</span><span>'+a+'%</span></div>'+ 3363 '<div style="height:8px;border-radius:4px;overflow:hidden;background:var(--panel-2);border:1px solid var(--border);display:flex;">'+ 3364 '<div style="width:'+h+'%;background:'+(match.home.color||'#2451e0')+';"></div>'+ 3365 '<div style="width:'+a+'%;background:'+(match.away.color||'#ffffff')+';"></div>'+ 3366 '</div>'+ 3367 (poss.estimated ? '<div class="hint" style="margin-top:6px;">Estimated from the attacking-threat timeline, not a real recorded stat â a team can hold the ball without creating threat, so treat this as a rough indicator rather than an official possession figure. Add possession_home/possession_away to the Meta CSV (or use the Import tab) to show a real sourced value instead.</div>' : ''); 3368 mainEl.style.display = 'block'; 3369 document.getElementById('mainPossessionLabel').textContent = poss.estimated ? 'OVERALL POSSESSION (EST.)' : 'OVERALL POSSESSION'; 3370 document.getElementById('mainPossessionHomeFill').style.cssText = 'width:'+h+'%;background:'+(match.home.color||'#2451e0')+';'+(poss.estimated?'opacity:0.75;':''); 3371 document.getElementById('mainPossessionAwayFill').style.cssText = 'width:'+a+'%;background:'+(match.away.color||'#ffffff')+';'+(poss.estimated?'opacity:0.75;':''); 3372 document.getElementById('mainPossessionHomePct').textContent = h+'%'+(poss.estimated?'*':''); 3373 document.getElementById('mainPossessionAwayPct').textContent = a+'%'+(poss.estimated?'*':''); 3374} 3375function renderLineups(){ 3376 updatePossessionDisplays(); 3377 const lineup = match.lineup || []; 3378 const empty = document.getElementById('lineupsEmpty'); 3379 const content = document.getElementById('lineupsContent'); 3380 if(!lineup.length){ 3381 empty.style.display = 'block'; content.style.display = 'none'; 3382 return; 3383 } 3384 empty.style.display = 'none'; content.style.display = 'block'; 3385 const homeFlagImg = match.homeFlag ? '<img class="lineups-flag" src="'+flagUrl(match.homeFlag)+'" onerror="this.style.display=\'none\'">' : ''; 3386 const awayFlagImg = match.awayFlag ? '<img class="lineups-flag" src="'+flagUrl(match.awayFlag)+'" onerror="this.style.display=\'none\'">' : ''; 3387 document.getElementById('lineupsHomeHead').innerHTML = homeFlagImg+escapeHtml(match.home.name)+(match.homeFormation?'<div class="lineups-formation">'+escapeHtml(match.homeFormation)+'</div>':''); 3388 document.getElementById('lineupsAwayHead').innerHTML = awayFlagImg+escapeHtml(match.away.name)+(match.awayFormation?'<div class="lineups-formation">'+escapeHtml(match.awayFormation)+'</div>':''); 3389 const by = (team,role) => lineup.filter(p=>p.team===team && p.role===role); 3390 document.getElementById('lineupsHomeStarters').innerHTML = by('home','starter').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>'; 3391 document.getElementById('lineupsHomeSubs').innerHTML = by('home','sub').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>'; 3392 document.getElementById('lineupsAwayStarters').innerHTML = by('away','starter').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>'; 3393 document.getElementById('lineupsAwaySubs').innerHTML = by('away','sub').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>'; 3394} 3395document.getElementById('lineupsBtn').addEventListener('click', ()=>{ 3396 renderLineups(); 3397 overlay.classList.add('show'); 3398 lineupsPanel.classList.add('show'); 3399}); 3400document.getElementById('closeLineups').addEventListener('click', ()=>{ 3401 overlay.classList.remove('show'); 3402 lineupsPanel.classList.remove('show'); 3403}); 3404 3405/* ---- venue map panel ---- */ 3406const mapPanel = document.getElementById('mapPanel'); 3407function renderMap(){ 3408 const empty = document.getElementById('mapEmpty'); 3409 const content = document.getElementById('mapContent'); 3410 const lat = parseFloat(match.venueLat), lon = parseFloat(match.venueLong); 3411 if(isNaN(lat) || isNaN(lon)){ 3412 empty.style.display = 'block'; content.style.display = 'none'; 3413 document.getElementById('venueMapThumb').style.display = 'none'; 3414 return; 3415 } 3416 empty.style.display = 'none'; content.style.display = 'block'; 3417 document.getElementById('mapVenueName').textContent = match.venue || ''; 3418 const d = 0.01; // small bounding box around the point 3419 const bbox = (lon-d)+','+(lat-d)+','+(lon+d)+','+(lat+d); 3420 const mapUrl = 'https://www.openstreetmap.org/export/embed.html?bbox='+bbox+'&layer=mapnik&marker='+lat+','+lon; 3421 document.getElementById('mapFrame').src = mapUrl; 3422 document.getElementById('venueMapThumbFrame').src = mapUrl; 3423 document.getElementById('venueMapThumb').style.display = 'block'; 3424} 3425/* Keeps --header-h (used by #scorebug/#ticker/#goalFlash/the expanded venue 3426 map to position themselves) matched to the header's real rendered height, 3427 which varies with wrapped venue text, wrapped buttons, and font loading â 3428 a hardcoded pixel offset previously caused these to overlap the header on 3429 narrow screens or long venue names. */ 3430function syncHeaderHeight(){ 3431 const header = document.getElementById('header'); 3432 if(!header) return; 3433 document.documentElement.style.setProperty('--header-h', header.getBoundingClientRect().height+'px'); 3434} 3435if('ResizeObserver' in window){ 3436 new ResizeObserver(syncHeaderHeight).observe(document.getElementById('header')); 3437} 3438window.addEventListener('resize', syncHeaderHeight); 3439if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncHeaderHeight); 3440syncHeaderHeight(); 3441 3442/* Same pattern as syncHeaderHeight, but for the transport bar at the bottom â
3443 #chartPanel sits above it via --transport-h so wrapped chip buttons or a 3444 wider time readout can never push the transport tall enough to clip the 3445 possession chart. */ 3446function syncTransportHeight(){ 3447 const transport = document.getElementById('transport'); 3448 if(!transport) return; 3449 document.documentElement.style.setProperty('--transport-h', transport.getBoundingClientRect().height+'px'); 3450} 3451if('ResizeObserver' in window){ 3452 new ResizeObserver(syncTransportHeight).observe(document.getElementById('transport')); 3453} 3454window.addEventListener('resize', syncTransportHeight); 3455if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncTransportHeight); 3456syncTransportHeight(); 3457 3458/* Same pattern again for the scorebug â the possession bar sits just below 3459 it via --scorebug-h so a taller scorebug (flags shown, wrapped text) can't 3460 overlap the bar. */ 3461function syncScorebugHeight(){ 3462 const scorebug = document.getElementById('scorebug'); 3463 if(!scorebug) return; 3464 const rect = scorebug.getBoundingClientRect(); 3465 document.documentElement.style.setProperty('--scorebug-h', rect.height+'px'); 3466 // The goal/penalty flash popup used to sit at a fixed guessed offset below 3467 // the header, which broke on mobile once the scorebug wraps team names to 3468 // two lines (making the whole header area taller than the guess assumed) â 3469 // it ended up overlapping the possession bar instead of sitting below it. 3470 // Measuring the possession bar's own real position (or falling back to 3471 // just below the scorebug if it isn't showing) fixes this the same way 3472 // --header-h/--transport-h/--scorebug-h already do for other elements. 3473 const goalFlash = document.getElementById('goalFlash'); 3474 if(goalFlash){ 3475 const possessionBar = document.getElementById('mainPossessionBar'); 3476 let flashTop; 3477 if(possessionBar && possessionBar.style.display !== 'none'){ 3478 const pRect = possessionBar.getBoundingClientRect(); 3479 flashTop = pRect.bottom + 14; 3480 }else{ 3481 flashTop = rect.bottom + 14; 3482 } 3483 goalFlash.style.top = flashTop+'px'; 3484 } 3485 const midY = rect.top + rect.height/2; 3486 const BADGE_SIZE = 34, BADGE_GAP = 10, DOT_GAP = 14; 3487 // Penalty-count badges sit immediately beside the scorebug (same vertical 3488 // centre as the score numbers) â the dots then sit further out beyond 3489 // them, since the badge is the "headline" number and the dots are the 3490 // finer detail. 3491 const penCountHome = document.getElementById('penCountHome'); 3492 const penCountAway = document.getElementById('penCountAway'); 3493 if(penCountHome && penCountAway){ 3494 penCountHome.style.top = midY+'px'; 3495 penCountHome.style.transform = 'translateY(-50%)'; 3496 penCountHome.style.right = (window.innerWidth - rect.left + BADGE_GAP)+'px'; 3497 penCountAway.style.top = midY+'px'; 3498 penCountAway.style.transform = 'translateY(-50%)'; 3499 penCountAway.style.left = (rect.right + BADGE_GAP)+'px'; 3500 } 3501 // Goal-tick dots sit beside the scorebug rather than stacked underneath it 3502 // (which used to collide with the possession bar) â positioned off the 3503 // scorebug's real measured edges rather than a guessed offset, same reason 3504 // as --header-h/--transport-h/--scorebug-h itself. Pushed out further when 3505 // the penalty badges are showing, so they never overlap. 3506 const tickHome = document.getElementById('tickHome'); 3507 const tickAway = document.getElementById('tickAway'); 3508 const badgesShowing = penCountHome && penCountHome.style.display === 'flex'; 3509 const dotOffset = DOT_GAP + (badgesShowing ? BADGE_SIZE + BADGE_GAP : 0); 3510 if(tickHome && tickAway){ 3511 tickHome.style.top = midY+'px'; 3512 tickHome.style.transform = 'translateY(-50%)'; 3513 tickHome.style.right = (window.innerWidth - rect.left + dotOffset)+'px'; 3514 tickAway.style.top = midY+'px'; 3515 tickAway.style.transform = 'translateY(-50%)'; 3516 tickAway.style.left = (rect.right + dotOffset)+'px'; 3517 } 3518} 3519if('ResizeObserver' in window){ 3520 new ResizeObserver(syncScorebugHeight).observe(document.getElementById('scorebug')); 3521} 3522window.addEventListener('resize', syncScorebugHeight); 3523if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncScorebugHeight); 3524syncScorebugHeight(); 3525 3526let venueMapAutoCloseTimer = null; 3527function openVenueMap(){ 3528 document.getElementById('header').classList.add('mapOpen'); 3529 document.getElementById('venueMapThumb').classList.add('expanded'); 3530 clearTimeout(venueMapAutoCloseTimer); 3531 venueMapAutoCloseTimer = setTimeout(closeVenueMap, 15000); 3532} 3533function closeVenueMap(){
3534 document.getElementById('header').classList.remove('mapOpen'); 3535 document.getElementById('venueMapThumb').classList.remove('expanded'); 3536 clearTimeout(venueMapAutoCloseTimer); 3537 venueMapAutoCloseTimer = null; 3538} 3539document.getElementById('venueMapIcon').addEventListener('click', openVenueMap); 3540document.getElementById('venueMapCloseBtn').addEventListener('click', (ev)=>{ 3541 ev.stopPropagation(); 3542 closeVenueMap(); 3543}); 3544document.addEventListener('pointerdown', (ev)=>{ 3545 const thumb = document.getElementById('venueMapThumb'); 3546 if(thumb.classList.contains('expanded') && !thumb.contains(ev.target)) closeVenueMap(); 3547}); 3548document.getElementById('closeMap').addEventListener('click', ()=>{ 3549 overlay.classList.remove('show'); 3550 mapPanel.classList.remove('show'); 3551}); 3552document.getElementById('dataBtn').addEventListener('click', openPanel); 3553document.getElementById('closePanel').addEventListener('click', closePanelFn); 3554overlay.addEventListener('click', closePanelFn); 3555 3556/* ---- upload / download for CSV & JSON fields ---- */ 3557function downloadTextFile(filename, mimeType, text){ 3558 // Excel doesn't reliably honour the charset in a Blob's MIME type â without a UTF-8 3559 // byte-order-mark at the start of the file, it guesses Windows-1252 and mangles 3560 // accented characters (é â é, · â ÷, etc). The BOM fixes that for CSV specifically; 3561 // JSON viewers don't have this problem so it's only added for .csv files. 3562 const isCSV = /\.csv$/i.test(filename) || mimeType.indexOf('csv')>-1; 3563 const content = isCSV ? '\uFEFF'+text : text; 3564 const blob = new Blob([content], {type: mimeType+';charset=utf-8'}); 3565 const url = URL.createObjectURL(blob); 3566 const a = document.createElement('a'); 3567 a.href = url; a.download = filename; 3568 document.body.appendChild(a); a.click(); document.body.removeChild(a); 3569 setTimeout(()=>URL.revokeObjectURL(url), 1000); 3570} 3571function wireUpload(buttonId, inputId, textareaId){ 3572 const btn = document.getElementById(buttonId); 3573 const input = document.getElementById(inputId); 3574 btn.addEventListener('click', ()=> input.click()); 3575 input.addEventListener('change', ()=>{ 3576 const file = input.files[0]; 3577 if(!file) return; 3578 const reader = new FileReader(); 3579 reader.onload = ()=>{ document.getElementById(textareaId).value = reader.result; }; 3580 reader.onerror = ()=>{ 3581 document.getElementById('errBox').textContent = "Couldn't read that file â "+reader.error; 3582 document.getElementById('errBox').style.display='block'; 3583 }; 3584 reader.readAsText(file); 3585 input.value = ''; // allow re-uploading the same filename later 3586 }); 3587} 3588wireUpload('uploadJsonBtn','uploadJsonInput','dataJson'); 3589 3590// single CSV upload â detects timeline vs events from the header row rather than 3591// making the user pick the right one of two separate upload buttons 3592document.getElementById('uploadCsvBtn').addEventListener('click', ()=> document.getElementById('uploadCsvInput').click()); 3593document.getElementById('uploadCsvInput').addEventListener('change', ()=>{ 3594 const input = document.getElementById('uploadCsvInput'); 3595 const status = document.getElementById('csvUploadStatus'); 3596 const errBox = document.getElementById('errBox'); 3597 const file = input.files[0]; 3598 if(!file) return; 3599 const reader = new FileReader(); 3600 reader.onload = ()=>{ 3601 const text = reader.result; 3602 const firstLine = text.split(/\r?\n/)[0].toLowerCase(); 3603 errBox.style.display='none'; status.style.display='none'; 3604 if(firstLine.startsWith('section,minute,value,team,label,photo,key,keyvalue')){ 3605 const parts = csvToCombined(text); 3606 document.getElementById('metaCsv').value = metaToCSV(parts.meta); 3607 document.getElementById('timelineCsv').value = timelineToCSV(parts.timeline); 3608 document.getElementById('eventsCsv').value = eventsToCSV(parts.events); 3609 document.getElementById('lineupsCsv').value = lineupsToCSV(parts.lineup); 3610 document.getElementById('penaltiesCsv').value = penaltiesToCSV(parts.penalties); 3611 pendingAmbientWindows = parts.ambientWindows || []; 3612 refreshAudioPicker(); 3613 // A combined CSV is a complete match, meant to fully replace whatever's 3614 // currently loaded â so this applies immediately rather than requiring 3615 // a separate Apply Data click, which was silently leaving the upload 3616 // sitting unapplied (this is exactly what happened: the status message 3617 // confirmed 125 timeline points etc. loaded, but nothing on screen
3618 // actually changed until Apply Data was clicked separately). 3619 document.getElementById('applyData').click(); 3620 status.textContent = '"'+file.name+'" loaded and applied â match info, '+parts.timeline.length+' timeline points, '+parts.events.length+' event(s), '+parts.lineup.length+' lineup player(s), '+pendingAmbientWindows.length+' ambient window(s)'+(parts.penalties.length?', and '+parts.penalties.length+' penalty kick(s)':'')+'.'; 3621 status.style.display='block'; 3622 }else if(firstLine.startsWith('key,value')){ 3623 document.getElementById('metaCsv').value = text; 3624 status.textContent = '"'+file.name+'" detected as a Match Info CSV (header: key,value) and loaded above.'; 3625 status.style.display='block'; 3626 }else if(firstLine.startsWith('team,role,number')){ 3627 document.getElementById('lineupsCsv').value = text; 3628 status.textContent = '"'+file.name+'" detected as a Lineups CSV and loaded above.'; 3629 status.style.display='block'; 3630 }else if(firstLine.startsWith('minute,value')){ 3631 document.getElementById('timelineCsv').value = text; 3632 status.textContent = '"'+file.name+'" detected as a Timeline CSV (header: minute,value) and loaded above.'; 3633 status.style.display='block'; 3634 }else if(firstLine.startsWith('minute,team')){ 3635 document.getElementById('eventsCsv').value = text; 3636 status.textContent = '"'+file.name+'" detected as an Events CSV (header: minute,team,...) and loaded above.'; 3637 status.style.display='block'; 3638 }else{ 3639 errBox.textContent = "Couldn't tell what kind of CSV \""+file.name+"\" is â its first line should start with \"section,minute,...\" (combined), \"key,value\", \"team,role,number\" (lineups), \"minute,value\", or \"minute,team\"."; 3640 errBox.style.display='block'; 3641 } 3642 }; 3643 reader.onerror = ()=>{ 3644 errBox.textContent = "Couldn't read that file â "+reader.error; 3645 errBox.style.display='block'; 3646 }; 3647 reader.readAsText(file); 3648 input.value = ''; 3649}); 3650 3651document.getElementById('downloadLineupsBtn').addEventListener('click', ()=>{ 3652 downloadTextFile('lineups.csv', 'text/csv', document.getElementById('lineupsCsv').value); 3653}); 3654document.getElementById('fetchWikiBtn').addEventListener('click', async ()=>{ 3655 const btn = document.getElementById('fetchWikiBtn'); 3656 const status = document.getElementById('wikiFetchStatus'); 3657 const errBox = document.getElementById('errBox'); 3658 errBox.style.display = 'none'; 3659 const events = csvToEvents(document.getElementById('eventsCsv').value); 3660 const lineup = csvToLineups(document.getElementById('lineupsCsv').value); 3661 const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value); 3662 3663 // collect unique names that still need a photo 3664 const namesNeeded = new Set(); 3665 events.forEach(e=>{ if(!e.photo){ const n=(e.label||'').split('·')[0].trim(); if(n) namesNeeded.add(n); } }); 3666 lineup.forEach(p=>{ if(!p.photo && p.name) namesNeeded.add(p.name); }); 3667 penalties.forEach(p=>{ if(!p.photo && p.taker) namesNeeded.add(p.taker); }); 3668 3669 const names = Array.from(namesNeeded); 3670 if(names.length===0){ 3671 status.textContent = 'Every row already has a photo (or there are no events/lineup rows loaded yet), and both flag/crest fields already have something in them.'; 3672 status.style.display = 'block'; 3673 return; 3674 } 3675 3676 btn.disabled = true; btn.textContent = 'ð¼ Fetching 0/'+names.length+'...'; 3677 const found = {}; // name -> url or null 3678 let done = 0; 3679 const BATCH = 5; 3680 for(let i=0;i<names.length;i+=BATCH){ 3681 const batch = names.slice(i, i+BATCH); 3682 const results = await Promise.all(batch.map(n=>fetchWikipediaThumbnail(n))); 3683 batch.forEach((n,idx)=>{ found[n]=results[idx]; }); 3684 done += batch.length; 3685 btn.textContent = 'ð¼ Fetching '+Math.min(done,names.length)+'/'+names.length+'...'; 3686 } 3687 3688 let filled = 0; 3689 events.forEach(e=>{ 3690 if(!e.photo){ 3691 const n = (e.label||'').split('·')[0].trim(); 3692 if(n && found[n]){ e.photo = found[n]; filled++; } 3693 } 3694 }); 3695 let filledLineup = 0; 3696 lineup.forEach(p=>{ 3697 if(!p.photo && p.name && found[p.name]){ p.photo = found[p.name]; filledLineup++; } 3698 }); 3699 let filledPenalties = 0;
3700 penalties.forEach(p=>{ 3701 if(!p.photo && p.taker && found[p.taker]){ p.photo = found[p.taker]; filledPenalties++; } 3702 }); 3703 3704 document.getElementById('eventsCsv').value = eventsToCSV(events); 3705 document.getElementById('lineupsCsv').value = lineupsToCSV(lineup); 3706 document.getElementById('penaltiesCsv').value = penaltiesToCSV(penalties); 3707 refreshAudioPicker(); 3708 3709 // Without this, the fetched photos (and anything else edited in the CSV 3710 // fields above â venue, competition, formations, etc.) only exist in the 3711 // textareas â the live match object (which is what the 3D lineups panel, 3712 // downloads, and share links all actually read from) never sees them until 3713 // something commits the textareas. A full Apply Data click closes that gap 3714 // but is far too disruptive for what's really just "commit the current CSV 3715 // state" â it resets the playback clock and, critically, closes the entire 3716 // panel (closePanelFn runs unconditionally at the end of Apply Data), which 3717 // meant the results status below was set on an already-hidden panel and 3718 // never seen, and any other pending edits (e.g. venue) got committed here 3719 // too but then silently lost if a narrower fix only touched events/lineup. 3720 // buildParsedMatchFromCsvInputs() is the exact same parsing Apply Data uses, 3721 // so nothing edited in this tab is left behind â just without resetting the 3722 // clock or closing the panel. 3723 try{ 3724 match = buildParsedMatchFromCsvInputs(); 3725 sampleValue = makeCombinedSampler(match); 3726 homeRgb = hexToRgb01(match.home.color); 3727 awayRgb = hexToRgb01(match.away.color); 3728 document.getElementById('metaLine').textContent = (match.competition||"")+" · "+(match.date||"")+(match.venue?" · "+match.venue:""); 3729 document.getElementById('swatchHome').style.background = match.home.color; 3730 document.getElementById('swatchAway').style.background = match.away.color; 3731 updateFlags(); 3732 renderMap(); 3733 document.getElementById('nameHome').textContent = (match.home.name||"HOME").toUpperCase(); 3734 document.getElementById('nameAway').textContent = (match.away.name||"AWAY").toUpperCase(); 3735 document.getElementById('shareHomeFill').style.background = match.home.color; 3736 document.getElementById('shareAwayFill').style.background = match.away.color; 3737 rebuildTicker(); 3738 updatePossessionDisplays(); 3739 syncAll(); 3740 }catch(commitErr){ 3741 errBox.textContent = "Photos were fetched into the CSV boxes above, but couldn't commit to the live match: "+commitErr.message+" â fix that and click Apply Data manually."; 3742 errBox.style.display = 'block'; 3743 } 3744 3745 btn.disabled = false; btn.textContent = 'ð¼ Wikipedia photos'; 3746 const notFound = names.length - Object.values(found).filter(Boolean).length; 3747 status.textContent = 'Found '+Object.values(found).filter(Boolean).length+' of '+names.length+' names on Wikipedia ('+filled+' event photo(s), '+filledLineup+' lineup photo(s), '+filledPenalties+' penalty photo(s) filled in). '+ 3748 (notFound>0 ? notFound+' had no matching page/photo and are still blank â add those manually if needed.' : '')+ 3749 ' â These photos only exist in this browser tab for now â Download or create a Share link below to keep them, or they will be gone if you reload this page or come back to the original file later.'; 3750 status.style.display = 'block'; 3751}); 3752document.getElementById('downloadCombinedBtn').addEventListener('click', ()=>{ 3753 const meta = csvToMeta(document.getElementById('metaCsv').value); 3754 const timeline = csvToTimeline(document.getElementById('timelineCsv').value); 3755 const events = csvToEvents(document.getElementById('eventsCsv').value); 3756 const lineup = csvToLineups(document.getElementById('lineupsCsv').value); 3757 const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value); 3758 downloadTextFile('match-combined.csv', 'text/csv', combinedToCSV(meta, timeline, events, lineup, pendingAmbientWindows, penalties)); 3759}); 3760document.getElementById('downloadPenaltiesBtn').addEventListener('click', ()=>{ 3761 downloadTextFile('penalties.csv', 'text/csv', document.getElementById('penaltiesCsv').value); 3762}); 3763document.getElementById('downloadMetaBtn').addEventListener('click', ()=>{ 3764 downloadTextFile('match-info.csv', 'text/csv', document.getElementById('metaCsv').value); 3765}); 3766document.getElementById('downloadTimelineBtn').addEventListener('click', ()=>{ 3767 downloadTextFile('timeline.csv', 'text/csv', document.getElementById('timelineCsv').value); 3768}); 3769document.getElementById('downloadEventsBtn').addEventListener('click', ()=>{ 3770 downloadTextFile('events.csv', 'text/csv', document.getElementById('eventsCsv').value); 3771}); 3772document.getElementById('downloadJsonBtn').addEventListener('click', ()=>{ 3773 downloadTextFile('match.json', 'application/json', document.getElementById('dataJson').value); 3774}); 3775 3776document.getElementById('resetSample').addEventListener('click', ()=>{ 3777 document.getElementById('dataJson').value = JSON.stringify(SAMPLE,null,2); 3778 document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(SAMPLE)); 3779 document.getElementById('timelineCsv').value = timelineToCSV(SAMPLE.timeline); 3780 document.getElementById('eventsCsv').value = eventsToCSV(SAMPLE.events); 3781 document.getElementById('lineupsCsv').value = lineupsToCSV(SAMPLE.lineup||[]);
3782 document.getElementById('penaltiesCsv').value = penaltiesToCSV(SAMPLE.penalties||[]); 3783 refreshAudioPicker(); 3784}); 3785 3786function buildParsedMatchFromCsvInputs(){ 3787 const timeline = csvToTimeline(document.getElementById('timelineCsv').value); 3788 const events = csvToEvents(document.getElementById('eventsCsv').value); 3789 if(timeline.length<2) throw new Error("Timeline CSV needs a header row plus at least 2 data rows (minute,value)."); 3790 if(events.length<1) throw new Error("Events CSV needs a header row plus at least 1 goal (minute,team,label), team must be 'home' or 'away'."); 3791 3792 // meta CSV is the primary source of match info in CSV mode; fields left blank in it 3793 // fall back to whatever's currently in the name/colour/date inputs above 3794 const meta = csvToMeta(document.getElementById('metaCsv').value); 3795 const pick = (k, fallback) => (meta[k]!==undefined && meta[k]!=='') ? meta[k] : fallback; 3796 const homeName = pick('home_name', document.getElementById('inHomeName').value || "Home"); 3797 const homeColor = pick('home_color', document.getElementById('inHomeColor').value); 3798 const awayName = pick('away_name', document.getElementById('inAwayName').value || "Away"); 3799 const awayColor = pick('away_color', document.getElementById('inAwayColor').value); 3800 const competition = pick('competition', document.getElementById('inComp').value); 3801 const date = pick('date', document.getElementById('inDate').value); 3802 const venue = pick('venue', document.getElementById('inVenue').value); 3803 const venueLatRaw = pick('venue_lat', match.venueLat!==undefined ? match.venueLat : ''); 3804 const venueLongRaw = pick('venue_long', match.venueLong!==undefined ? match.venueLong : ''); 3805 const venueLat = venueLatRaw!=='' && !isNaN(parseFloat(venueLatRaw)) ? parseFloat(venueLatRaw) : undefined; 3806 const venueLong = venueLongRaw!=='' && !isNaN(parseFloat(venueLongRaw)) ? parseFloat(venueLongRaw) : undefined; 3807 const homeFormation = pick('home_formation', match.homeFormation||''); 3808 const awayFormation = pick('away_formation', match.awayFormation||''); 3809 const homeFlag = pick('home_flag', resolveFlagCode(document.getElementById('inHomeFlag').value)); 3810 const awayFlag = pick('away_flag', resolveFlagCode(document.getElementById('inAwayFlag').value)); 3811 const ambientAudio = pick('ambient_audio', match.ambientAudio||''); 3812 const kickoffAudio = pick('kickoff_audio', match.kickoffAudio||''); 3813 const endOfNormalTimeAudio = pick('end_of_normal_time_audio', match.endOfNormalTimeAudio||''); 3814 const extraTimeAudio = pick('extra_time_audio', match.extraTimeAudio||''); 3815 const hasExtraTime = pick('has_extra_time', document.getElementById('inHasExtraTime').checked ? '1' : '') === '1'; 3816 const maxMinuteRaw = pick('max_minute', pendingMaxMinuteOverride!==undefined ? String(pendingMaxMinuteOverride) : ''); 3817 const maxMinuteOverride = maxMinuteRaw!=='' && !isNaN(parseFloat(maxMinuteRaw)) ? parseFloat(maxMinuteRaw) : undefined; 3818 const goalCelebrationAudio = pick('goal_celebration_audio', match.goalCelebrationAudio||''); 3819 const goalCelebrationMinuteRaw = pick('goal_celebration_minute', match.goalCelebrationMinute!==undefined ? match.goalCelebrationMinute : ''); 3820 const goalCelebrationMinute = goalCelebrationMinuteRaw!=='' && !isNaN(parseFloat(goalCelebrationMinuteRaw)) ? parseFloat(goalCelebrationMinuteRaw) : undefined; 3821 const possessionHomeRaw = pick('possession_home', pendingPossessionOverride!==undefined ? String(pendingPossessionOverride.home) : (match.possession ? String(match.possession.home) : '')); 3822 const possessionAwayRaw = pick('possession_away', pendingPossessionOverride!==undefined ? String(pendingPossessionOverride.away) : (match.possession ? String(match.possession.away) : '')); 3823 const possession = (possessionHomeRaw!=='' && possessionAwayRaw!=='' && !isNaN(parseFloat(possessionHomeRaw)) && !isNaN(parseFloat(possessionAwayRaw))) 3824 ? { home: parseFloat(possessionHomeRaw), away: parseFloat(possessionAwayRaw) } : undefined; 3825 // variable-count ambient variety clips: any meta key matching home_variety_audio_N / away_variety_audio_N 3826 const homeVarietyAudio = [], awayVarietyAudio = [];
3827 Object.keys(meta).forEach(k=>{ 3828 if(/^home_variety_audio_\d+$/.test(k) && meta[k]) homeVarietyAudio.push(meta[k]); 3829 if(/^away_variety_audio_\d+$/.test(k) && meta[k]) awayVarietyAudio.push(meta[k]); 3830 }); 3831 const lineup = csvToLineups(document.getElementById('lineupsCsv').value); 3832 const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value); 3833 const penaltyScoredAudio = pick('penalty_scored_audio', match.penaltyScoredAudio||''); 3834 const penaltyMissedAudio = pick('penalty_missed_audio', match.penaltyMissedAudio||''); 3835 // keep the individual fields in sync with whatever the meta CSV specified 3836 document.getElementById('inHomeName').value = homeName; 3837 document.getElementById('inHomeColor').value = homeColor; 3838 document.getElementById('inAwayName').value = awayName; 3839 document.getElementById('inAwayColor').value = awayColor; 3840 document.getElementById('inComp').value = competition; 3841 document.getElementById('inDate').value = date; 3842 document.getElementById('inVenue').value = venue; 3843 document.getElementById('inHomeFlag').value = flagCodeToDisplayName(homeFlag); 3844 document.getElementById('inAwayFlag').value = flagCodeToDisplayName(awayFlag); 3845 document.getElementById('inHasExtraTime').checked = hasExtraTime; 3846 3847 const parsed = { 3848 home:{ name: homeName, color: homeColor }, 3849 away:{ name: awayName, color: awayColor }, 3850 competition, date, venue, venueLat, venueLong, 3851 homeFormation, awayFormation, homeFlag, awayFlag, ambientAudio, 3852 kickoffAudio, endOfNormalTimeAudio, extraTimeAudio, hasExtraTime, goalCelebrationAudio, goalCelebrationMinute, 3853 penaltyScoredAudio, penaltyMissedAudio, 3854 maxMinute: maxMinuteOverride, 3855 possession, 3856 ambientWindows: pendingAmbientWindows, 3857 homeVarietyAudio, awayVarietyAudio, lineup, penalties, 3858 timeline, events 3859 }; 3860 pendingMaxMinuteOverride = undefined; 3861 pendingPossessionOverride = undefined; 3862 return parsed; 3863} 3864document.getElementById('applyData').addEventListener('click', ()=>{ 3865 const errBox = document.getElementById('errBox'); 3866 errBox.style.display='none'; 3867 try{ 3868 let parsed; 3869 if(panelMode==='csv'){ 3870 parsed = buildParsedMatchFromCsvInputs(); 3871 }else{ 3872 parsed = JSON.parse(document.getElementById('dataJson').value); 3873 if(!parsed.timeline || !Array.isArray(parsed.timeline)) throw new Error("Missing 'timeline' array of [minute, value] pairs."); 3874 if(!parsed.events || !Array.isArray(parsed.events)) throw new Error("Missing 'events' array."); 3875 } 3876 if(!parsed.maxMinute){ 3877 const timelineMax = parsed.timeline.length ? Math.max(...parsed.timeline.map(p=>p[0])) : 0; 3878 const eventsMax = (parsed.events && parsed.events.length) ? Math.max(...parsed.events.map(e=>e.minute)) : 0; 3879 const ambientMax = (parsed.ambientWindows && parsed.ambientWindows.length) ? Math.max(...parsed.ambientWindows.map(w=>w.end)) : 0; 3880 // Whichever source reflects the latest minute wins â a stoppage-time goal 3881 // (FotMob's overloadTime is already folded into event.minute) or a longer 3882 // ambient window can extend past what the momentum timeline itself covers, 3883 // and the match's true duration should never be clipped to just one of these. 3884 parsed.maxMinute = Math.max(timelineMax, eventsMax, ambientMax); 3885 } 3886 parsed.home = parsed.home || {name:"Home", color:"#2451e0"}; 3887 parsed.away = parsed.away || {name:"Away", color:"#ffffff"}; 3888 3889 match = parsed; 3890 sampleValue = makeCombinedSampler(match); 3891 homeRgb = hexToRgb01(match.home.color); 3892 awayRgb = hexToRgb01(match.away.color); 3893 seenEvents.clear(); 3894 seenPenalties.clear(); 3895 currentMinute = 0; clockT = 0; pause(); 3896 playedKickoffStinger = false; 3897 playedExtraTimeStinger = false; 3898 playedShootoutIntro = false; 3899 playedHighlights.clear(); 3900 clockSlowLocked = false; 3901 homeDominanceAccum = 0; awayDominanceAccum = 0; ambientVarietyCooldownUntil = 0; 3902 activeAmbientWindow = null; activeAmbientWindowPlayer = null; activeAmbientWindowPlayer2 = null; 3903 ambientClipCache.forEach(bySlot=>{ Object.values(bySlot).forEach(el=>{ try{ el.pause(); }catch(e){} }); }); 3904 ambientClipCache.clear(); 3905 3906 document.getElementById('metaLine').textContent = (match.competition||"")+" · "+(match.date||"")+(match.venue?" · "+match.venue:""); 3907 document.getElementById('swatchHome').style.background = match.home.color; 3908 document.getElementById('swatchAway').style.background = match.away.color; 3909 updateFlags(); 3910 renderMap(); 3911 document.getElementById('nameHome').textContent = (match.home.name||"HOME").toUpperCase(); 3912 document.getElementById('nameAway').textContent = (match.away.name||"AWAY").toUpperCase(); 3913 document.getElementById('shareHomeFill').style.background = match.home.color; 3914 document.getElementById('shareAwayFill').style.background = match.away.color; 3915 // Previously only the CSV apply path synced these â meaning any JSON-path 3916 // apply (which is every shared-link load, since loadParsedMatchViaJsonPath 3917 // always goes through JSON) left the individual fields showing whatever 3918 // match was loaded *before*, even though match itself, the JSON textarea,
3919 // and the actual visualisation were all already correctly updated. 3920 document.getElementById('inHomeName').value = match.home.name || ''; 3921 document.getElementById('inHomeColor').value = match.home.color || ''; 3922 document.getElementById('inAwayName').value = match.away.name || ''; 3923 document.getElementById('inAwayColor').value = match.away.color || ''; 3924 document.getElementById('inComp').value = match.competition || ''; 3925 document.getElementById('inDate').value = match.date || ''; 3926 document.getElementById('inVenue').value = match.venue || ''; 3927 document.getElementById('inHomeFlag').value = flagCodeToDisplayName(match.homeFlag || ''); 3928 document.getElementById('inAwayFlag').value = flagCodeToDisplayName(match.awayFlag || ''); 3929 document.getElementById('inHasExtraTime').checked = !!match.hasExtraTime; 3930 3931 rebuildTicker(); 3932 updatePossessionDisplays(); 3933 syncAll(); 3934 closePanelFn(); 3935 }catch(err){ 3936 errBox.textContent = "Couldn't load data â "+err.message; 3937 errBox.style.display='block'; 3938 } 3939}); 3940 3941/* keep the simple name/color inputs in sync with JSON for convenience */ 3942['inHomeName','inHomeColor','inAwayName','inAwayColor','inComp','inDate','inVenue','inHomeFlag','inAwayFlag'].forEach(id=>{ 3943 document.getElementById(id).addEventListener('change', ()=>{ 3944 try{ 3945 const parsed = JSON.parse(document.getElementById('dataJson').value); 3946 parsed.home = parsed.home||{}; parsed.away = parsed.away||{}; 3947 parsed.home.name = document.getElementById('inHomeName').value; 3948 parsed.home.color = document.getElementById('inHomeColor').value; 3949 parsed.away.name = document.getElementById('inAwayName').value; 3950 parsed.away.color = document.getElementById('inAwayColor').value; 3951 parsed.competition = document.getElementById('inComp').value; 3952 parsed.date = document.getElementById('inDate').value; 3953 parsed.venue = document.getElementById('inVenue').value; 3954 parsed.homeFlag = resolveFlagCode(document.getElementById('inHomeFlag').value); 3955 parsed.awayFlag = resolveFlagCode(document.getElementById('inAwayFlag').value); 3956 document.getElementById('dataJson').value = JSON.stringify(parsed,null,2); 3957 }catch(e){} 3958 // This used to only update the JSON preview above â meta CSV (which 3959 // Apply Data's CSV path actually reads from, prioritised over this field) 3960 // never got the fresh value, so if metaCsv already had *any* value for 3961 // this key from a previous load, typing a new one here was silently 3962 // discarded the moment Apply Data ran. Keeping both representations in 3963 // sync means it no longer matters which one was most recently edited. 3964 try{ 3965 const metaBox = document.getElementById('metaCsv'); 3966 const meta = csvToMeta(metaBox.value); 3967 meta.home_name = document.getElementById('inHomeName').value; 3968 meta.home_color = document.getElementById('inHomeColor').value; 3969 meta.away_name = document.getElementById('inAwayName').value; 3970 meta.away_color = document.getElementById('inAwayColor').value; 3971 meta.competition = document.getElementById('inComp').value; 3972 meta.date = document.getElementById('inDate').value; 3973 meta.venue = document.getElementById('inVenue').value; 3974 meta.home_flag = resolveFlagCode(document.getElementById('inHomeFlag').value); 3975 meta.away_flag = resolveFlagCode(document.getElementById('inAwayFlag').value); 3976 metaBox.value = metaToCSV(meta); 3977 }catch(e){} 3978 }); 3979}); 3980 3981/* ---- init ---- */ 3982// Country list for the searchable flag inputs â ISO 3166-1 alpha-2 codes 3983// (lowercase, matching flagcdn.com's URL scheme) using names as commonly 3984// used in football commentary, plus the four UK home nations, which compete 3985// as separate FIFA members despite not being ISO 3166-1 countries in their 3986// own right (flagcdn supports these specific gb-xxx subdivision codes). 3987const FIFA_NATIONS = [ 3988 {name:"Afghanistan",code:"af"},{name:"Albania",code:"al"},{name:"Algeria",code:"dz"},{name:"American Samoa",code:"as"}, 3989 {name:"Andorra",code:"ad"},{name:"Angola",code:"ao"},{name:"Anguilla",code:"ai"},{name:"Antigua and Barbuda",code:"ag"}, 3990 {name:"Argentina",code:"ar"},{name:"Armenia",code:"am"},{name:"Aruba",code:"aw"},{name:"Australia",code:"au"}, 3991 {name:"Austria",code:"at"},{name:"Azerbaijan",code:"az"},{name:"Bahamas",code:"bs"},{name:"Bahrain",code:"bh"}, 3992 {name:"Bangladesh",code:"bd"},{name:"Barbados",code:"bb"},{name:"Belarus",code:"by"},{name:"Belgium",code:"be"}, 3993 {name:"Belize",code:"bz"},{name:"Benin",code:"bj"},{name:"Bermuda",code:"bm"},{name:"Bhutan",code:"bt"}, 3994 {name:"Bolivia",code:"bo"},{name:"Bosnia and Herzegovina",code:"ba"},{name:"Botswana",code:"bw"},{name:"Brazil",code:"br"}, 3995 {name:"British Virgin Islands",code:"vg"},{name:"Brunei",code:"bn"},{name:"Bulgaria",code:"bg"},{name:"Burkina Faso",code:"bf"}, 3996 {name:"Burundi",code:"bi"},{name:"Cambodia",code:"kh"},{name:"Cameroon",code:"cm"},{name:"Canada",code:"ca"}, 3997 {name:"Cape Verde",code:"cv"},{name:"Cayman Islands",code:"ky"},{name:"Central African Republic",code:"cf"},{name:"Chad",code:"td"}, 3998 {name:"Chile",code:"cl"},{name:"China",code:"cn"},{name:"Chinese Taipei",code:"tw"},{name:"Colombia",code:"co"}, 3999 {name:"Comoros",code:"km"},{name:"Congo",code:"cg"},{name:"Cook Islands",code:"ck"},{name:"Costa Rica",code:"cr"}, 4000 {name:"Croatia",code:"hr"},{name:"Cuba",code:"cu"},{name:"Curaçao",code:"cw"},{name:"Cyprus",code:"cy"}, 4001 {name:"Czech Republic",code:"cz"},{name:"DR Congo",code:"cd"},{name:"Denmark",code:"dk"},{name:"Djibouti",code:"dj"}, 4002 {name:"Dominica",code:"dm"},{name:"Dominican Republic",code:"do"},{name:"Ecuador",code:"ec"},{name:"Egypt",code:"eg"}, 4003 {name:"El Salvador",code:"sv"},{name:"England",code:"gb-eng"},{name:"Equatorial Guinea",code:"gq"},{name:"Eritrea",code:"er"}, 4004 {name:"Estonia",code:"ee"},{name:"Eswatini",code:"sz"},{name:"Ethiopia",code:"et"},{name:"Faroe Islands",code:"fo"}, 4005 {name:"Fiji",code:"fj"},{name:"Finland",code:"fi"},{name:"France",code:"fr"},{name:"Gabon",code:"ga"}, 4006 {name:"Gambia",code:"gm"},{name:"Georgia",code:"ge"},{name:"Germany",code:"de"},{name:"Ghana",code:"gh"}, 4007 {name:"Gibraltar",code:"gi"},{name:"Greece",code:"gr"},{name:"Grenada",code:"gd"},{name:"Guam",code:"gu"}, 4008 {name:"Guatemala",code:"gt"},{name:"Guinea",code:"gn"},{name:"Guinea-Bissau",code:"gw"},{name:"Guyana",code:"gy"}, 4009 {name:"Haiti",code:"ht"},{name:"Honduras",code:"hn"},{name:"Hong Kong",code:"hk"},{name:"Hungary",code:"hu"}, 4010 {name:"Iceland",code:"is"},{name:"India",code:"in"},{name:"Indonesia",code:"id"},{name:"Iran",code:"ir"}, 4011 {name:"Iraq",code:"iq"},{name:"Ireland",code:"ie"},{name:"Israel",code:"il"},{name:"Italy",code:"it"}, 4012 {name:"Ivory Coast",code:"ci"},{name:"Jamaica",code:"jm"},{name:"Japan",code:"jp"},{name:"Jordan",code:"jo"}, 4013 {name:"Kazakhstan",code:"kz"},{name:"Kenya",code:"ke"},{name:"Kosovo",code:"xk"},{name:"Kuwait",code:"kw"}, 4014 {name:"Kyrgyzstan",code:"kg"},{name:"Laos",code:"la"},{name:"Latvia",code:"lv"},{name:"Lebanon",code:"lb"}, 4015 {name:"Lesotho",code:"ls"},{name:"Liberia",code:"lr"},{name:"Libya",code:"ly"},{name:"Liechtenstein",code:"li"}, 4016 {name:"Lithuania",code:"lt"},{name:"Luxembourg",code:"lu"},{name:"Macau",code:"mo"},{name:"Madagascar",code:"mg"}, 4017 {name:"Malawi",code:"mw"},{name:"Malaysia",code:"my"},{name:"Maldives",code:"mv"},{name:"Mali",code:"ml"}, 4018 {name:"Malta",code:"mt"},{name:"Mauritania",code:"mr"},{name:"Mauritius",code:"mu"},{name:"Mexico",code:"mx"}, 4019 {name:"Moldova",code:"md"},{name:"Mongolia",code:"mn"},{name:"Montenegro",code:"me"},{name:"Montserrat",code:"ms"}, 4020 {name:"Morocco",code:"ma"},{name:"Mozambique",code:"mz"},{name:"Myanmar",code:"mm"},{name:"Namibia",code:"na"}, 4021 {name:"Nepal",code:"np"},{name:"Netherlands",code:"nl"},{name:"New Caledonia",code:"nc"},{name:"New Zealand",code:"nz"}, 4022 {name:"Nicaragua",code:"ni"},{name:"Niger",code:"ne"},{name:"Nigeria",code:"ng"},{name:"North Korea",code:"kp"}, 4023 {name:"North Macedonia",code:"mk"},{name:"Northern Ireland",code:"gb-nir"},{name:"Norway",code:"no"},{name:"Oman",code:"om"}, 4024 {name:"Pakistan",code:"pk"},{name:"Palestine",code:"ps"},{name:"Panama",code:"pa"},{name:"Papua New Guinea",code:"pg"}, 4025 {name:"Paraguay",code:"py"},{name:"Peru",code:"pe"},{name:"Philippines",code:"ph"},{name:"Poland",code:"pl"}, 4026 {name:"Portugal",code:"pt"},{name:"Puerto Rico",code:"pr"},{name:"Qatar",code:"qa"},{name:"Romania",code:"ro"}, 4027 {name:"Russia",code:"ru"},{name:"Rwanda",code:"rw"},{name:"Samoa",code:"ws"},{name:"San Marino",code:"sm"}, 4028 {name:"Sao Tome and Principe",code:"st"},{name:"Saudi Arabia",code:"sa"},{name:"Scotland",code:"gb-sct"},{name:"Senegal",code:"sn"}, 4029 {name:"Serbia",code:"rs"},{name:"Seychelles",code:"sc"},{name:"Sierra Leone",code:"sl"},{name:"Singapore",code:"sg"}, 4030 {name:"Slovakia",code:"sk"},{name:"Slovenia",code:"si"},{name:"Solomon Islands",code:"sb"},{name:"Somalia",code:"so"}, 4031 {name:"South Africa",code:"za"},{name:"South Korea",code:"kr"},{name:"South Sudan",code:"ss"},{name:"Spain",code:"es"}, 4032 {name:"Sri Lanka",code:"lk"},{name:"St Kitts and Nevis",code:"kn"},{name:"St Lucia",code:"lc"},{name:"St Vincent and the Grenadines",code:"vc"}, 4033 {name:"Sudan",code:"sd"},{name:"Suriname",code:"sr"},{name:"Sweden",code:"se"},{name:"Switzerland",code:"ch"}, 4034 {name:"Syria",code:"sy"},{name:"Tahiti",code:"pf"},{name:"Tajikistan",code:"tj"},{name:"Tanzania",code:"tz"}, 4035 {name:"Thailand",code:"th"},{name:"Timor-Leste",code:"tl"},{name:"Togo",code:"tg"},{name:"Tonga",code:"to"}, 4036 {name:"Trinidad and Tobago",code:"tt"},{name:"Tunisia",code:"tn"},{name:"Turkey",code:"tr"},{name:"Turkmenistan",code:"tm"}, 4037 {name:"Turks and Caicos Islands",code:"tc"},{name:"Uganda",code:"ug"},{name:"Ukraine",code:"ua"},{name:"United Arab Emirates",code:"ae"}, 4038 {name:"United States",code:"us"},{name:"Uruguay",code:"uy"},{name:"Uzbekistan",code:"uz"},{name:"Vanuatu",code:"vu"}, 4039 {name:"Venezuela",code:"ve"},{name:"Vietnam",code:"vn"},{name:"Wales",code:"gb-wls"},{name:"Yemen",code:"ye"}, 4040 {name:"Zambia",code:"zm"},{name:"Zimbabwe",code:"zw"} 4041]; 4042const FIFA_NATIONS_BY_NAME = {}; FIFA_NATIONS.forEach(n=>FIFA_NATIONS_BY_NAME[n.name.toLowerCase()]=n.code); 4043const FIFA_NATIONS_BY_CODE = {}; FIFA_NATIONS.forEach(n=>FIFA_NATIONS_BY_CODE[n.code.toLowerCase()]=n.name); 4044// Typed value can be a nation name (from the search list) or a raw code 4045// (for anything not in the list, or for anyone who prefers typing it 4046// directly) â this resolves either into the actual code the app stores. 4047function resolveFlagCode(raw){ 4048 if(!raw) return ''; 4049 const t = raw.trim(); 4050 if(/^https?:\/\//i.test(t)) return t; // a full image URL (e.g. a club crest) â keep exactly as pasted, case intact 4051 const byName = FIFA_NATIONS_BY_NAME[t.toLowerCase()]; 4052 if(byName) return byName; 4053 return t.toLowerCase(); 4054} 4055// Reverse direction: showing a friendly name in the input when a match is 4056// loaded with a known code, falling back to the raw code for anything not 4057// in the list (a custom subdivision code someone typed directly, etc). 4058function flagCodeToDisplayName(code){ 4059 if(!code) return ''; 4060 return FIFA_NATIONS_BY_CODE[code.trim().toLowerCase()] || code; 4061} 4062function populateFifaNationsDatalist(){ 4063 const dl = document.getElementById('fifaNationsList'); 4064 if(!dl || dl.childElementCount) return; 4065 FIFA_NATIONS.slice().sort((a,b)=>
4065a.name.localeCompare(b.name)).forEach(n=>{ 4066 const opt = document.createElement('option'); 4067 opt.value = n.name; 4068 dl.appendChild(opt); 4069 }); 4070} 4071populateFifaNationsDatalist(); 4072function flagUrl(code){ 4073 if(!code) return ''; 4074 const c = code.trim(); 4075 if(/^https?:\/\//i.test(c)) return c; // already a direct image URL (e.g. a club crest) â use as-is 4076 return 'https://flagcdn.com/48x36/'+c.toLowerCase()+'.png'; 4077} 4078function updateFlags(){ 4079 const homeImg = document.getElementById('flagHome'); 4080 const awayImg = document.getElementById('flagAway'); 4081 if(match.homeFlag){ homeImg.src = flagUrl(match.homeFlag); homeImg.style.display='block'; homeImg.onerror=()=>{homeImg.style.display='none';}; } 4082 else homeImg.style.display = 'none'; 4083 if(match.awayFlag){ awayImg.src = flagUrl(match.awayFlag); awayImg.style.display='block'; awayImg.onerror=()=>{awayImg.style.display='none';}; } 4084 else awayImg.style.display = 'none'; 4085} 4086document.getElementById('swatchHome').style.background = match.home.color; 4087document.getElementById('swatchAway').style.background = match.away.color; 4088updateFlags(); 4089renderMap(); 4090document.getElementById('nameHome').textContent = match.home.name.toUpperCase(); 4091document.getElementById('nameAway').textContent = match.away.name.toUpperCase(); 4092document.getElementById('shareHomeFill').style.background = match.home.color; 4093document.getElementById('shareAwayFill').style.background = match.away.color; 4094document.getElementById('metaLine').textContent = match.competition+" · "+match.date+(match.venue?" · "+match.venue:""); 4095document.getElementById('inHomeName').value = match.home.name; 4096document.getElementById('inHomeColor').value = match.home.color; 4097document.getElementById('inAwayName').value = match.away.name; 4098document.getElementById('inAwayColor').value = match.away.color; 4099document.getElementById('inComp').value = match.competition; 4100document.getElementById('inDate').value = match.date; 4101document.getElementById('inVenue').value = match.venue || ''; 4102document.getElementById('inHomeFlag').value = flagCodeToDisplayName(match.homeFlag || ''); 4103document.getElementById('inAwayFlag').value = flagCodeToDisplayName(match.awayFlag || ''); 4104document.getElementById('inHasExtraTime').checked = !!match.hasExtraTime; 4105rebuildTicker(); 4106updatePossessionDisplays(); 4107syncAll(); 4108tlog('Initialisation complete. App should be interactive now.'); 4109 4110 4111/* ---- sharing: view-only and fully-configurable links, Gist-backed (short URL, 4112 updatable in place) with an automatic compressed-URL fallback ---- */ 4113const GIST_PROXY_BASE = 'https://geo-mapper-gist-proxy.bconway.workers.dev'; 4114const GIST_SHARE_FILENAME = 'tidal-match.json'; 4115 4116function copyToClipboard(text){ 4117 if(navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(text); 4118 return Promise.reject(new Error('Clipboard API unavailable')); 4119} 4120 4121/* Loads a parsed match object by piggybacking on the existing, already-tested 4122 JSON-mode apply path, instead of duplicating its validation/setup logic. */ 4123function loadParsedMatchViaJsonPath(parsed){ 4124 // IMPORTANT ordering: clicking the JSON tab button runs its own handler, 4125 // which populates the textarea FROM THE CURRENT match (a convenience for 4126 // normal editing) â if the incoming shared data is written before that 4127 // click, this immediately overwrites it with the stale old match, and 4128 // Apply Data then successfully (and silently) reapplies the WRONG match 4129 // with no error at all, since the stale JSON is perfectly valid. This is 4130 // exactly what was happening. Setting the real data AFTER the tab click 4131 // means it's the last thing to touch the textarea before Apply runs. 4132 const jsonTabBtn = document.querySelector('#formatToggle [data-mode="json"]'); 4133 if(jsonTabBtn) jsonTabBtn.click(); 4134 document.getElementById('dataJson').value = JSON.stringify(parsed); 4135 document.getElementById('applyData').click(); 4136} 4137 4138/* View-only mode: no further configuration possible, per spec â hide the 4139 Data & teams button so the panel (and therefore Share tab, edit fields, 4140 upload/download, everything) is unreachable. Playback controls are untouched. */
4141function enterViewOnlyMode(){ 4142 const btn = document.getElementById('dataBtn'); 4143 if(btn) btn.style.display = 'none'; 4144} 4145 4146/* Share links serialize whatever's currently in `match` â NOT whatever's 4147 sitting unsaved in the CSV/JSON textareas. If someone fills in the Lineups 4148 CSV and switches straight to this tab without clicking Apply Data first, 4149 the link goes out with no lineup data and nothing visibly warns them. 4150 This surfaces that gap directly, comparing match.lineup against whatever 4151 the Lineups CSV textarea currently parses to. */ 4152function updateShareLineupWarning(){ 4153 const warnEl = document.getElementById('shareLineupWarning'); 4154 if(!warnEl) return; 4155 const loadedCount = (match.lineup || []).length; 4156 let csvCount = 0; 4157 try{ csvCount = csvToLineups(document.getElementById('lineupsCsv').value).length; }catch(e){} 4158 if(loadedCount === 0 && csvCount === 0){ 4159 warnEl.style.display = 'none'; 4160 return; 4161 } 4162 if(csvCount !== loadedCount){ 4163 warnEl.style.display = 'block'; 4164 warnEl.textContent = 'The Lineups CSV has '+csvCount+' player row(s) not yet applied to this match ('+loadedCount+' currently loaded) â click Apply Data on the CSV tab first, or the share link will not include them.'; 4165 }else if(loadedCount === 0){ 4166 warnEl.style.display = 'block'; 4167 warnEl.textContent = 'No lineup data is currently loaded on this match â the share link will not include a Lineups panel until you fill in the Lineups CSV and click Apply Data.'; 4168 }else{ 4169 warnEl.style.display = 'none'; 4170 } 4171} 4172 4173let currentShareMode = 'view'; 4174/* Tracked per-session (not persisted across reloads) so repeat "Create share 4175 link" clicks in the SAME editing session update the SAME Gist in place â 4176 the URL the creator already sent out keeps working and just shows the 4177 latest data. A fresh browser session (or "start a new link") makes a new one. */ 4178let shareGistId = { view: null, edit: null }; 4179 4180function setShareMode(mode){ 4181 currentShareMode = mode; 4182 document.querySelectorAll('#shareModeToggle [data-sharemode]').forEach(b=>b.classList.toggle('active', b.dataset.sharemode===mode)); 4183 updateShareButtonLabel(); 4184} 4185function updateShareButtonLabel(){ 4186 document.getElementById('shareCreateBtn').textContent = shareGistId[currentShareMode] ? 'Update share link' : 'Create share link'; 4187} 4188document.querySelectorAll('#shareModeToggle [data-sharemode]').forEach(btn=>{ 4189 btn.addEventListener('click', ()=> setShareMode(btn.dataset.sharemode)); 4190}); 4191document.getElementById('shareNewLinkBtn').addEventListener('click', ()=>{ 4192 shareGistId[currentShareMode] = null; 4193 updateShareButtonLabel(); 4194 const statusEl = document.getElementById('shareStatus'); 4195 statusEl.style.display = 'block'; 4196 statusEl.textContent = 'Next click will create a brand-new link instead of updating the previous one.'; 4197}); 4198 4199/* Mirrors Geo Mapper's own createGist()/loadGist(): POST to create, PATCH 4200 (with the id as a query param) to update in place, falling back to a fresh 4201 POST if the PATCH fails outright (network/CORS) or comes back non-ok (e.g. 4202 the gist was deleted). The one difference from Geo Mapper: this calls the 4203 Worker at its full workers.dev URL rather than a same-origin relative path, 4204 since Tidal isn't served behind that Worker's path-based proxy route â 4205 that part is a reasonable extrapolation of Geo Mapper's own working code, 4206 not yet confirmed against the live Worker end-to-end. */ 4207async function createGistForShare(mode){ 4208 const timestamp = new Date().toISOString(); 4209 const homeName = (match.home && match.home.name) || 'Home'; 4210 const awayName = (match.away && match.away.name) || 'Away'; 4211 const competition = match.competition || ''; 4212 const content = LZString.compressToEncodedURIComponent(JSON.stringify(match)); 4213 const gistData = { 4214 description: 'Tidal match share ('+mode+'): '+homeName+' vs '+awayName+(competition?' â '+competition:'')+' ('+timestamp+')', 4215 files: { [GIST_SHARE_FILENAME]: { content } } 4216 }; 4217 const existingId = shareGistId[mode]; 4218 if(!existingId) gistData.public = false; 4219 const url = existingId ? (GIST_PROXY_BASE+'/gist?id='+existingId) : (GIST_PROXY_BASE+'/gist'); 4220 const method = existingId ? 'PATCH' : 'POST'; 4221 let response; 4222 try{ 4223 response = await fetch(url, { 4224 method, 4225 headers: { 'Content-Type':'application/json', 'Accept':'application/vnd.github.v3+json' }, 4226 body: JSON.stringify(gistData) 4227 }); 4228 }catch(networkError){ 4229 if(existingId){ 4230 tlog('Gist PATCH network error (possible CORS/Worker restriction) â retrying as a new Gist: '+networkError.message); 4231 shareGistId[mode] = null; 4232 return createGistForShare(mode); 4233 } 4234 throw networkError; 4235 } 4236 if(!response.ok){ 4237 if(existingId){ 4238 tlog('Gist PATCH failed (HTTP '+response.status+') â retrying as a new Gist.'); 4239 shareGistId[mode] = null; 4240 return createGistForShare(mode); 4241 } 4242 let msg = response.statusText; 4243 try{ const errBody = await response.json(); if(errBody && errBody.message) msg = errBody.message; }catch(e){} 4244 throw new Error('HTTP '+response.status+' '+msg); 4245 } 4246 const gist = await response.json();
4247 shareGistId[mode] = gist.id; 4248 return gist.id; 4249} 4250 4251document.getElementById('shareCreateBtn').addEventListener('click', async ()=>{ 4252 updateShareLineupWarning(); 4253 const statusEl = document.getElementById('shareStatus'); 4254 const matchLabel = (match.home && match.home.name || '?')+' vs '+(match.away && match.away.name || '?'); 4255 statusEl.style.display = 'block'; 4256 statusEl.textContent = (shareGistId[currentShareMode] ? 'Updating gist for ' : 'Creating gist for ')+matchLabel+'...'; 4257 try{ 4258 const gistId = await createGistForShare(currentShareMode); 4259 // Query string, not a #fragment: fragments are never sent to any server, 4260 // so a link-preview crawler (WhatsApp, Slack, etc.) can only ever see a 4261 // static, generic preview if the match info lives after a #. A short 4262 // gist id in the query string is small enough that this is safe. 4263 const url = window.location.origin + window.location.pathname + '?mode='+currentShareMode+'&gist='+gistId; 4264 document.getElementById('shareUrlOutput').value = url; 4265 statusEl.textContent = 'Short link ready for '+matchLabel+' â this same link will pick up future updates too.'; 4266 updateShareButtonLabel(); 4267 tlog('Gist share link ready ('+currentShareMode+', '+matchLabel+'): '+url); 4268 }catch(err){ 4269 try{ 4270 const compressed = LZString.compressToEncodedURIComponent(JSON.stringify(match)); 4271 const url = window.location.origin + window.location.pathname + '#mode='+currentShareMode+'&data='+compressed; 4272 document.getElementById('shareUrlOutput').value = url; 4273 statusEl.textContent = "Couldn't create a Gist link ("+err.message+") â using a compressed link instead. This one can't be updated in place; changing the match later means generating and re-sending a new link."; 4274 tlog('Gist creation failed ('+err.message+'), fell back to compressed URL, length='+url.length); 4275 }catch(err2){ 4276 statusEl.textContent = 'Failed to create any share link: '+err2.message; 4277 tlog('Share link generation failed entirely: '+err2.message); 4278 } 4279 } 4280}); 4281document.getElementById('shareCopyBtn').addEventListener('click', ()=>{ 4282 const val = document.getElementById('shareUrlOutput').value; 4283 if(!val) return; 4284 copyToClipboard(val).then(()=>tlog('Share URL copied.')).catch(()=>tlog('Copy failed â select the text manually.')); 4285}); 4286 4287function parseHashParams(hashOrUrl){ 4288 const hashIdx = hashOrUrl.indexOf('#'); 4289 const searchIdx = hashOrUrl.indexOf('?'); 4290 const cutIdx = hashIdx>=0 ? hashIdx : searchIdx; 4291 const hash = cutIdx>=0 ? hashOrUrl.slice(cutIdx+1) : hashOrUrl; 4292 const params = {}; 4293 hash.split('&').forEach(pair=>{ 4294 if(!pair) return; 4295 const idx = pair.indexOf('='); 4296 if(idx<0) return; 4297 params[decodeURIComponent(pair.slice(0,idx))] = pair.slice(idx+1); 4298 }); 4299 return params; 4300} 4301 4302async function loadShareLink(hashOrUrl){ 4303 const params = parseHashParams(hashOrUrl); 4304 const errBox = document.getElementById('errBox'); 4305 errBox.style.display = 'none'; 4306 /* default to view-only for any link we don't recognise the mode of â the 4307 safer default for something someone sent you is "just watch it". */ 4308 const mode = params.mode==='edit' ? 'edit' : 'view'; 4309 try{ 4310 let parsed; 4311 if(params.gist){ 4312 const response = await fetch(GIST_PROXY_BASE+'/gist?id='+encodeURIComponent(params.gist)+'&_='+Date.now(), { 4313 cache: 'no-store', 4314 headers: { 'Accept':'application/vnd.github.v3+json' } 4315 }); 4316 if(!response.ok) throw new Error('Failed to load gist: '+response.statusText); 4317 const gist = await response.json(); 4318 const file = gist.files && gist.files[GIST_SHARE_FILENAME]; 4319 if(!file) throw new Error('Gist did not contain a '+GIST_SHARE_FILENAME+' file.'); 4320 // GitHub's Gist API truncates file content over its size threshold in 4321 // this response and sets truncated:true, expecting a follow-up fetch 4322 // of raw_url for the full text. A match with several ambient windows 4323 // and goal clips easily runs to multiple MB once compressed, which is 4324 // well past that threshold â without this check we were silently 4325 // trying to decompress a partial string, which is exactly why this 4326 // failed with "Decompression returned nothing" for audio-heavy matches 4327 // while smaller ones (like the local demo) worked fine. 4328 let rawContent = file.content; 4329 if(file.truncated && file.raw_url){ 4330 const rawResponse = await fetch(file.raw_url+'?_='+Date.now(), { cache: 'no-store' }); 4331 if(!rawResponse.ok) throw new Error('Gist content was truncated and the raw_url fetch failed: '+rawResponse.statusText); 4332 rawContent = await rawResponse.text(); 4333 } 4334 const decompressed = LZString.decompressFromEncodedURIComponent(rawContent); 4335 if(!decompressed) throw new Error('Decompression returned nothing.'); 4336 parsed = JSON.parse(decompressed); 4337 shareGistId[mode] = params.gist;
4337 // lets this session update the same link later 4338 }else if(params.data){ 4339 const decompressed = LZString.decompressFromEncodedURIComponent(params.data); 4340 if(!decompressed) throw new Error('Decompression returned nothing â link may be truncated or corrupted.'); 4341 parsed = JSON.parse(decompressed); 4342 }else{ 4343 throw new Error("Link doesn't contain a recognised gist= or data= fragment."); 4344 } 4345 loadParsedMatchViaJsonPath(parsed); 4346 // Apply Data's own try/catch swallows errors into #errBox, which lives 4347 // inside the (closed, and in view mode permanently hidden) Data & teams 4348 // panel â invisible during an automatic load-on-page-open. Verifying 4349 // match actually picked up the new team names is a cheap, reliable way 4350 // to detect a silent failure and surface the real reason instead of just 4351 // showing whatever match was loaded before (the embedded sample) with no 4352 // explanation at all. 4353 const appliedOk = match.home && match.away && parsed.home && parsed.away 4354 && match.home.name === parsed.home.name && match.away.name === parsed.away.name; 4355 if(!appliedOk){ 4356 const innerErr = errBox.textContent || 'Unknown error (Apply Data did not report one).'; 4357 const banner = document.getElementById('shareLoadError'); 4358 document.getElementById('shareLoadErrorText').textContent = 4359 "Couldn't load the shared match â showing the default match instead. Reason: "+innerErr; 4360 banner.style.display = 'block'; 4361 tlog('Shared match FAILED to apply (showing fallback match). Gist/link contained: ' 4362 +(parsed.home && parsed.home.name || '?')+' vs '+(parsed.away && parsed.away.name || '?') 4363 +'. Reason: '+innerErr); 4364 }else{ 4365 if(mode==='view') enterViewOnlyMode(); 4366 tlog('Loaded shared match ('+mode+' mode): '+match.home.name+' vs '+match.away.name); 4367 } 4368 }catch(err){ 4369 errBox.textContent = "Couldn't load that link â "+err.message; 4370 errBox.style.display = 'block'; 4371 // Same reasoning as the appliedOk branch above: errBox lives inside the 4372 // closed (and in view mode, permanently hidden) panel, so on an automatic 4373 // page-load share this would otherwise fail in complete silence â no 4374 // banner, no log line, just quietly falling back to whatever match was 4375 // already loaded (the embedded default). This covers everything that can 4376 // go wrong before Apply Data is even reached: fetch failures, a missing 4377 // gist file, decompression failures, malformed JSON. 4378 const banner = document.getElementById('shareLoadError'); 4379 document.getElementById('shareLoadErrorText').textContent = 4380 "Couldn't load the shared match â showing the default match instead. Reason: "+err.message; 4381 banner.style.display = 'block'; 4382 tlog('Shared match FAILED to load (showing fallback match). Reason: '+err.message); 4383 } 4384} 4385document.getElementById('loadShareBtn').addEventListener('click', ()=>{ 4386 const val = document.getElementById('loadShareUrl').value.trim(); 4387 if(val) loadShareLink(val); 4388}); 4389document.getElementById('shareLoadErrorClose').addEventListener('click', ()=>{ 4390 document.getElementById('shareLoadError').style.display = 'none'; 4391}); 4392 4393setShareMode('view'); 4394 4395/* auto-load if the page itself was opened with a share link. New links use 4396 a ?query string (visible to servers/crawlers, see createGistForShare); 4397 older shared links used a #fragment, so that's still checked as a 4398 fallback for anyone who saved/sent one before this change. */ 4399(function(){ 4400 const searchParams = parseHashParams(window.location.search); 4401 const source = (searchParams.gist || searchParams.data) ? window.location.search : window.location.hash; 4402 const initialParams = parseHashParams(source); 4403 if(initialParams.gist || initialParams.data) loadShareLink(source); 4404})(); 4405 4406})(); 4407 4408document.getElementById('hideDebug').addEventListener('click', function(){ 4409 document.getElementById('debugPanel').style.display='none'; 4410 document.getElementById('showDebug').style.display='block'; 4411}); 4412document.getElementById('showDebug').addEventListener('click', function(){ 4413 document.getElementById('debugPanel').style.display='flex'; 4414 document.getElementById('showDebug').style.display='none'; 4415}); 4416document.getElementById('copyLog').addEventListener('click', function(){ 4417 const text = window.__tlogs.join('\n'); 4418 if(navigator.clipboard && navigator.clipboard.writeText){ 4419 navigator.clipboard.writeText(text).then(()=>tlog('Log copied to clipboard.')).catch(()=>tlog('Clipboard copy failed â select text manually.')); 4420 }else{ 4421 tlog('Clipboard API unavailable. Log:\n'+text); 4422 } 4423}); 4424</script>
vendor: 1 bytes, line 4424
4424
4425<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"b895899cd9c6482287eaedb82a97db95","r":1,"spa":2}' crossorigin="anonymous"></script>
4425 4426</body> 4427</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.