From 73ed3865528419840364c7b466229586c2efa370 Mon Sep 17 00:00:00 2001 From: mrdoob Date: Tue, 5 Aug 2025 09:34:50 +0900 Subject: [PATCH 1/3] Removed RGBMLoader (#31566) * Removed RGBMLoader. * Updated screenshot. * Removed screenshot. --- examples/files.json | 1 - examples/jsm/Addons.js | 1 - examples/jsm/loaders/RGBMLoader.js | 1148 ----------------- .../screenshots/webgl_loader_texture_rgbm.jpg | Bin 20867 -> 0 bytes examples/screenshots/webgpu_pmrem_cubemap.jpg | Bin 9665 -> 29405 bytes examples/tags.json | 1 - examples/textures/cube/pisaRGBM16/nx.png | Bin 136842 -> 0 bytes examples/textures/cube/pisaRGBM16/ny.png | Bin 160270 -> 0 bytes examples/textures/cube/pisaRGBM16/nz.png | Bin 168687 -> 0 bytes examples/textures/cube/pisaRGBM16/px.png | Bin 149313 -> 0 bytes examples/textures/cube/pisaRGBM16/py.png | Bin 136716 -> 0 bytes examples/textures/cube/pisaRGBM16/pz.png | Bin 174680 -> 0 bytes examples/webgl_loader_texture_rgbm.html | 113 -- examples/webgl_materials_envmaps_hdr.html | 21 +- examples/webgpu_cubemap_adjustments.html | 11 +- examples/webgpu_cubemap_dynamic.html | 13 +- examples/webgpu_cubemap_mix.html | 11 +- examples/webgpu_pmrem_cubemap.html | 8 +- .../webgpu_postprocessing_anamorphic.html | 11 +- playground/examples/basic/teapot.json | 2 +- 20 files changed, 29 insertions(+), 1312 deletions(-) delete mode 100644 examples/jsm/loaders/RGBMLoader.js delete mode 100644 examples/screenshots/webgl_loader_texture_rgbm.jpg delete mode 100644 examples/textures/cube/pisaRGBM16/nx.png delete mode 100644 examples/textures/cube/pisaRGBM16/ny.png delete mode 100644 examples/textures/cube/pisaRGBM16/nz.png delete mode 100644 examples/textures/cube/pisaRGBM16/px.png delete mode 100644 examples/textures/cube/pisaRGBM16/py.png delete mode 100644 examples/textures/cube/pisaRGBM16/pz.png delete mode 100644 examples/webgl_loader_texture_rgbm.html diff --git a/examples/files.json b/examples/files.json index f073f194f67b57..9929c423a7fc8a 100644 --- a/examples/files.json +++ b/examples/files.json @@ -114,7 +114,6 @@ "webgl_loader_texture_ktx2", "webgl_loader_texture_lottie", "webgl_loader_texture_pvrtc", - "webgl_loader_texture_rgbm", "webgl_loader_texture_tga", "webgl_loader_texture_tiff", "webgl_loader_ttf", diff --git a/examples/jsm/Addons.js b/examples/jsm/Addons.js index 2d3260b7f0d50c..710da115a7f316 100644 --- a/examples/jsm/Addons.js +++ b/examples/jsm/Addons.js @@ -110,7 +110,6 @@ export * from './loaders/PLYLoader.js'; export * from './loaders/PVRLoader.js'; export * from './loaders/RGBELoader.js'; export * from './loaders/UltraHDRLoader.js'; -export * from './loaders/RGBMLoader.js'; export * from './loaders/STLLoader.js'; export * from './loaders/SVGLoader.js'; export * from './loaders/TDSLoader.js'; diff --git a/examples/jsm/loaders/RGBMLoader.js b/examples/jsm/loaders/RGBMLoader.js deleted file mode 100644 index aa361b8baff683..00000000000000 --- a/examples/jsm/loaders/RGBMLoader.js +++ /dev/null @@ -1,1148 +0,0 @@ -import { - DataTextureLoader, - RGBAFormat, - LinearFilter, - CubeTexture, - HalfFloatType, - DataUtils -} from 'three'; - -/** - * A loader for the RGBM HDR texture format. - * - * ```js - * const loader = new RGBMLoader(); - * loader.setMaxRange( 16 ); - * - * const texture = await loader.loadAsync( 'textures/memorial.png' ); - * ``` - * - * @augments DataTextureLoader - * @three_import import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; - */ -class RGBMLoader extends DataTextureLoader { - - /** - * Constructs a new RGBM loader. - * - * @param {LoadingManager} [manager] - The loading manager. - */ - constructor( manager ) { - - super( manager ); - - /** - * The texture type. - * - * @type {(HalfFloatType|FloatType)} - * @default HalfFloatType - */ - this.type = HalfFloatType; - - /** - * More information about this property at [The difference between RGBM and RGBD]{@link https://iwasbeingirony.blogspot.com/2010/06/difference-between-rgbm-and-rgbd.html} - * - * @type {(7|16)} - * @default 7 - */ - this.maxRange = 7; - - } - - /** - * Sets the texture type. - * - * @param {(HalfFloatType|FloatType)} value - The texture type to set. - * @return {RGBMLoader} A reference to this loader. - */ - setDataType( value ) { - - this.type = value; - return this; - - } - - /** - * Sets the maximum range. - * - * @param {(7|16)} value - The maximum range to set. - * @return {RGBMLoader} A reference to this loader. - */ - setMaxRange( value ) { - - this.maxRange = value; - return this; - - } - - /** - * Starts loading from the given URLs and passes the loaded RGBM cube map - * to the `onLoad()` callback. - * - * @param {Array} urls - The paths/URLs of the files to be loaded. This can also be a data URIs. - * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished. - * @param {onProgressCallback} onProgress - Executed while the loading is in progress. - * @param {onErrorCallback} onError - Executed when errors occur. - * @return {CubeTexture} The cube texture. - */ - loadCubemap( urls, onLoad, onProgress, onError ) { - - const texture = new CubeTexture(); - - for ( let i = 0; i < 6; i ++ ) { - - texture.images[ i ] = undefined; - - } - - let loaded = 0; - - const scope = this; - - function loadTexture( i ) { - - scope.load( urls[ i ], function ( image ) { - - texture.images[ i ] = image; - - loaded ++; - - if ( loaded === 6 ) { - - texture.needsUpdate = true; - - if ( onLoad ) onLoad( texture ); - - } - - }, undefined, onError ); - - } - - for ( let i = 0; i < urls.length; ++ i ) { - - loadTexture( i ); - - } - - texture.type = this.type; - texture.format = RGBAFormat; - texture.minFilter = LinearFilter; - texture.generateMipmaps = false; - - return texture; - - } - - /** - * Async version of {@link RGBMLoader#loadCubemap}. - * - * @async - * @param {Array} urls - The paths/URLs of the files to be loaded. This can also be a data URIs. - * @param {onProgressCallback} onProgress - Executed while the loading is in progress. - * @return {Promise} A Promise that resolves with the loaded cube map. - */ - loadCubemapAsync( urls, onProgress ) { - - return new Promise( ( resolve, reject ) => { - - this.loadCubemap( urls, resolve, onProgress, reject ); - - } ); - - } - - /** - * Parses the given RGBM texture data. - * - * @param {ArrayBuffer} buffer - The raw texture data. - * @return {DataTextureLoader~TexData} An object representing the parsed texture data. - */ - parse( buffer ) { - - const img = UPNG.decode( buffer ); - const rgba = UPNG.toRGBA8( img )[ 0 ]; - - const data = new Uint8Array( rgba ); - const size = img.width * img.height * 4; - - const output = ( this.type === HalfFloatType ) ? new Uint16Array( size ) : new Float32Array( size ); - - // decode RGBM - - for ( let i = 0; i < data.length; i += 4 ) { - - const r = data[ i + 0 ] / 255; - const g = data[ i + 1 ] / 255; - const b = data[ i + 2 ] / 255; - const a = data[ i + 3 ] / 255; - - if ( this.type === HalfFloatType ) { - - output[ i + 0 ] = DataUtils.toHalfFloat( Math.min( r * a * this.maxRange, 65504 ) ); - output[ i + 1 ] = DataUtils.toHalfFloat( Math.min( g * a * this.maxRange, 65504 ) ); - output[ i + 2 ] = DataUtils.toHalfFloat( Math.min( b * a * this.maxRange, 65504 ) ); - output[ i + 3 ] = DataUtils.toHalfFloat( 1 ); - - } else { - - output[ i + 0 ] = r * a * this.maxRange; - output[ i + 1 ] = g * a * this.maxRange; - output[ i + 2 ] = b * a * this.maxRange; - output[ i + 3 ] = 1; - - } - - } - - return { - width: img.width, - height: img.height, - data: output, - format: RGBAFormat, - type: this.type, - flipY: true - }; - - } - -} - -// from https://github.com/photopea/UPNG.js (MIT License) - -var UPNG = {}; - -UPNG.toRGBA8 = function ( out ) { - - var w = out.width, h = out.height; - if ( out.tabs.acTL == null ) return [ UPNG.toRGBA8.decodeImage( out.data, w, h, out ).buffer ]; - - var frms = []; - if ( out.frames[ 0 ].data == null ) out.frames[ 0 ].data = out.data; - - var len = w * h * 4, img = new Uint8Array( len ), empty = new Uint8Array( len ), prev = new Uint8Array( len ); - for ( var i = 0; i < out.frames.length; i ++ ) { - - var frm = out.frames[ i ]; - var fx = frm.rect.x, fy = frm.rect.y, fw = frm.rect.width, fh = frm.rect.height; - var fdata = UPNG.toRGBA8.decodeImage( frm.data, fw, fh, out ); - - if ( i != 0 ) for ( var j = 0; j < len; j ++ ) prev[ j ] = img[ j ]; - - if ( frm.blend == 0 ) UPNG._copyTile( fdata, fw, fh, img, w, h, fx, fy, 0 ); - else if ( frm.blend == 1 ) UPNG._copyTile( fdata, fw, fh, img, w, h, fx, fy, 1 ); - - frms.push( img.buffer.slice( 0 ) ); - - if ( frm.dispose == 1 ) UPNG._copyTile( empty, fw, fh, img, w, h, fx, fy, 0 ); - else if ( frm.dispose == 2 ) for ( var j = 0; j < len; j ++ ) img[ j ] = prev[ j ]; - - } - - return frms; - -}; - -UPNG.toRGBA8.decodeImage = function ( data, w, h, out ) { - - var area = w * h, bpp = UPNG.decode._getBPP( out ); - var bpl = Math.ceil( w * bpp / 8 ); // bytes per line - - var bf = new Uint8Array( area * 4 ), bf32 = new Uint32Array( bf.buffer ); - var ctype = out.ctype, depth = out.depth; - var rs = UPNG._bin.readUshort; - - if ( ctype == 6 ) { // RGB + alpha - - var qarea = area << 2; - if ( depth == 8 ) for ( var i = 0; i < qarea; i += 4 ) { - - bf[ i ] = data[ i ]; bf[ i + 1 ] = data[ i + 1 ]; bf[ i + 2 ] = data[ i + 2 ]; bf[ i + 3 ] = data[ i + 3 ]; - - } - - if ( depth == 16 ) for ( var i = 0; i < qarea; i ++ ) { - - bf[ i ] = data[ i << 1 ]; - - } - - } else if ( ctype == 2 ) { // RGB - - var ts = out.tabs[ 'tRNS' ]; - if ( ts == null ) { - - if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) { - - var ti = i * 3; bf32[ i ] = ( 255 << 24 ) | ( data[ ti + 2 ] << 16 ) | ( data[ ti + 1 ] << 8 ) | data[ ti ]; - - } - - if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) { - - var ti = i * 6; bf32[ i ] = ( 255 << 24 ) | ( data[ ti + 4 ] << 16 ) | ( data[ ti + 2 ] << 8 ) | data[ ti ]; - - } - - } else { - - var tr = ts[ 0 ], tg = ts[ 1 ], tb = ts[ 2 ]; - if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) { - - var qi = i << 2, ti = i * 3; bf32[ i ] = ( 255 << 24 ) | ( data[ ti + 2 ] << 16 ) | ( data[ ti + 1 ] << 8 ) | data[ ti ]; - if ( data[ ti ] == tr && data[ ti + 1 ] == tg && data[ ti + 2 ] == tb ) bf[ qi + 3 ] = 0; - - } - - if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) { - - var qi = i << 2, ti = i * 6; bf32[ i ] = ( 255 << 24 ) | ( data[ ti + 4 ] << 16 ) | ( data[ ti + 2 ] << 8 ) | data[ ti ]; - if ( rs( data, ti ) == tr && rs( data, ti + 2 ) == tg && rs( data, ti + 4 ) == tb ) bf[ qi + 3 ] = 0; - - } - - } - - } else if ( ctype == 3 ) { // palette - - var p = out.tabs[ 'PLTE' ], ap = out.tabs[ 'tRNS' ], tl = ap ? ap.length : 0; - //console.log(p, ap); - if ( depth == 1 ) for ( var y = 0; y < h; y ++ ) { - - var s0 = y * bpl, t0 = y * w; - for ( var i = 0; i < w; i ++ ) { - - var qi = ( t0 + i ) << 2, j = ( ( data[ s0 + ( i >> 3 ) ] >> ( 7 - ( ( i & 7 ) << 0 ) ) ) & 1 ), cj = 3 * j; bf[ qi ] = p[ cj ]; bf[ qi + 1 ] = p[ cj + 1 ]; bf[ qi + 2 ] = p[ cj + 2 ]; bf[ qi + 3 ] = ( j < tl ) ? ap[ j ] : 255; - - } - - } - - if ( depth == 2 ) for ( var y = 0; y < h; y ++ ) { - - var s0 = y * bpl, t0 = y * w; - for ( var i = 0; i < w; i ++ ) { - - var qi = ( t0 + i ) << 2, j = ( ( data[ s0 + ( i >> 2 ) ] >> ( 6 - ( ( i & 3 ) << 1 ) ) ) & 3 ), cj = 3 * j; bf[ qi ] = p[ cj ]; bf[ qi + 1 ] = p[ cj + 1 ]; bf[ qi + 2 ] = p[ cj + 2 ]; bf[ qi + 3 ] = ( j < tl ) ? ap[ j ] : 255; - - } - - } - - if ( depth == 4 ) for ( var y = 0; y < h; y ++ ) { - - var s0 = y * bpl, t0 = y * w; - for ( var i = 0; i < w; i ++ ) { - - var qi = ( t0 + i ) << 2, j = ( ( data[ s0 + ( i >> 1 ) ] >> ( 4 - ( ( i & 1 ) << 2 ) ) ) & 15 ), cj = 3 * j; bf[ qi ] = p[ cj ]; bf[ qi + 1 ] = p[ cj + 1 ]; bf[ qi + 2 ] = p[ cj + 2 ]; bf[ qi + 3 ] = ( j < tl ) ? ap[ j ] : 255; - - } - - } - - if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) { - - var qi = i << 2, j = data[ i ], cj = 3 * j; bf[ qi ] = p[ cj ]; bf[ qi + 1 ] = p[ cj + 1 ]; bf[ qi + 2 ] = p[ cj + 2 ]; bf[ qi + 3 ] = ( j < tl ) ? ap[ j ] : 255; - - } - - } else if ( ctype == 4 ) { // gray + alpha - - if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) { - - var qi = i << 2, di = i << 1, gr = data[ di ]; bf[ qi ] = gr; bf[ qi + 1 ] = gr; bf[ qi + 2 ] = gr; bf[ qi + 3 ] = data[ di + 1 ]; - - } - - if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) { - - var qi = i << 2, di = i << 2, gr = data[ di ]; bf[ qi ] = gr; bf[ qi + 1 ] = gr; bf[ qi + 2 ] = gr; bf[ qi + 3 ] = data[ di + 2 ]; - - } - - } else if ( ctype == 0 ) { // gray - - var tr = out.tabs[ 'tRNS' ] ? out.tabs[ 'tRNS' ] : - 1; - for ( var y = 0; y < h; y ++ ) { - - var off = y * bpl, to = y * w; - if ( depth == 1 ) for ( var x = 0; x < w; x ++ ) { - - var gr = 255 * ( ( data[ off + ( x >>> 3 ) ] >>> ( 7 - ( x & 7 ) ) ) & 1 ), al = ( gr == tr * 255 ) ? 0 : 255; bf32[ to + x ] = ( al << 24 ) | ( gr << 16 ) | ( gr << 8 ) | gr; - - } - else if ( depth == 2 ) for ( var x = 0; x < w; x ++ ) { - - var gr = 85 * ( ( data[ off + ( x >>> 2 ) ] >>> ( 6 - ( ( x & 3 ) << 1 ) ) ) & 3 ), al = ( gr == tr * 85 ) ? 0 : 255; bf32[ to + x ] = ( al << 24 ) | ( gr << 16 ) | ( gr << 8 ) | gr; - - } - else if ( depth == 4 ) for ( var x = 0; x < w; x ++ ) { - - var gr = 17 * ( ( data[ off + ( x >>> 1 ) ] >>> ( 4 - ( ( x & 1 ) << 2 ) ) ) & 15 ), al = ( gr == tr * 17 ) ? 0 : 255; bf32[ to + x ] = ( al << 24 ) | ( gr << 16 ) | ( gr << 8 ) | gr; - - } - else if ( depth == 8 ) for ( var x = 0; x < w; x ++ ) { - - var gr = data[ off + x ], al = ( gr == tr ) ? 0 : 255; bf32[ to + x ] = ( al << 24 ) | ( gr << 16 ) | ( gr << 8 ) | gr; - - } - else if ( depth == 16 ) for ( var x = 0; x < w; x ++ ) { - - var gr = data[ off + ( x << 1 ) ], al = ( rs( data, off + ( x << 1 ) ) == tr ) ? 0 : 255; bf32[ to + x ] = ( al << 24 ) | ( gr << 16 ) | ( gr << 8 ) | gr; - - } - - } - - } - - //console.log(Date.now()-time); - return bf; - -}; - - - -UPNG.decode = function ( buff ) { - - var data = new Uint8Array( buff ), offset = 8, bin = UPNG._bin, rUs = bin.readUshort, rUi = bin.readUint; - var out = { tabs: {}, frames: [] }; - var dd = new Uint8Array( data.length ), doff = 0; // put all IDAT data into it - var fd, foff = 0; // frames - var text, keyw, bfr; - - var mgck = [ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a ]; - for ( var i = 0; i < 8; i ++ ) if ( data[ i ] != mgck[ i ] ) throw new Error( 'The input is not a PNG file!' ); - - while ( offset < data.length ) { - - var len = bin.readUint( data, offset ); offset += 4; - var type = bin.readASCII( data, offset, 4 ); offset += 4; - //console.log(type,len); - - if ( type == 'IHDR' ) { - - UPNG.decode._IHDR( data, offset, out ); - - } else if ( type == 'CgBI' ) { - - out.tabs[ type ] = data.slice( offset, offset + 4 ); - - } else if ( type == 'IDAT' ) { - - for ( var i = 0; i < len; i ++ ) dd[ doff + i ] = data[ offset + i ]; - doff += len; - - } else if ( type == 'acTL' ) { - - out.tabs[ type ] = { num_frames: rUi( data, offset ), num_plays: rUi( data, offset + 4 ) }; - fd = new Uint8Array( data.length ); - - } else if ( type == 'fcTL' ) { - - if ( foff != 0 ) { - - var fr = out.frames[ out.frames.length - 1 ]; - fr.data = UPNG.decode._decompress( out, fd.slice( 0, foff ), fr.rect.width, fr.rect.height ); foff = 0; - - } - - var rct = { x: rUi( data, offset + 12 ), y: rUi( data, offset + 16 ), width: rUi( data, offset + 4 ), height: rUi( data, offset + 8 ) }; - var del = rUs( data, offset + 22 ); del = rUs( data, offset + 20 ) / ( del == 0 ? 100 : del ); - var frm = { rect: rct, delay: Math.round( del * 1000 ), dispose: data[ offset + 24 ], blend: data[ offset + 25 ] }; - //console.log(frm); - out.frames.push( frm ); - - } else if ( type == 'fdAT' ) { - - for ( var i = 0; i < len - 4; i ++ ) fd[ foff + i ] = data[ offset + i + 4 ]; - foff += len - 4; - - } else if ( type == 'pHYs' ) { - - out.tabs[ type ] = [ bin.readUint( data, offset ), bin.readUint( data, offset + 4 ), data[ offset + 8 ] ]; - - } else if ( type == 'cHRM' ) { - - out.tabs[ type ] = []; - for ( var i = 0; i < 8; i ++ ) out.tabs[ type ].push( bin.readUint( data, offset + i * 4 ) ); - - } else if ( type == 'tEXt' || type == 'zTXt' ) { - - if ( out.tabs[ type ] == null ) out.tabs[ type ] = {}; - var nz = bin.nextZero( data, offset ); - keyw = bin.readASCII( data, offset, nz - offset ); - var tl = offset + len - nz - 1; - if ( type == 'tEXt' ) text = bin.readASCII( data, nz + 1, tl ); - else { - - bfr = UPNG.decode._inflate( data.slice( nz + 2, nz + 2 + tl ) ); - text = bin.readUTF8( bfr, 0, bfr.length ); - - } - - out.tabs[ type ][ keyw ] = text; - - } else if ( type == 'iTXt' ) { - - if ( out.tabs[ type ] == null ) out.tabs[ type ] = {}; - var nz = 0, off = offset; - nz = bin.nextZero( data, off ); - keyw = bin.readASCII( data, off, nz - off ); off = nz + 1; - var cflag = data[ off ]; off += 2; - nz = bin.nextZero( data, off ); - bin.readASCII( data, off, nz - off ); off = nz + 1; - nz = bin.nextZero( data, off ); - bin.readUTF8( data, off, nz - off ); off = nz + 1; - var tl = len - ( off - offset ); - if ( cflag == 0 ) text = bin.readUTF8( data, off, tl ); - else { - - bfr = UPNG.decode._inflate( data.slice( off, off + tl ) ); - text = bin.readUTF8( bfr, 0, bfr.length ); - - } - - out.tabs[ type ][ keyw ] = text; - - } else if ( type == 'PLTE' ) { - - out.tabs[ type ] = bin.readBytes( data, offset, len ); - - } else if ( type == 'hIST' ) { - - var pl = out.tabs[ 'PLTE' ].length / 3; - out.tabs[ type ] = []; for ( var i = 0; i < pl; i ++ ) out.tabs[ type ].push( rUs( data, offset + i * 2 ) ); - - } else if ( type == 'tRNS' ) { - - if ( out.ctype == 3 ) out.tabs[ type ] = bin.readBytes( data, offset, len ); - else if ( out.ctype == 0 ) out.tabs[ type ] = rUs( data, offset ); - else if ( out.ctype == 2 ) out.tabs[ type ] = [ rUs( data, offset ), rUs( data, offset + 2 ), rUs( data, offset + 4 ) ]; - //else console.log("tRNS for unsupported color type",out.ctype, len); - - } else if ( type == 'gAMA' ) out.tabs[ type ] = bin.readUint( data, offset ) / 100000; - else if ( type == 'sRGB' ) out.tabs[ type ] = data[ offset ]; - else if ( type == 'bKGD' ) { - - if ( out.ctype == 0 || out.ctype == 4 ) out.tabs[ type ] = [ rUs( data, offset ) ]; - else if ( out.ctype == 2 || out.ctype == 6 ) out.tabs[ type ] = [ rUs( data, offset ), rUs( data, offset + 2 ), rUs( data, offset + 4 ) ]; - else if ( out.ctype == 3 ) out.tabs[ type ] = data[ offset ]; - - } else if ( type == 'IEND' ) { - - break; - - } - - //else { console.log("unknown chunk type", type, len); out.tabs[type]=data.slice(offset,offset+len); } - offset += len; - bin.readUint( data, offset ); offset += 4; - - } - - if ( foff != 0 ) { - - var fr = out.frames[ out.frames.length - 1 ]; - fr.data = UPNG.decode._decompress( out, fd.slice( 0, foff ), fr.rect.width, fr.rect.height ); - - } - - out.data = UPNG.decode._decompress( out, dd, out.width, out.height ); - - delete out.compress; delete out.interlace; delete out.filter; - return out; - -}; - -UPNG.decode._decompress = function ( out, dd, w, h ) { - - var bpp = UPNG.decode._getBPP( out ), bpl = Math.ceil( w * bpp / 8 ), buff = new Uint8Array( ( bpl + 1 + out.interlace ) * h ); - if ( out.tabs[ 'CgBI' ] ) dd = UPNG.inflateRaw( dd, buff ); - else dd = UPNG.decode._inflate( dd, buff ); - - if ( out.interlace == 0 ) dd = UPNG.decode._filterZero( dd, out, 0, w, h ); - else if ( out.interlace == 1 ) dd = UPNG.decode._readInterlace( dd, out ); - - return dd; - -}; - -UPNG.decode._inflate = function ( data, buff ) { - - var out = UPNG[ 'inflateRaw' ]( new Uint8Array( data.buffer, 2, data.length - 6 ), buff ); return out; - -}; - -UPNG.inflateRaw = function () { - - var H = {}; H.H = {}; H.H.N = function ( N, W ) { - - var R = Uint8Array, i = 0, m = 0, J = 0, h = 0, Q = 0, X = 0, u = 0, w = 0, d = 0, v, C; - if ( N[ 0 ] == 3 && N[ 1 ] == 0 ) return W ? W : new R( 0 ); var V = H.H, n = V.b, A = V.e, l = V.R, M = V.n, I = V.A, e = V.Z, b = V.m, Z = W == null; - if ( Z )W = new R( N.length >>> 2 << 5 ); while ( i == 0 ) { - - i = n( N, d, 1 ); m = n( N, d + 1, 2 ); d += 3; if ( m == 0 ) { - - if ( ( d & 7 ) != 0 )d += 8 - ( d & 7 ); - var D = ( d >>> 3 ) + 4, q = N[ D - 4 ] | N[ D - 3 ] << 8; if ( Z )W = H.H.W( W, w + q ); W.set( new R( N.buffer, N.byteOffset + D, q ), w ); d = D + q << 3; - w += q; continue - ; - - } - - if ( Z )W = H.H.W( W, w + ( 1 << 17 ) ); if ( m == 1 ) { - - v = b.J; C = b.h; X = ( 1 << 9 ) - 1; u = ( 1 << 5 ) - 1; - - } - - if ( m == 2 ) { - - J = A( N, d, 5 ) + 257; - h = A( N, d + 5, 5 ) + 1; Q = A( N, d + 10, 4 ) + 4; d += 14; var j = 1; for ( var c = 0; c < 38; c += 2 ) { - - b.Q[ c ] = 0; b.Q[ c + 1 ] = 0; - - } - - for ( var c = 0; - c < Q; c ++ ) { - - var K = A( N, d + c * 3, 3 ); b.Q[ ( b.X[ c ] << 1 ) + 1 ] = K; if ( K > j )j = K - ; - - } - - d += 3 * Q; M( b.Q, j ); I( b.Q, j, b.u ); v = b.w; C = b.d; - d = l( b.u, ( 1 << j ) - 1, J + h, N, d, b.v ); var r = V.V( b.v, 0, J, b.C ); X = ( 1 << r ) - 1; var S = V.V( b.v, J, h, b.D ); u = ( 1 << S ) - 1; M( b.C, r ); - I( b.C, r, v ); M( b.D, S ); I( b.D, S, C ) - ; - - } - - while ( ! 0 ) { - - var T = v[ e( N, d ) & X ]; d += T & 15; var p = T >>> 4; if ( p >>> 8 == 0 ) { - - W[ w ++ ] = p; - - } else if ( p == 256 ) { - - break; - - } else { - - var z = w + p - 254; - if ( p > 264 ) { - - var _ = b.q[ p - 257 ]; z = w + ( _ >>> 3 ) + A( N, d, _ & 7 ); d += _ & 7; - - } - - var $ = C[ e( N, d ) & u ]; d += $ & 15; var s = $ >>> 4, Y = b.c[ s ], a = ( Y >>> 4 ) + n( N, d, Y & 15 ); - d += Y & 15; while ( w < z ) { - - W[ w ] = W[ w ++ - a ]; W[ w ] = W[ w ++ - a ]; W[ w ] = W[ w ++ - a ]; W[ w ] = W[ w ++ - a ]; - - } - - w = z - ; - - } - - } - - } - - return W.length == w ? W : W.slice( 0, w ) - ; - - }; - - H.H.W = function ( N, W ) { - - var R = N.length; if ( W <= R ) return N; var V = new Uint8Array( R << 1 ); V.set( N, 0 ); return V; - - }; - - H.H.R = function ( N, W, R, V, n, A ) { - - var l = H.H.e, M = H.H.Z, I = 0; while ( I < R ) { - - var e = N[ M( V, n ) & W ]; n += e & 15; var b = e >>> 4; - if ( b <= 15 ) { - - A[ I ] = b; I ++; - - } else { - - var Z = 0, m = 0; if ( b == 16 ) { - - m = 3 + l( V, n, 2 ); n += 2; Z = A[ I - 1 ]; - - } else if ( b == 17 ) { - - m = 3 + l( V, n, 3 ); - n += 3 - ; - - } else if ( b == 18 ) { - - m = 11 + l( V, n, 7 ); n += 7; - - } - - var J = I + m; while ( I < J ) { - - A[ I ] = Z; I ++; - - } - - } - - } - - return n - ; - - }; - - H.H.V = function ( N, W, R, V ) { - - var n = 0, A = 0, l = V.length >>> 1; - while ( A < R ) { - - var M = N[ A + W ]; V[ A << 1 ] = 0; V[ ( A << 1 ) + 1 ] = M; if ( M > n )n = M; A ++; - - } - - while ( A < l ) { - - V[ A << 1 ] = 0; V[ ( A << 1 ) + 1 ] = 0; A ++; - - } - - return n - ; - - }; - - H.H.n = function ( N, W ) { - - var R = H.H.m, V = N.length, n, A, l, M, I, e = R.j; for ( var M = 0; M <= W; M ++ )e[ M ] = 0; for ( M = 1; M < V; M += 2 )e[ N[ M ] ] ++; - var b = R.K; n = 0; e[ 0 ] = 0; for ( A = 1; A <= W; A ++ ) { - - n = n + e[ A - 1 ] << 1; b[ A ] = n; - - } - - for ( l = 0; l < V; l += 2 ) { - - I = N[ l + 1 ]; if ( I != 0 ) { - - N[ l ] = b[ I ]; - b[ I ] ++ - ; - - } - - } - - }; - - H.H.A = function ( N, W, R ) { - - var V = N.length, n = H.H.m, A = n.r; for ( var l = 0; l < V; l += 2 ) if ( N[ l + 1 ] != 0 ) { - - var M = l >> 1, I = N[ l + 1 ], e = M << 4 | I, b = W - I, Z = N[ l ] << b, m = Z + ( 1 << b ); - while ( Z != m ) { - - var J = A[ Z ] >>> 15 - W; R[ J ] = e; Z ++; - - } - - } - - }; - - H.H.l = function ( N, W ) { - - var R = H.H.m.r, V = 15 - W; for ( var n = 0; n < N.length; - n += 2 ) { - - var A = N[ n ] << W - N[ n + 1 ]; N[ n ] = R[ A ] >>> V; - - } - - }; - - H.H.M = function ( N, W, R ) { - - R = R << ( W & 7 ); var V = W >>> 3; N[ V ] |= R; N[ V + 1 ] |= R >>> 8; - - }; - - H.H.I = function ( N, W, R ) { - - R = R << ( W & 7 ); var V = W >>> 3; N[ V ] |= R; N[ V + 1 ] |= R >>> 8; N[ V + 2 ] |= R >>> 16; - - }; - - H.H.e = function ( N, W, R ) { - - return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 ) >>> ( W & 7 ) & ( 1 << R ) - 1; - - }; - - H.H.b = function ( N, W, R ) { - - return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 ) >>> ( W & 7 ) & ( 1 << R ) - 1; - - }; - - H.H.Z = function ( N, W ) { - - return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 ) >>> ( W & 7 ); - - }; - - H.H.i = function ( N, W ) { - - return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 | N[ ( W >>> 3 ) + 3 ] << 24 ) >>> ( W & 7 ); - - }; - - H.H.m = function () { - - var N = Uint16Array, W = Uint32Array; - return { K: new N( 16 ), j: new N( 16 ), X: [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ], S: [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999 ], T: [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0 ], q: new N( 32 ), p: [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535 ], z: [ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0 ], c: new W( 32 ), J: new N( 512 ), _: [], h: new N( 32 ), $: [], w: new N( 32768 ), C: [], v: [], d: new N( 32768 ), D: [], u: new N( 512 ), Q: [], r: new N( 1 << 15 ), s: new W( 286 ), Y: new W( 30 ), a: new W( 19 ), t: new W( 15e3 ), k: new N( 1 << 16 ), g: new N( 1 << 15 ) } - ; - - }(); - ( function () { - - var N = H.H.m, W = 1 << 15; for ( var R = 0; R < W; R ++ ) { - - var V = R; V = ( V & 2863311530 ) >>> 1 | ( V & 1431655765 ) << 1; - V = ( V & 3435973836 ) >>> 2 | ( V & 858993459 ) << 2; V = ( V & 4042322160 ) >>> 4 | ( V & 252645135 ) << 4; V = ( V & 4278255360 ) >>> 8 | ( V & 16711935 ) << 8; - N.r[ R ] = ( V >>> 16 | V << 16 ) >>> 17 - ; - - } - - function n( A, l, M ) { - - while ( l -- != 0 )A.push( 0, M ) - ; - - } - - for ( var R = 0; R < 32; R ++ ) { - - N.q[ R ] = N.S[ R ] << 3 | N.T[ R ]; - N.c[ R ] = N.p[ R ] << 4 | N.z[ R ] - ; - - } - - n( N._, 144, 8 ); n( N._, 255 - 143, 9 ); n( N._, 279 - 255, 7 ); n( N._, 287 - 279, 8 ); H.H.n( N._, 9 ); - H.H.A( N._, 9, N.J ); H.H.l( N._, 9 ); n( N.$, 32, 5 ); H.H.n( N.$, 5 ); H.H.A( N.$, 5, N.h ); H.H.l( N.$, 5 ); n( N.Q, 19, 0 ); n( N.C, 286, 0 ); - n( N.D, 30, 0 ); n( N.v, 320, 0 ) - ; - - }() ); - - return H.H.N - ; - -}(); - - -UPNG.decode._readInterlace = function ( data, out ) { - - var w = out.width, h = out.height; - var bpp = UPNG.decode._getBPP( out ), cbpp = bpp >> 3, bpl = Math.ceil( w * bpp / 8 ); - var img = new Uint8Array( h * bpl ); - var di = 0; - - var starting_row = [ 0, 0, 4, 0, 2, 0, 1 ]; - var starting_col = [ 0, 4, 0, 2, 0, 1, 0 ]; - var row_increment = [ 8, 8, 8, 4, 4, 2, 2 ]; - var col_increment = [ 8, 8, 4, 4, 2, 2, 1 ]; - - var pass = 0; - while ( pass < 7 ) { - - var ri = row_increment[ pass ], ci = col_increment[ pass ]; - var sw = 0, sh = 0; - var cr = starting_row[ pass ]; while ( cr < h ) { - - cr += ri; sh ++; - - } - - var cc = starting_col[ pass ]; while ( cc < w ) { - - cc += ci; sw ++; - - } - - var bpll = Math.ceil( sw * bpp / 8 ); - UPNG.decode._filterZero( data, out, di, sw, sh ); - - var y = 0, row = starting_row[ pass ]; - var val; - - while ( row < h ) { - - var col = starting_col[ pass ]; - var cdi = ( di + y * bpll ) << 3; - - while ( col < w ) { - - if ( bpp == 1 ) { - - val = data[ cdi >> 3 ]; val = ( val >> ( 7 - ( cdi & 7 ) ) ) & 1; - img[ row * bpl + ( col >> 3 ) ] |= ( val << ( 7 - ( ( col & 7 ) << 0 ) ) ); - - } - - if ( bpp == 2 ) { - - val = data[ cdi >> 3 ]; val = ( val >> ( 6 - ( cdi & 7 ) ) ) & 3; - img[ row * bpl + ( col >> 2 ) ] |= ( val << ( 6 - ( ( col & 3 ) << 1 ) ) ); - - } - - if ( bpp == 4 ) { - - val = data[ cdi >> 3 ]; val = ( val >> ( 4 - ( cdi & 7 ) ) ) & 15; - img[ row * bpl + ( col >> 1 ) ] |= ( val << ( 4 - ( ( col & 1 ) << 2 ) ) ); - - } - - if ( bpp >= 8 ) { - - var ii = row * bpl + col * cbpp; - for ( var j = 0; j < cbpp; j ++ ) img[ ii + j ] = data[ ( cdi >> 3 ) + j ]; - - } - - cdi += bpp; col += ci; - - } - - y ++; row += ri; - - } - - if ( sw * sh != 0 ) di += sh * ( 1 + bpll ); - pass = pass + 1; - - } - - return img; - -}; - -UPNG.decode._getBPP = function ( out ) { - - var noc = [ 1, null, 3, 1, 2, null, 4 ][ out.ctype ]; - return noc * out.depth; - -}; - -UPNG.decode._filterZero = function ( data, out, off, w, h ) { - - var bpp = UPNG.decode._getBPP( out ), bpl = Math.ceil( w * bpp / 8 ), paeth = UPNG.decode._paeth; - bpp = Math.ceil( bpp / 8 ); - - var i, di, type = data[ off ], x = 0; - - if ( type > 1 ) data[ off ] = [ 0, 0, 1 ][ type - 2 ]; - if ( type == 3 ) for ( x = bpp; x < bpl; x ++ ) data[ x + 1 ] = ( data[ x + 1 ] + ( data[ x + 1 - bpp ] >>> 1 ) ) & 255; - - for ( var y = 0; y < h; y ++ ) { - - i = off + y * bpl; di = i + y + 1; - type = data[ di - 1 ]; x = 0; - - if ( type == 0 ) for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ]; - else if ( type == 1 ) { - - for ( ; x < bpp; x ++ ) data[ i + x ] = data[ di + x ]; - for ( ; x < bpl; x ++ ) data[ i + x ] = ( data[ di + x ] + data[ i + x - bpp ] ); - - } else if ( type == 2 ) { - - for ( ; x < bpl; x ++ ) data[ i + x ] = ( data[ di + x ] + data[ i + x - bpl ] ); - - } else if ( type == 3 ) { - - for ( ; x < bpp; x ++ ) data[ i + x ] = ( data[ di + x ] + ( data[ i + x - bpl ] >>> 1 ) ); - for ( ; x < bpl; x ++ ) data[ i + x ] = ( data[ di + x ] + ( ( data[ i + x - bpl ] + data[ i + x - bpp ] ) >>> 1 ) ); - - } else { - - for ( ; x < bpp; x ++ ) data[ i + x ] = ( data[ di + x ] + paeth( 0, data[ i + x - bpl ], 0 ) ); - for ( ; x < bpl; x ++ ) data[ i + x ] = ( data[ di + x ] + paeth( data[ i + x - bpp ], data[ i + x - bpl ], data[ i + x - bpp - bpl ] ) ); - - } - - } - - return data; - -}; - -UPNG.decode._paeth = function ( a, b, c ) { - - var p = a + b - c, pa = ( p - a ), pb = ( p - b ), pc = ( p - c ); - if ( pa * pa <= pb * pb && pa * pa <= pc * pc ) return a; - else if ( pb * pb <= pc * pc ) return b; - return c; - -}; - -UPNG.decode._IHDR = function ( data, offset, out ) { - - var bin = UPNG._bin; - out.width = bin.readUint( data, offset ); offset += 4; - out.height = bin.readUint( data, offset ); offset += 4; - out.depth = data[ offset ]; offset ++; - out.ctype = data[ offset ]; offset ++; - out.compress = data[ offset ]; offset ++; - out.filter = data[ offset ]; offset ++; - out.interlace = data[ offset ]; offset ++; - -}; - -UPNG._bin = { - nextZero: function ( data, p ) { - - while ( data[ p ] != 0 ) p ++; return p; - - }, - readUshort: function ( buff, p ) { - - return ( buff[ p ] << 8 ) | buff[ p + 1 ]; - - }, - writeUshort: function ( buff, p, n ) { - - buff[ p ] = ( n >> 8 ) & 255; buff[ p + 1 ] = n & 255; - - }, - readUint: function ( buff, p ) { - - return ( buff[ p ] * ( 256 * 256 * 256 ) ) + ( ( buff[ p + 1 ] << 16 ) | ( buff[ p + 2 ] << 8 ) | buff[ p + 3 ] ); - - }, - writeUint: function ( buff, p, n ) { - - buff[ p ] = ( n >> 24 ) & 255; buff[ p + 1 ] = ( n >> 16 ) & 255; buff[ p + 2 ] = ( n >> 8 ) & 255; buff[ p + 3 ] = n & 255; - - }, - readASCII: function ( buff, p, l ) { - - var s = ''; for ( var i = 0; i < l; i ++ ) s += String.fromCharCode( buff[ p + i ] ); return s; - - }, - writeASCII: function ( data, p, s ) { - - for ( var i = 0; i < s.length; i ++ ) data[ p + i ] = s.charCodeAt( i ); - - }, - readBytes: function ( buff, p, l ) { - - var arr = []; for ( var i = 0; i < l; i ++ ) arr.push( buff[ p + i ] ); return arr; - - }, - pad: function ( n ) { - - return n.length < 2 ? '0' + n : n; - - }, - readUTF8: function ( buff, p, l ) { - - var s = '', ns; - for ( var i = 0; i < l; i ++ ) s += '%' + UPNG._bin.pad( buff[ p + i ].toString( 16 ) ); - try { - - ns = decodeURIComponent( s ); - - } catch ( e ) { - - return UPNG._bin.readASCII( buff, p, l ); - - } - - return ns; - - } -}; -UPNG._copyTile = function ( sb, sw, sh, tb, tw, th, xoff, yoff, mode ) { - - var w = Math.min( sw, tw ), h = Math.min( sh, th ); - var si = 0, ti = 0; - for ( var y = 0; y < h; y ++ ) - for ( var x = 0; x < w; x ++ ) { - - if ( xoff >= 0 && yoff >= 0 ) { - - si = ( y * sw + x ) << 2; ti = ( ( yoff + y ) * tw + xoff + x ) << 2; - - } else { - - si = ( ( - yoff + y ) * sw - xoff + x ) << 2; ti = ( y * tw + x ) << 2; - - } - - if ( mode == 0 ) { - - tb[ ti ] = sb[ si ]; tb[ ti + 1 ] = sb[ si + 1 ]; tb[ ti + 2 ] = sb[ si + 2 ]; tb[ ti + 3 ] = sb[ si + 3 ]; - - } else if ( mode == 1 ) { - - var fa = sb[ si + 3 ] * ( 1 / 255 ), fr = sb[ si ] * fa, fg = sb[ si + 1 ] * fa, fb = sb[ si + 2 ] * fa; - var ba = tb[ ti + 3 ] * ( 1 / 255 ), br = tb[ ti ] * ba, bg = tb[ ti + 1 ] * ba, bb = tb[ ti + 2 ] * ba; - - var ifa = 1 - fa, oa = fa + ba * ifa, ioa = ( oa == 0 ? 0 : 1 / oa ); - tb[ ti + 3 ] = 255 * oa; - tb[ ti + 0 ] = ( fr + br * ifa ) * ioa; - tb[ ti + 1 ] = ( fg + bg * ifa ) * ioa; - tb[ ti + 2 ] = ( fb + bb * ifa ) * ioa; - - } else if ( mode == 2 ) { // copy only differences, otherwise zero - - var fa = sb[ si + 3 ], fr = sb[ si ], fg = sb[ si + 1 ], fb = sb[ si + 2 ]; - var ba = tb[ ti + 3 ], br = tb[ ti ], bg = tb[ ti + 1 ], bb = tb[ ti + 2 ]; - if ( fa == ba && fr == br && fg == bg && fb == bb ) { - - tb[ ti ] = 0; tb[ ti + 1 ] = 0; tb[ ti + 2 ] = 0; tb[ ti + 3 ] = 0; - - } else { - - tb[ ti ] = fr; tb[ ti + 1 ] = fg; tb[ ti + 2 ] = fb; tb[ ti + 3 ] = fa; - - } - - } else if ( mode == 3 ) { // check if can be blended - - var fa = sb[ si + 3 ], fr = sb[ si ], fg = sb[ si + 1 ], fb = sb[ si + 2 ]; - var ba = tb[ ti + 3 ], br = tb[ ti ], bg = tb[ ti + 1 ], bb = tb[ ti + 2 ]; - if ( fa == ba && fr == br && fg == bg && fb == bb ) continue; - //if(fa!=255 && ba!=0) return false; - if ( fa < 220 && ba > 20 ) return false; - - } - - } - - return true; - -}; - -export { RGBMLoader }; diff --git a/examples/screenshots/webgl_loader_texture_rgbm.jpg b/examples/screenshots/webgl_loader_texture_rgbm.jpg deleted file mode 100644 index a8c6d6fac82191ed448a7a20add27de09de91d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20867 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 RZ?_fy{qy?&*d(_`{sCjhgns}4 diff --git a/examples/screenshots/webgpu_pmrem_cubemap.jpg b/examples/screenshots/webgpu_pmrem_cubemap.jpg index d27abade4c575f145b0be6fc2ecddda4a60d1217..ed2d6112c7e91b583d7d87d82a4e98ad1cf24983 100644 GIT binary patch literal 29405 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 b`V^I_gtu0B$5OW+T_C)Ny-0uZ<-`90ovHq1 literal 9665 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

xMGx$Q!@xsyU$8% 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 diff --git a/examples/textures/cube/pisaRGBM16/ny.png b/examples/textures/cube/pisaRGBM16/ny.png deleted file mode 100644 index 2bd94f575b109e5c6936e3ac32eaf23f6e3ac720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160270 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�A4 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

>`v7Lc9|2e@39(PS;hKw4w$V>NMA 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%0A(T$Iq)jD>~12TnNQ*pL@gJP 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 JPDHLkV1oEL8eRYZ diff --git a/examples/textures/cube/pisaRGBM16/nz.png b/examples/textures/cube/pisaRGBM16/nz.png deleted file mode 100644 index ef12b6747a80bb96957e607d07b4204313f2de20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168687 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

Q39d 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

36^xfHM@oN_;8jtB~8)GVfUw&$L`eM$tYVBig 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

  • %Nq6KK`E=N`Hi&E!2z%q1)**pC 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 Hu0mjfi)pY? diff --git a/examples/textures/cube/pisaRGBM16/px.png b/examples/textures/cube/pisaRGBM16/px.png deleted file mode 100644 index ea9ba957269598e08c930c3937b26c9aaf1eb08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149313 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�J*n#WY* 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

    0XtkKJF?{a=LVpLv?WH?h+~7=#Q$q7b$v z`-`4!N6ds4?c;_;jbRaP_GYU0N3Am!e~$69rO84wfOH?{*vv8<@GT|}vpQEGum&Xb zFp0?3Mr}cMc`41=(d??5ibtDaA{@W~G;=T(-6Qd*o?MOx9G($xowoc!eaZ6L9<1cd z0jSr0dUg-?RF^aPN(q zluVN_lQk{5p{0xA!|RCm5$7^2^6)d`e%1G~Ol$B6-!IoQay*>L%dg%N2S&LFuaL|Y zq^nhXa+MRI*Oi+M1VNwgyn>|#$-wn z_Km2g4)O?07vP148>unirl)}j%on{qJ^za*$`R+6F@_`D?*-a!YY0Q3Y0yzZ62p+l z3_OUL*^!!LqX5K7EclJ1u}YZ|E>-i0kNR`A0&D+tnPb5QzLo$v$#-k$Ylk3d#55X2 zI;`WXK0L)1fv;UG4AMn2dB@7vQdTzZ+uy#n7k%_pD;}ntSOu2s^Sgf7$k*-s(Pqpa zd9+7-Xc6|Fw!-q9X*d}^&67Eg2CoZ?yGPD87S4P;RDFYTV?`SC9cPL~*T>WP&izqz z{nmZ$8WSP_+vpL{>3;A;UKiB_D2g-ws7@23Cx>^QB@)sqEv??Y zRH@1C?iLmQgZUrQ<9tkpG>>8!!Y%^32muSjAXOcHX%v zx4!Z%tNDXJE_Ua(1jD;BINFqAHj;L5ECqOdYX3+0y7p*8vgI0QAgKtZz(Z4;|IwpO z`TF%YWw^a3yZhU6{NO$5ZZel~C`A}H*77F^3qqSzZC^`}aX@t*^AI7*pMUimvI+FI zegCRVHy_KkBK3Gu5d%w_56Cx2}FiZuf@rxH>=%#eRP6}!=_E6aE!>X5DWej|_{nqGl3@c7wu0vC|b zdb&y=`35yG&gO=u5qRlDDH_irWpe4J4~^$%Qig~}zgtEzh-1ACk;4on)r1{eK(#9? zlC7hOY5+RgF&I*Dn7nGsjA6B?Tg+?VwbbFJRHpB;c*n*xPAvn33eZFoz^Z(jelIq z3(IMVyg5$IQSa_C>1G)PW|%dJV?%U?KtPDqZ``@BI`IzRzY8R>v9||rvm;YLzaBn& z3=c3Ejb-oXP~N$AMb-iL({>{4`JO$fUxz< zOqQfCcXtNn`Lm~}>{n?+9&CSQwbaz*lj-u$z91M}aBTFfuhGbml9B>kJ zE>obij>?MP#zxN<;MpcUov?E>oXZU78Hbk(6RuQ>IYk3h#ZIN+vGZ9eU;|TW&yM+$ z2s1GB$Et$Vow6i1!{W~ZRWzksElC+jsMadWO0%ZOfyALc5DB&RwAv8(ntXiq#ukjX zQDr7)zF5r5i|5zKbk$Iir8f$-+BnzR`WdM<>r!o3DWoE`dR5l&S@vuu+Z`C4qb{CP zMk`r+{k{xwP5tRiJ0fj7+eA7oMWCKWy(mq*m!zW;IKO5V_Y>%B+#krj?G1eG$-}J! zAR$|;5|S(`FM#JhnGehWS+Z1d&BM+%5I|pR{+f(XDSv!X6-Xy-`&#)(AvDrG!}tFD zi*<+IHtuVajMg7#+Oem^7Hxtc#ODF%;Z?tnbXaWK(@WU!*`#D~Q%fl``deFr1Cu~h z)t^8o2rGF=v#z)yjbc_g{`6+E$aKyT(h@n0b&Qfx4q`^vFu-(Zw1xnTi#e>qQGX$F zrks-d$77vW$nHHFqdLy1mS>#rTby!JfFWaie>n0j<{ElTHU>uGnTa3{a7Y{JYP`m? z*wer!AtHh7D54Jr9Yb~vBPF091nJQ>})a!2;aGK8@pyNr$NDa82~YVda~ zi{hd2Yo^ITdi9uor&i-H{`9BhORwLx?mf7NO;VMFm6T?CRi?PN`^QJxQ;>jH$hv9a z+yjn%<7|QN`S_>g?|pPlZryz>?{y}!9(5$Ft^jW5 z<{G=xJQB2M@BzJDHz8}MF3ZNvo7M<$=-#zE5~yi3J+7;?f}-(lU#23gZS( zAa}R-Rf|7K!U~Sn%4W6gn4+r=?l%`I2U+SfCLe{co$~guF)b|i^WjB5qQC&7vB zo8#eB%Wo73W$!!b)o!J#;Yxw!SUZIPS^ zWE_!m(!;g7lEX&q^k#}?V^%^Hd+aohO=3_oD;>O+rp1Bhohs9mM#fXa(nIKX$Z{;6 zjn42>fslmC8qjGRjj$Ql8@cL1|CzHuc(NWAX%GEp{=f8Tc?#vbmJ+|>q7m{GwB0N`h zTnz`<6vT$03yo}4!iF!qhOzg)j20K>RVB6z;e(s={Y@XU9HYp~@(NJEsX{^?b!Qfhlnyr2ZW{8? z({dlb7o{27%EM+IHlL1ZKL7`kB=EhA?;%T|X-AGVWC_&>IxL0a$!tul$W2Bzs}DBA ziPd^oPgZ1qciVAsZn?A_?N37uJ+!n!<{OD16tzfagWg;x7ReMYY??sK2YBt{UKOf! zIh~tZ&76*-ieCEg2ctjuqpzuU0EbNKPzf>@;Z-g+5`<9-A$<;R2^?)%4cMCq&t%6^ zva-A^6?l`cyz-`oY{^VclDUlZdLzK!J(ef5EtCnVRH~qCKgPQ&t84P1c0t}6SkjZ6 z6h|8}wX=90i0hAsa_aj&Y2CWa)#NjxQLr(RjaRGXv&}41-l$>5$w=OhG zvb}pKEv$kxo# z(P_+eys+Moi{+dS4tcP%C)W|O?7|bI%Pkm#tbFiOpOI3#1*5ql%V#gh+W8A|rq#sx zI4ZRivD~q9X33&4v`QF5~HvRO>5vK6z=hS^!C&ayR!(B>5VVc+~`qnW|3Ao2c*7SPe*LFsJKZfXXDy8%?&mT7s@^?<%I^yb9A*y zA}$C)_}vTZ#i)s!!aM;x04Kg_5Td7_DtRW-c$sak-lExNu1T21kkW-Zs%`j@Y7i*Q z!NL!{ER6#bh3mzHY<8!rZRcwzj-!aA&R%WT7zhn77;31ps_D_^IrF@ZN4_R6X&mAS z(-p{4C&f(fbb{!`R?^~PCC&8JjzrUWMq=|L+hxR{La32y(=+B{QdMUrQamJ{3HH61 zl2p=_95xs{S>UKf;N>Us)@*;*8l(!*Umd2RU;Kx^FNqmoI$Ntbl8qV)oQ((Tf2OAF zAH5H}2W(6Uly!hR!QrdfDxhzQARx}9U$ zIOypRlbD#yb_d49c3tUodb0161D}!K{qt{1yWNzk4fNFO$?pDG9vly3o7Z-DBoBIH z$(0*&1;6jZEAIe;-`wxY&af{xuH2CS@15&%qE?p!#4Ue$dspmI10hCM2Az(io9lA! z#3iZ3LwN#5Yo%0@6 zXm={xpjD(6&+g9kTQV3Q%iwrd1~3497*1bBRcF#iY~LAl@Eyh(2LJIFyoKosC_&_2>Wy;Dc?ZW26k|Rl-JRnXiNmQ^Z#VKPy|0n>;Wx z;#el>2ZkR&FRpnC%6bK6^J;?cWI4KfIJTZ$EktZAV#&svo5Uiaz2_MvSMns@uQ2GW zfxvX*g$vm+g?v;f(oxE$KU{nAZL|4F`DF>j(yBoqC(9WaftjW4%VJuLJ(7q zQY*{+20VTZM$ILZ;8g^ina~#Bhg^e;RerNkI!M29-K(Qx05HZVMN(hYa#oC|9?rW0C zl@JSNjA9V)IlNV_l#%nNmgM}&bvd&P^s&~GC(o?OfA?#@A|H9~DYp`LIuQjAThohVIgc&?WT*H5k>ZmB9qJBRYyfAEJg z$Y$h^cedrIyC;wLXE4AbSGK#d3=jL>{eAh)qrSYh(U(;)N-)`ca&@O8uU~%* z&)${WI|ur^8%HB-q@?s5R|@5(-0Mbi?eP&duE@Q^0XC4)=YPDjFW2tgmOHoa%4@f7 z%gvj2w;<#IKclSs(jymEcQtDtkGCRfOZw3e> zMU8Ht$3XWILoSNe#v@Jl&M}h~M;9^N7 zTxi36=K1yL`cB7`_QJnuvlYk8Pq%cS!9tjm+yi*xwR}=IT=C)Y)S79N5_Ja5Ig^W^ zf~0IVg1aA0jF9Qk#M9&>D-Z*!sW2>np-2H*w_qUd^dh-XW=YDob~)E7Uy5!X+44kg zWU&YMao@L&u@lznsfg^XC^CjEfbl|X819Tsg(IDf$#J5f3AiD=#HL%6>E6CYPdFQT z(#tN%Uw{73WtWDFa$hk=y+8`y{6s#|$;~X+&KavEj7~f|kr@A4Nmt9P-R?jh-MXv1 zaR(uXn=i?6XCzz42dYrUJPY|9Q%&f=1NZ2CSLCfX|62azS6`Evl~D%U{_d{KW5%#^ z9$s%YH(3}Mw}Lg+cGe-{cOPK^a}+sj_;P(&@~u0*9kYUI&2qV%J7$LU$ zV0{6uGf5ZXTx~n8GYsalxQ1;EYy8N?^PcE@gCJg%?(q&{`?8E@L#;@8ff1J(d$tZ= zAu@?0u4ky40eZ1taH*T8mj|h6=kF}*D;IIK%p@ppqT8yC~i$0 z**>0$^YhQQY!y;mGz9r#V(^(71yjm0B|MV=My5#h+L`%Rk`ohTL?=!r+MSB( z=#{EP*$t?$GgRxG#iCmQ{%W{5kDZD5#isnn&wok!O1Z_cILZqfE)4@v%SH;d7!Hsb z5yVWp>5N0N;Qb>k!bGMBl#`Qtx2|Ggq_uO8q^Zj4NqF}Mns=DOi;l-5>A+Bs@4mm^ zlkQ+9yGLWhgh{Cui*m5H2k-a57-x8f9xS?!dKb~;TLPPl?ba$=PH`6+dHk)uv?7&q zS^oBm=j7e@Zpt85knj8G$E8%r>1+cUi2}!o7qCg(wB!*sWDy(Z@I9Av@fsK3v)C+2 zgl!ymmczfZ;sRZya~Y{%ljU)I7vIYTZZgEym5LM*!#A5vsW+DJwXBNA_3E-tMJnct z(po+t8NmHYrK#118l}?l{!*zX*cS5+H4*hIg^nb3|5*QkGjEODDa$9_{!keWKWWlP{Qj;)z0Ge zDYEqNtogbuo49bzDR^-=jj+niNj8n+z%UdMCQ-$QBrpEng#oJI9J8*O6wUio!1>bf z=yRy0VB+k`xE8_g@vklu@)cx6-OBk+YIZX^2FYjwNk}2oW zlfSrLMqHni)jT#*A;qaQ-<@SX@(p>YADFy=mh_ZBWMX?JYMFgz)_S^#^COizHl;Iq zeq}I;84bm1-lu^CI1c*i#<5PYag?xRbkk#@DKC;JL8z<72GD~Bhn0r;+<0~pm3p{< z-qa))4<^2jlo3X)VHPDY8!(E?>Icz#{CSm#CrAW4UIpUyksfM z3{Hv39LH_O0!0v+bV7CYxo)!995hVy^#9YZ{}cJ%pZl-n;~)CC@(bXUiN)hG!w-*_ z&~8;nJLD3{Bs^_Gi8o4k!iFKbjNx|-0W!wZu1t`rLhRekU&SCQv@+`Lk$z(V|xU7?(bM)*Ci*iM!WS8<)Y}UGz%M~e< z>QXF}q*CHgQ6L`}m13nW<=PT9YFi2{Um|2Fe0sqeP^)Oxq7_tg}pD9#y zL+9~xskyFUP7a@u$ybzElmQ}O`*|G3gCwvN(2WI0;qrYj067>Z=b!$>1&g!T8~CaL zKG(6SSMhxr8=zGL^em^P4Oq|DvK3`3TCjpVJO3f&p&#f zmKfUV_tNYIL^c%7toH z-refyfG^eJUkry}cOub=hA6%{F4cH?icB0C%zRaYMF>UNFk^@)UOF`ftUITYjIW8x zDgMq$IB;|FXm4b#7E@Bjy?Nv(Wt=HTmz<83A$u+DC_kLgI-fEqfk{Y)5Qo??dlN%_ zE*4$cnJ2M%ri!*^SoGg_VO3r@)s#egMfOIH{MDELQu+)@BEuageV3HNbM1`IhYMse zgjDtJk{b4eS`Wvf&k~lF<=}8zic9O_VsX^k%Q)w<*4%eCAF7cZ4ZAWOP9++3WI8yO z-acaWjR!C|d$N1?hHO9Hl!M{K3^{=j=LV_dlg7*7n(8p+L|aUFk}pq==FxDbNyZ49 z@13`=$j5&0C$Y&=YM?m9SdDpHm6l8?m!q>Oh#5DfSQ3+z(yB^Juw{53jRrSA2WMnq zs57ivbL=+Gi-MZ`dp4Wa*K)Jx;3+LF?FKL)W{zGAf1`2}8<>(X9^BaMu+s!D5KlUu z&@v-GoD4$JoYTymVDnRqlLo`Fa`_xyj~uLo_Y#N7|k+_ zTG=fq5+Hi2VzZZlc&b1O)nZAiH6Ruum}(OUX-QUEtFpAbE{#T8>dj@Tx0c2EZ$G?l zQ=DQR8Tjml@ACkRoHs{xldj8w6x`r}Zz#f~_tFbhLk2b#O;jE%)C5H! z2KrBe1@7(=zy}W>%Ukc=kT1S|T|WPXuSxf)tL(%;2|yNL zUrD`WHG>U59jIYo2u0Y>fw2)6Xxs>Kq!CNTfdcN{yQ$4KM+XP8_wc?PAM8l$#3^j> zF7AmZlz<|MgnSEjL{cux$JZ1WJ(x^%E`2Tu!;b4%?) zLSJ(a7K~Y#NUK=pjobI-+%q3G+;`8{drMfs@mCJ+M}Xh62F>}4oT8IL9Gj%aPE*kb z*TE`>ZA3h|fhdciye`Y|>Q!{ZvQ;68GZG!g=h%1S_2WiuH_m(k$E@Su$s`qeIO03d zfgM?F$XMLbq$a8TL=c$_HZ7iW1_n;`1>&LxA>qVTRFvb}$fIzn){JY-rVUkFxg?gY zBr=t*H?!xp7r|y38ONhzNRW?Ug=$pD?zAI?!rJN^;2v^HwKflF9wXAP^g;lKRUcI_ zaw5|ZNB#!hlOdbWGNaB__%u#J90h4vJ`40U9Ay^seLN>mY@c6&!tS&fT>$6rerQE= z0F#+zV7hOpyZSpX)EXk?yO``VGTwoP0&MLh8%;O7vIIpn=9Lu~m@Yq4k~5xI`~Me; z!e*qFA@@X!`u}IJ`NKsFPoH+Sk(W73e{3U zJ9=-cYkmLucJvmGMS+v=Ki7zMW3C)_M>r2x&MuYZ_SBYxs4Op4Jy~-d`S!-h>cVS( z{7f^d0TR;laDUo@)9~6bPVHkZ(~CefN!>VDLgC*?T2YD?pAeJ_OMcTehfelp~W9v1UrxbamSOyW0w$#QneBc^nHl3wPqC1`wg-w~G z(dv(5DCJz!=Cc>WV|eaPOo!~GlWAjEk~BC(jd7*vvdl-L$DEB5_?p<(9Cyg9y$Si^ zPD*9MC`o5KkzS{z65>SI>bP8)b4qarj3%vf;IzlBN^iqva`^6977 zqBG3`;A~kgwTp5d8}a(i!1^qHKUG8#D%YQ~Iy&T$215cR|L`HvtFtslnlV{_)}nf# zTKxFj(~W{$Y**FWpN7%UL?ux{j6$1cNFxbLzG@ssntPZo&h1Pkt=E2jDX-UY2Jc@j zXO*m>04Xa{0=$g+2M8H0 z^*T-5rwkS*%eTdHO-`SGN|wuIEhU$7S=H=IlYY(3s`K)gQ<$pG9hHupkPSw_jJOBv zQZS^iP(uXf4B`eJ>U-jG{ND3)PkFW(Js;pkB`mYi0#!-EeIC!ShCGBvp{hx zcc2kc#n`cz$_U4@6FusVr%{QSgtDy**r@n$tfbS90`>#S93EODz zW34f9t5cm4W)`2L(sE`BHT48^?w?~wWwL%k)h% zi}m@p9$PmMzh8m}KD|`bM3c5q>%2Qr0SwjIj|?-AsDTzb)SDA&9I3G|WxhFpQa4PX zgFARrXMxG!tC0vzGLiqFjFz`x3dW5*xFoRv39B?VwT)4k<9F|C=TB(hm^{QevQ5Cl zjT>NL3}Y23%sWCzd%rt0a2wU{y}nGjjc5NA^2?xpDPvS+1ny z5V1Cq)$aCz-p|+HcvHIwJ)K+`N^`j-@7>+zz)cx)<~xZzfO7L;PY%apIp}uf=(qz| zo6-LGwbPg6i+}bPDkiFGFjy#@7f=7$YAwkG2CG`DODdZMVkjWQsA{;8;AVqIDpe}7 zyn04j?Yb0U7@7z{zW8r{OG=0-i4c<5ILXPLLc3x%E{#G4i);o&h;vQ*eYfLKvHdghnS716YWwbI`tbt{!gUz)Tb4XRyuMvOP5j366zh(;IUH z3rJw#Cnr}8r7 zVBUbCWinyZewkQ!KQCbGS`0Nz;dL$?55MAj1I!H~NpL%xL4i>dh&oWthPvyFdL5S4rGlL&#>=`Wn?uU!tMb>wz zzzUP_?@vFw7F`1b|B2_>Rki85~T`*Lc$Z-F~OzG0&8Y*&NN`E?} zBGkV-izFd0DyEaMY|Z|2N{cGwvWqQY`mq^~*lKWm!z$zkW!M!MrB-vJLNjylyXRnx z0~ZRX%X*<18FsD2y?I)5W`cXv$fQg972NIH?A$F-CF9Q%IQ!(yp~rI(h@ct%Vq^Y z@k{5|<*9QgWcAz=Qd(aV7n?ehjLF)i=jG~~-_b=C5+-6%77MPdpE|1|nw%SWdVO7b zosK3X8@Zggg_O8?ygySwxO1%cqqDOm2L}i8#_NA2qY*aRY$gYtBgtE#wm#>w36;5m zzXQU-VohhHdGeeT;%OR5Og_9b!yArDV_qQ8 zd|yiC)h!Mi!Dqx-+Qhl&`69g1m_BX>k!VPQ>meV5=72Fi*E2UG*9Z+1n~(_WDHbAX zlpw(qL=2#uJc5bf^KDuhzv zgSp(5XW^>ryATu7t}vXqO-`#U>qtE&_u0eP=h8W7l=Yj?sTyK=D&E!T1Omru2zr>EpGAxVslPw>06(EdKDf# zr{-ep8#SPdO~mem^EkEhfbbXbo@r>9dvu~a5ib7oi1n#_OIDAyfc}Ic&SC>HnL_JI zxhTqfy>F4i1u2R4j>n}aa%KVlbW7SsVu>LGYtp>wU3Vpr>PAeJ~%(DR|=c>UltUAcUnQ8SEcR zw%WuZNb2)sLXhMXw@?z7!XX(~Z2TO92W4XsYsyZ#AcfYtoH+Z0Jp0o3ND?7Kq1qPd z?nsJ4WSN9kTJy= z;BT6kh9L@KChx-yOe4Y>0Xja6o_Mi=b$u~pivsPYWcO-J6Oy*f@fmX+Bx^i6%Zauc z16%bo`8|ne#bG84Cn<5}Yh}t(p-;uX%!YESa>3*C8QOZ@P&D}Vbwr&WhZJw-FCxtu z_$E4Yw`R`_H@sf94=R%Q6=wwxM`hmN^Hek{ruOdj&d;H`014d(&eJD;SOE z>UCL*wKbl%^~TU*GZ$gv!AKWH7?{~{b4mg;GfG8aeCS`?pU4sd|B03p1BI{-kj4ln zy=N69GoM)LV5oI)<_M`4%WEX!AnTDWzo9lV+4A$BdLjDX|Jk2NxxFM0A3cz*?M+zx zkwghs`op0V;GOsP_9d1fr4$>|&B)bP{#0huvDW&j>7T~pp*oPEq&jA1;+)AdUrvAU zBQhEEW!OECXfl%Zi_hwPEYQf1%7ypR<8w%5#H=#H0M)6R&Q#_qjq{-Q^rk&&G}}@t z7o^#$O1<62_og&TMaky#Qpex&?Nf5)jaQ{V!iE@ovO5iAckft6@OBrU|65XZ)6!mU zt2Tcwn^ksSQkjWlw7~;9X-yD1s*z8*v6$geFp)f;;#v6WNH`je!l1C`;twWT2IG5; zG`FuPkw%9LJe>yo=4^tPfxyXhN?V`fxGs``T=EqbhTac7t@B6TRAXZu#z_qUY;1B< zVmi1pt>rnlkkt+6g|<4ccru|O7{|Ml7r>+-A$C&p12Ls2r;{1Ydr+F4A(@@D4atb? z&4@!zC_|ReL?YkkC|4q(1SFrbT|^D42IcD=$i_1pT$69My%?flYblFv+&6kXnxIlHnM#kVKC02Bi%g<|?Y+#@Q+8VOo1RJ9 z@$cH?pb5>u4D#f(RTXZq_4PDb9BUrY^HV;Y?8WI^rLQ$)Adp)Sj%fRM>_}UYeM91) z_L?fb25Jas znTBGHG<-f_A{_{)&`w64swufH77;w^4q|?*wDxKp*d|HOunW>#wRV{RE*(xz0ItMX41FN@-1DqgV-6d|;fY zhHJAUbBgC?@$_ zMs%_ypAS$GD=1prn@zNw$WiO*bQaGT>kik#@@F!UQ3k<=uh z=m@#2<{@GU=0H*^G^(LM%rc2@#`!cj%sUX#(E0IaRgp4$1U98vi(kZb%2HAVMEE{M zJMCCYTZEa$V{6Jt;IoDw817J#MaPTOgpSHpdyo%r1#3s$8N6KzwPDCw! z%265g-7rH+65@wsq7Q zO1D4I+{P4(qfjVo{7v>B&$XDzOQl?sav>+T-~Oh?nzbB1&Ppx8q*)rC9g8Is zmj*(KDTVH_Fb;qu_PPVv-08@RpZpx2~Ow`B+v?o<65C z)`gO*F>`=;fA?@-IrUk$0th`;rCPSt&apwLW6zQYH{xv6)5%cmY72Eu;EMtlFa~_S zbXXj-?E@inCqvB{;KbCEskA$5-nbWzGAL)t8f5jL0z+l93ly)d0M!)oIo$|>ir@gj z_;a0`$1*E7WReOrpsNOe?&iIPM9C1RN)( z#=vk8nD7p%9pTLtF`8_Mu5yh0KU@14bqWcTBi!$_k4i zozX&?+Y1epruPgMza&l z44=XC4QtWYW`$56EW0C_SYZx;LMPlz1;oANLTuSNDd2gP!@e55jBT1_K5+J8^h*AW zjEV)T91E?-?_9OWO()mjm;T;QM!)yDud4bHOGNY@9P5=$WuynA5T;{>v4)4bdFvfH z-noNC9H|6!shX2_ZXd{De=hY}QIm0rY+N@S6Guc~gxg2GiQenePrabsa2t1SQwIdG z=2VF&(@|f>gF}U}RL)7qO`C5%VD`e3dZi)N7Pb3xvb%dA*>qAf0txl}wUIkFLz6qQu{L?_FJ z96xh$K)twEwg-$1h=oLM^h{Cbp*KCz*Gbxd`}T>SY|e# zw(n~F(HvMSlk~>?n`dI+(6JV3J|@XxEn;wze>kbtS{#gd0}>S?&lnq`1tyso1|$qu zL%nlC&(GFOz6yqNq#2+(#VjM%h!^xxf9xBB!u*DB%A6{srThewOk$ou#T%887AkW} za}1%Gr#@4?LnBt2SM=g&-@{%I=io`J=y#>>;Re^wN8J}bE??a}wyLq2<=UJ?ONFY8 z;T2Gu9h>3LzVa>A#hYQ{IzRwpjmwgVCXt1Z_;W_6nn)IZ5xF`F2o3i!rw(M@+N9=z^KVRvoINpRjgMe+-GtK(X za6KG*b@7=?vRto75gX{#>KPs7wR!h05Fz34fGV=mA2MfgsN$fEt!Kk7Jl{axXOeM2 zr?3%;*v1nBw{fLLUo!HQgm&27mqD+u6K}X{LJQ}?zjKjus3;5{c_9o5C%CU#HWxD| zkCS$l$YcAuzLT=hkD$&Y98_eDB;-_IIG$j}*xl2l-aIgT6NXeQdnZFrOL`>XB$#L; zA_l@?;*AOGxbg+eU>la7nK$4)k1g_3bad&Mp&XO<7>h-k#b?!rMku2d2uqD8nTrfl z*+-qO9CSufZItB;fAI}?j+AEpC)CrA7vx}n zTe668Ta}D>y&x{QRJPEwg@zV>Q!^3f_niDO9=%d)eF%{dz(mdrkmlG8SF7&dI|NidO&8g9KCd08Bjs(II(x<~uWez~8Y@w0B z_jIE;nwy$y62RB6C&D=z)XKlvx-TdrA1;g{IsH0y7{6oa?cqK~WKwdQu{VOqnlxhE zW9}K|jaYJ~@)JowoI=Ilv(l!%`XBr!mn=5daE_I-gtWwFYvwb0zu6%aldMy+PM{fj zx@7*$a)s}kO{hsiRt6SqBuDuK{`=KTr6B5H&d7LW9r>rNZML@f>J8W0yKhD;+3&NM zOcFvBhV;(W8xH`NpfSn{p?684&vuVb$A9lEWso@gT`e^tf<2(;cz@ zac`_SjCMwJ3hv=zB()VdYQ%E55%B^-h)E<_3alz^)RDEzPwPUP&-)rb7FgzlH%!4B zEG^XyaU>3;P^(D}29smq*iD!Rw2q6JNYg_M-orU|U|Hc8Qqd8{^hi@t)HugIF5dx_+`T9ctS)r9B!C2X$q0N2Cw5v^=RrU)I(HJ_y= zL_AwhrwUQwhXYg{rA0IJWv+w!^L;9_HUe?e;zVqtr>CV)d(n8O(ST!0sLro`-#L}c zrqG9{nN$OBxET{FJY^~Z&LZ<4E=UJ4F&ynk>)nRK&17HFGMPvnF1l#(4Hh4&WjM!_ z`Lv45(u-w`kLC{+z5S%l@>lf!>Xix0gkqy+V{%iI*H4*p9}725kxO!%`6l0tF;_Mo zhhUIA#KbS_x$FbLwWug5yUCbD(Q)S3M3(8!vLeR}8VQX!sIP>OQ1%ece)RIW=w+ua zM~!9cxI2++Z@g)(G%DJ!pRi4Wl#4fx_;xz86pk^jV|KWKICg~d{Q5V(gT>|=J~=kq z^G{!v42dz!BEtHUxUziyX{i*8nyfl^c1@P>8L2{17x8kVB$v*el(myhX;cswSDR8O zHe{*2ENf>^OLeI&mtS}R5WXWtifJ&eS#3+0%HzHlq_uiNTIGtYEU(I`6DMW;^jTTK=dZNe z(rUO;fLB{;R%NwX(Ybj^%haCP7XbV$_itW9$e~*Rajv6`xm-MHT3}*XxDJ1TK7Ar16G6<4OiJ{exRV>Ag z4T=$~kXBrYqBj6RiZBBVFu-sOrf0f)roA_1x?EOPrT3Zd?K$7g;gZql>8dpE-FNS2 z&vyZ%jSBX}`g>K{zNb@?Jd*?4+t=1Q??h;T>o6-jU`yQCJ-MaEI2Svv3DL6T&IK0rF}_scheNDQ?Qb zC!&Z0^6t0W8a)u2TZQp*yKUt%U|+wZlWaqMuEeod@!AHS5i8|wd|wl34mlHB>{1}= z=^!<0BJ8J#D-W*gATq%shH!mtrwzw4&rU#-E>FQSI^Xpp73`sOc?R6P-6IhoZ*vHrs zp8lRKMoW3`x5G??Ml%9npz1XF>>RU2%sHdh94*s(v(aqo_eKQ{Z4J`G8%yb}K|axAL(413XoNnXHS+r6jAV@z{pV4< zza3(56e}4i9zH@(N%u__ zAXfHSL@f7P^2Pu0bMBRE>+<`5^kq5dAR_40WqdrZz$Jz&VH!z4g)(p;s}(Kyu}xEL z)mTnI$k~u4K~3;P9$5G;b3Aw=g>I7v0SB4AcoU9j_k>!39lXwm#R$h!$`PN-CUE%t zlF!6tae78^=lr}e9KvBJCbe2yVzG!C;~1{x($y$tNrs<;++HDV9gZ zQb{S}5G~Em$^el@XXn278k^YACFJJF?OB*B?TZ)p>aTC(0he$ORhgNe#M*>#cv}+j z^<`#uR!k--7hnFmvewiQfpn0U50vT*Z|hpZOQv-6jNWj-MviTGOFRQ7XyLM6kEOF~ zb?l+1r(_$Gya385#Qnsr!h?&*D?xG*L`6Ptgs0d>w~8fzCnj~gVq}cP;zz@Z{NoI5 z&!=2aPO~~X;@%{S z6%0cUsUN2TTSx;3*rS9{vy;a0acWwSJ&JH@2L{ez^g#Ryp9e)j(IPv4-pA)NZR5nG_g{Ww$&gmd$J|N9I4mqufj$iktqc!A-lvhR-g11My`x$o}4 z@(c3++M~LI*Zz-EiuqKUnVjve78}W0q-;T~2M{#Fx$dDAIZ-^r$m04b3JNQfg_pZp z8pyqg6YfWU>sRF3=0mf)@z8|uxz&18zW9Y7a^F0A%>?0D4Nd zo}Q8b^6r_*F^R-N5|77K%bn2SOum3TJ)(m@{1fIqu_gk;cF^2cK~T2Js0u{DPb@hm zg|WP*GiIcqq;?h?fg3X$3`!~-RB#B}UE7-*^02riAAj~k5`w|lY_N#tQRE;yCq(&e z6pQlM;W1e+!I)-KSof-g+`f`|aMYNbcQLZ_z{s)Cxq1JtEFNBx*8YLy5)nxux@dF; z8ns36Y@d4W!?M1%DPH2>Sp$fMwD?6jv~VDxj)+mC4&20oy1&}}QC)(FK!txt6rJb8 z>1@~A3M`_5Y}Bgo>Mbpzb;+QM1Htwthj3g^SG_b{D)*nuHYwaLNkBEjW!sJuv4}9( zK1>A@8X;5e+{bA{uT49AY(G<#Sb{3(!kG?l=snNt8G(LqkRA5=eLCjNN<3Ac7mQWPneNVs1Yis3#^q z-qALNM?JK9W9Te1e7xO87p_L&__oTG)Z#9;{mZt5XWoCjd$t;A9TOb z&d3u#{Zn%O)-BUsy=ge;!svjNV}f=T7iZ-4x2~BNPbVqhSAuh4R}oD_v4U?kKQ|>HJBDc%Y(Ihh#>ZLPQ89m z)iq-buLlR8S8EUSc{Q3HDK}fP1&{61aC3-|e_TaHjph!0S%LuxQH-+MkiB|Yxd7SY z9}o8A^wNy%Jlv5)eqOqW05}IhvJ38&Y&Nd6)a;?x@7|Kap&4n`4`e)Q z>JW#MML2r45cb8e?P~t6kbYt)Sa9XxQoO}zDvw6h32H6JcBXu`d*<}j8xM64Ti#2y zM-}{p>t}&m+j~ZbiM4IXsMdA7O2fv2UdUtBgcuzJiPi8~Jb|7d;~Vw-JqqF?GZC*v zTuW49iDgL`>}3t$m|@G#u};?_-yGYr)Arv$%m13A@!yQL17bl39@h@}XkpGBYAeMk z>c|f7@bEJ-jAjHF zvNNyOG(xXgY^zcYhSy#PZ;6)O&UHyQyQI+8CUV|e+kM%IF1rt>kH~lKZkq8-%xr9~ znVGm>XW6;XWq6NTrKVVcrTIm9_tFi+*4|E~E-Ukgu=(#A=8ro#TuFGJAN}Fy<%wrb z$i>UIlF#- z@-mS|D!|?_Hbo*HM6OS=&OQCur! z)+q9^v@io>?3MGEZgDOc-_wJUK?sT`+GzC@kW#HwHPs`Wcu3+*grdG!Tvm$}Ie~Pb zbnAjl#1OfZx5S6k;n>QOTz;@A8F>A@YF(O0Gx!`?98%y4?$ZlvPANAB>%iVTu>i^+ zG3Zhw3AuP*p}j$Opd-dSm>n3BE)E#`_f3S@O+3?14^bF97g!H1!VN85SgYODHX9kQ zoK{!GSV%BSC(zf{8eY?Cz=(3pyQg_QCp!7z^vvw#t0CZC?y`_K81Yiz_dOdWD>9Z$mpW$?%+tGy@x=DmR#-1E9dYd0LgHSd zCz+tp$~{vMcVPL_6m~h9N$8I9d9o5Uup$pT@bnR%9Q|j%AX7j51$n!ZF}}%pdF7ig z%LCtx>pSzbY~k+b;(jfRM#3R&lMx;oL5RiFWN)W|e7vWX)W@DWChxv;%Ouiq98l!I zhgan0#fzqf&Gq!@lWyklvV^i3`8WUWzsg;Nw0(Lo7=<7XhYyFgSKdXATNiH~`5ind z*=GHI%3wzoGd^fl;5D-{Y&8*<2c%wWNxR*UUh_bo4|U~vkYn+*Ocv6rQBQfX97QkL z`^Q1dCt@;-G+}@J4%Re`b?Ga6Y{>7?+*(B>u*t%ah$MVLnH)5by<{a8n)5q?Q0VwQ(5V0i&U@Rq?aQjl;!>B{Js$jB5Aht%5#;DrgS;fx142t<$m zP`&n$#XuiPQ7x;G%Q5j@Pjh{qD*}Fcy`kl-5G#b^QG5&TAr!IEE7RrvKpi#H9w39Sug=IvJ}3yu;BStkb{##BtgrJyf(d46>9k!?A@p zWhBuyo;JxfOt)m7uC`y?(fq8Ri36wAh89R+DUB?^f+3jp{@G|(Adcl0)X(zj46$YV zaV^kDYYwCc6R+axyQ&Fbi;8MoT#Ml2JTyBI3S3e$57C+ey=5;xE(a$*VU9j_T9RWk z(%9dV^4gkw_ggQzQ>T_>b}??|3rW@(6}s8OLN{sINg>UODXj28ox&MSrIDrwI(>Rs z-hTVK;rDi(kj&?2<-zt{^HV?b!|t^^cj2M>@{RAFRS0oH6>YtePG=<;i^2RPqr*T`AQ?_^cKaJ%r5$Wd`{>>l4eTACclt zMJna0DhFpLrnInBg#qis18-HkvVL%&z@pvafjr!=%Y)4gxx2n0+dD;><3a6|q*N+t zTP}nHmd3R`Twj+0qLHYNA`~!sc>E8MpHGot8b6PDqWYdHt}{sC4Sz_-dUG(Mh{O~m z6eVehA>&kEK}(#kC+LQ(J>(P6D!Wp3d6XH4e2i?>=^P0TfJZ}mSNROtc4hUv-|vj@ zAVVekrBL=Jy>ndS_DUGz0PRv zWN7n$cFh=lF`XmT9n%4-ZjlSi?ON^wKM{a~5orbeJi8)2wq~j7+Z~a9x+5_hqkuc2 z3q1j!B53IZeHP7U3w>r_4G9mso+C#M2h$rZ$rFF`8y`Jt23CYmbN7%ln$#PO=PG7E zHRUZy24Bk@jMZ+HA0}%ob0tzcId&$1g@-tY8`$zQwmvX0G9pj#D5FYeXh9J{Wkm9* z&RtJggY0LvxX{K+ z41wBa8UhU2w{JK z+Vqi-PRw=7ZB0EWJ+{5QC9&z0RQlYAJr#{5CW8}mJcuVAJ0Y7e*fTID2GNO&0~v<5 z<)+OfZG}JLvDJMR3kiGWevBnJavW0lYnUU)^sr2y$OzUZSLb5|HLn`~}OT3C!WHusNw`Wg4e^}B{DvTP~!`XeFE;pid2`z*}P$RGXH zOXlX?RntKPkj6u*?r)p7-+Wy~IjW_S;?Ki4)EodAAbclm`Qhq)q!;9(3gVE4wP)*T(|WKX<>_oT)%S^#noN^9YW8x>Ey(JpBbGhjlRrjVYDfRW^jeA9i3+LefQ4z#<~k7AHN99KB-?5}zI3pYZy%@JJYR zBgh400JXln^~$Se?fz}^*{4s+@BZ=E&4(U)gw#FS_wFJRm@E{ei0==#2RdQc z)Yh3#Q$Lcil24BjW{O^)bMn5S%9M3Hj>61UT1~M8evLwvEjJid6(x>pv+Ke&w?}9+ zPzGbcgBInw>mjhz-3-I&XcAOyMkLYh^)#JOe7><1>9$NhqWlW_bk7DfN^#WlyXv8l zHc(8ZQ`dqcKcDj-3ZkP|=7=tztB+LVY)c2!V-uG_W6Nt{ErcV+TB~P^(mSFur!{d$ zjR zYqKcLT3xb{u*n`hDr>tfc&MCw$|&B!tJcyxi9O;@7LDWb%2P^R3p7kMNw$% zqBv|l;UTeKK4`mI!EZI{ia}r(g6*VErz|Fxl47YWv1CMZ>~;s;&GFt04Aqkh({g8R)4clbRr5~S??dmL?bh;Gjs&p;k~?}7!3LAXV02L(-Sxs zUaeg*QqWEo+vl7_Ww(Zfa9ms>Rgho`>w~@3=cJytyovZDVQgRLJXrf8T^S+J+EE`W z2N13&peZ%+8zFKXggDp})Pv9NfY-`vSrX6@m`~$)za^+qs&UWILfe^28H=AF$*uQG zFB~(zf$a>bpU^tN3=B!5T9X*U{OJh1 zL?JJ0_wR}{%HrVn8yjm9=i1lzq`tc?=P#abQd{93VRsJpUsSUqkO zUN4hLN(u)%hTK1*1e9JS*5p_#L;I!KN$pXyE09P;B^~!`wL6(jtB{Hl^ysu&Ae>Mf z1qXrx`2JS8hEygYiODk(hB2Okfy&~&EUIYk42I&;~PKdJKg2ISw z9S-fNJaZ#P6^tC!c`9+OXT%^ZYB+fh-e3FJF=GpWcJj^Q^)1|&tv-esy^*+qy73Xv zMT>;&`+KaR&@hVc$M2e>&rpy9J^Ij6hb2cNk;4&~$glY|7NPH2dN0?8V!Y0QSmKcW z$e=K|Qr2CdR0%E^@(Ef7==%9`gK;9!#CyhzfG zN>lmhX~dp?-*Jg9&dZ@(QqEquWI~CE_OMCE%m_qf&A6aKG+0!=_1zzsxuq3(`RqHg zcH?b$S>(DnPy-W`HjKj9Bn}sgXR)NTYZX~JykM^#2X1j@T3di?4|gPgXa)JDPsWkQ zrVwg(`WzJwNTx8RjJquyFp6Jt^t!b15Z*o{okml~c6q?}w>M>ou(;EtvX3K$SVAYh zqMXWO(Us^ol3}v#WXNdTl8IbKqqthLp@=e~=m^c7%qAqA$w~klG#-g7lg)TKt}s}_ ztT`5oWLhT$3u9yAB3GLmi_7xjG(34n#`B!`+Z87qlg(mT>Ybr{;C=7cf>szQhjw=G zIlEY^d;26dtw?))PZDtF8HD#+8{3kdo00REubbcc{HI-3?a#h@$1u8k?D135!m|rw zN5o?Y{~K-jga7_L^UVCL8mC+#qXel3#eFR>bH<~EbcA9U+*btaaFm>D5cXSv5RMSE zVNmIrEg!6_Lufy*_5y~1WHmk|hp`iUiWku79@lnl@Htd^)_D~kEHN7L zvr4Z+S(KgEB;W4;fkJ{^7}LJAkuvpRY?OgXTjM^h@)ID`)3IbLbH}<7(+?d}9toEa zALESXWE`ay^J@{5C|9FS!HV))?4d=;Dm#!^;#(R7uh+I0y}$XwQKM=-iqP|nILSw< zEoMZ_Iil@WwG*#ZrR4=^1Fk#JaM|_Q_69vUtDQleKQ=nHOKTJH+TjX?pE)lVIU5bh+~HYy@$C(BQnxAu)JQl*HYt)Ef zk{CQ;zuQFENnweBPT{4gyB9`?*F#PiO)K$blr1Ub+zN*3*<5_stRUrxN(2Um53z%L zap6hGgV1duJY~_U--7Y#s}yx*Z&P#J>On=PIjcH8>XoS!(iF1wGBl=APBe&v6qEyO zXl~+SwIg{Lrv`IILt8T7mD2Pt424gH43>UF{M)c6>!%ef1TIx;}aS z$)ob-mD}drrJLr{pL|Z*{)nZq#Cq_wzX@uhLXk%;CWjtu!Ul}_vlIK?OEGu;u=|g91z)Ae z*`M#&-*G;mft06JtxCJyR0XCw(uXD@z!v`9ZxM^oLYjfd6KM#?nmKpTtkhJ$paVlp zChj_}sa~r|tzMIAy{?>&RYZXf<=Hf3!OvO^Tp!+t*Y<|E-Y$6D;tnRjDY4K6_yRV;hdj+5T%;%nx(}$IS?s4>IB&;RI0 z+zXf2rP%69DiV=lgSp~Bs`$*#-kx-LzXTqsU`1H!c$hn z)N55`g04k?mT)hvR!^3*QJtx;VbgmN;q311h`-rZ!cBTP7m)^a?kAU)rMb6_b?Zn8 z(Lp@Ow5qRy8>A6uYS4z)Y_QuDPax`PAZ(zJZysS{eLA{PK5 z;%yuvLYI#nU64yRSIx>yMm7+2+*#X`Fd`7%hY4B2PCxSVI1YL;>Qni0A8EpI9r};pHN^A8{^$N{FxrE0X~OVy@rOK=j5avVtOHLpOl)=j zt4|zLD4wGH#17L~#!wyzM@JEzk^UHe&QWRAtS334LVX>JKx0wQwOVC;k0s+~2&|r5 zK{}SalND`Z^cjYehkzC-9`-5t$m_8cei|ftBc=vC6qh#YvhK;c??^&UKQk*o_VE)q zfC;&{zAabl9VO&sh}1*~*GFzh&O8>!`UqM7?0^6Fk|twtG$B=lwn2Es#X?Fx^Fz;S zzxm4bTZV;~db5WE+R-AVhp+Ej!G{=5&r4_TNn^-?9F946^}dMwE+B-iaYPvrLfYR| z)z<3%9>Vs7MoO(_M;ULr2<=n30t|XbwwRJ&Ju3AUHe63aAsj6Hna_k}CKixes}Jyy zv19>{hIS0@L6&xx&IEamv4tr!g8zPJVJs5@R{(N>GOI)Ws%T z!o-BEcU)PkwB+3F`y}>}^_^Yp0qhVQvUjgu7OoJBxxrLKc3}wbZxrR`PF>2wmfXI3 zN8We(upFOC!(&I}JKy`R+`hdgzRZNYa_)h4TS|SO+}y+_W(v2x1A|yq3>$U$V)*;1 z6HAEp5LCecRpIr+IQTS{On(UGG90Is_o(SCLXM=T+U;g#$+1OmABi!Xw$9Qkr8#R| z_^crjd=wP*Sz#7-swnZ@)lqrB9RPxd?bg~j3s#t;Z{>y*rO7Yg=yoU)L|9q|Yxr`<3_d2~?P_8yUd5?1dS z+VjLBw(2DM6v!Zi`cp<-2~Js4Q+)-mrIP#Aj~!JMoT3@ow$8>w6KXW@y)in{6h*>BZZd*{8bh^st$97W_ot#gbr;h9Q zfWWm{Rv4F#w0p5sWjum0Pa1Uls>#5L$DZ*>5W?tCdvbhf5h+kg z;_0|ns{QZ|^B@1;B(i%!BGVs~Cr&&nE77_vFOJJ&vuSza@S2`7{uq^C%$xE z79V|7ZeG2idm#XW=GQ|UmsC8WhlOpkA`TiQ(bjhwS`XT5G^K>7gss=wenn>hSb5)V zl*Qk-`Fb6pe~pd-d$`f;Ym<&x1g5MFMq;)drQDGX?iYsmtPQZhM%pZ-E2M4HD3HBZMQ?AJz z!sf*Iw2pO7O-~>%uF5a|{O1%N`q~@sn4kQ~A9X$WuHXGX|BDI7({gfQ-2Lkp-~|Sqq03WM(2OtjJl`JF{*&bA#} zQav&d<9o7+m=^So%udRoEW%wSv9u8EAl`f7#)j%M_7HVckY-Q@d=kchlGC29Bi}!N z6`KswqPkU@OC0UAy;Pv$SxojSuEr7@+ zEUB1ZQ#=+0$B#WFr)K(c0HY#!CVAXv5^0M!Gmo%;TKvl&k^A19WHNC%+APVbPku^v z5gD*-MGXPcXR)Qm={{wLVu>gcQ_|Q}Dy2puiLhNe!|=F-43qiP({{6$LEn1<@DLq;#x3wjRlhrJNK!*~Plm$ttAx8dEth!*(4nM@}G5 zrrK>AUety@4dhfo9aub8FDwClyB(^w1)ZJBNVbrZ&00?y)Ud-wpC2DnG1%GhBtqD_f`O9M^}~H6{1jHL%m4e0 zbLQwo3eUZ&Mb*5gf_xN)y9J{Wab;q-CQqie<-w~jiJS1s{mqhW6)Q@AzPh!GXIYn0 zxhdX6TK4u!8cBu-dZ zNRF|LQkH+$IzV>9$YnreD69DF68I7QdcuB7!;jbTS~N8fOMWs?mS?e)-maA;=eVyk ziqNTf*dl2TwGDL0#;4r_l?!9UK;ywtX=77yW+#kb82)P)KnX}JOxXMD&o7hX!CD=> zv%%h~&ytR?a<3MM*3fTs-rF91*D{ZaWvL}M99t^PZ8SU)EBb*{R{P}4J+$5DSo}Vb zO3YDMpxN7POCvn({^@>LZj&Ew`=&V@>YAZ1BX{ap)C8%nTe4Sf;SgXE>OCvAz=a@3 z8Wy9>TpI`Nn_vBwQdch>nvqCmOs?L%D^+;E0&>xn#~+tuCL=L~#_eibP8^<-+jrKb ziR=6NORt%K{JD?0w^!HX!Yh9-9fX!G9H=ltr+XV~$o13mfm9+VWBs+cM%N?WqEQ|t|L4x!XedQ#oyhk z$=Y^F$|~hul`VJ(ve}dls2@;~;=zuT);47d>p&ulPNO0o)&h`nh>u$m>*7!!?1}SmQ|em>Qhc~7y`2MbVJy$S@*R$A%BO$gGjexrOJ=BDh|dlt z!!m(%g;)}$c_SRzW9R5y$4<$~u%m<>NkV&vR^i7BgXkr>2i1tMCKP<}BT8%&QAiQn zI@X3mW&WTg$?V&q9Wo{}RaJH#vC>&AI+6>3Ei)R44xY79I_{xGhmux{2a5!wG$yVQ9*%edIUMHwrH>pne6v>Qhn89> zYOKy5J-e&JHAV?JluCGXfnoCayOuSGEI}-6^^Khuu&l9OO(96qNL)H^j9BlG$I3aK zdr*`0Vb**z z`>%gb;`58r?;0uYSLLlAoK+FUm7|9xHa02W{x*J(MP8W7A-rCYWE!bJBrb#YKq`0u zeMAK3FI+c2`l*k)ubqD=JMeV5Q;*BU4AKQy%WJnENIX9Yk2ocp2vMm~&}j}8dDntx zo;rL?$_S6Cio;eE;my>$>tP*=NHbIkH-U!%&l7dZIy9pOpYb6`Mk1IfnmVCblIxv^yTdf7vz(VuE_BdD-wqhOco}k<3UtL z+N;SQl2C410*Q=tVkab%^-F4b8F@bB8`p@N5YqW-$z7lmuc8qFc?~!a6``g=B&4YXi+jfV|En7-C79RB>gkBGss>v< z46WaN5e9%3LR;}(OS(A}3+&N}ey^qT3Xw;?@2YBwj0TqaIy7X#LM#GuP(kUu2&ZMM z#n?$gqU$KUz&z^Pm&%0ynt(*XX zKz_eECYuk|B{wr8hS+L^U-xg^H=lXxF<7~TTv{vY0tbDLOyy$IKG;_^qPe*#3HF*e z_&zm+^vn!(S@aAAJsRSZ&z)o+VGhx_KG`bQb)+~#%Z!azCKunqHa6E#(o@Sa^afxw zkVaqwBYl?HTwFGads03q$?Co9lEEhKFw~x&mIa3L=*K?WWv*_cc6|n3RyFynEw; z>^&^X*7}-ktZqyB<}ERZM0VG=Wz6Zyjq7h|+h}|9KsN7h$mY$Pa|FC?-xaQ+yX^C&&>%c(I+Tb8I0>2V9UE zU~@M1vHtLKWe#O|C~esX5V^H}`|o*K%Fdz4kEqqFx)s>=h%HaST}ICV?y$$(!EWI%~IT-CEA zXCFg()(ko@(jJ_(X0fDgYj!_^KFhkyC`f^ZED|e=vTMhjVdU8k4I_<=BkEHg0gqq* zW)>a_Tb%$U+a)K2&%)ikUwm%KXo1dgM;B#F{Kn#OED0rUl0DD1YteuT0CMcKkxm`) zXG2R6%1A(ocaZC|u*bZt-gM-@y|yMdyJ`1!C?o&$fBh-sr(F}PS4;^TYY!p$c)H*o z!2UL=9Fxx~1UF4a8CY9NJCo9x7Ls57aH}kD{{0(l(aEvXkBASR>pQQ$E#<9EiG{p4 z@JA&%aag|oH!n&a2I0}iPRYuLJ|bCIN?NYPg=HnkynTOL-aL0frWPg?vrTAgMDh7J z$Ou=5I5aHO1V&J3KSNLC^AQT8;GnvJI6Od07Ehm$n-|W>OfILKdi3JkTN^Nj*udC3 z33#IjUe9nXk&G$Tc87T#*6r%$J4z$IT04*!qK$>A1vxr}yxhZ$>yzT$b*$e&nvR{d z$R&L8H1219A|s3A37IeCC7+LqgQ$SA-j7ZfWFZ$-IB;#J0t3|7B3hC&1!EJs5t7Lq zyzDCOI4mg`nFD+`qdBG#9jw0_j!T=!GKAJ9o)tHkK`2_2kACoR+4lyu1!$ck4~5^n9|tc0*?HxzT=2CdbqA>?14k zsb`;-wL5p^aTvPQatZ0%l$08xK$dAlcjN_}9!qI!ZFYQ2y|%XaRKI{R_duz>c__H& zDlobY_Ttq!S=|Rphox}{Lx?(f0(kH&m!NG2vJl;3_l3bfMLuv4sY={tMV*}iRsQu` zH76yg8QNAcj5u>`mC4g0`M{F2>P$a%DXrQyy|F_%v_V@Ha}*#%{(tP{@JO%E0_$uW zU9m9i4!{_-aS!a8X@o)EKSq2y9cycBs!@pRBBM};T?^KR*zTrcmTQafG#cI!1s)BN zWg)ga0p4GE;g}gZmb~*lLJsB_EZ&4Xqe&^n-Fs9}!+8%BBxW?3rnn$Y1+-p3P_u{l z>z-8V{Gx>W2WvxV&L5JW`?p_2C|ogv-3?RPYs!^19DaDl#iyTeFR$-N1{;48UYCnU z0);km`xq9a%P<=UhXkIjR#(3A)fZ*ISd<)cqQ^e)3_|08y!z&OX_odRitm4HWm&>A zv+~M!UeUZP3vYeu#3^j-lwS85ydL}U4J_2$p;@VxtJ0}d6=B8N#@hV{(yUZe!yczu zG6==JZeI&HgviDiB_iCBN9Tl&3KgZ^_i;xNJA8@*JX+1*9GZ9vVr5?3O#qlMrR$37<1wNU7WutGXWK>`CuH z9&Q}S5NXR6@^)`+#}*X}8M(7rmvYx~Els8(h$MpY_*6mu{Cj836N}TbfC%aw?lAxZ z74%0W1p~@4;2^?x>Ki6qO0vUyA#x#Pw{=jHF&LJ2Z{C+cGAcho?emSa77IIv7f+}uP&V%;cmqNBh>fHMDu zfo_lmh~%nGqV({p7UjcR3NW(TS`5vN&h9Hd-*^><%duP93XeCgt!*!yk(Hk_s_w)I zJFnN`1yt0-vFC)TA{`^=^*cQHj&+i%9?io{P6LNo82&r#(-Cmb2uEX4_g2-{QlR^7 zK~U!n2I7H%-7Qr#iX;M%NtR(jUs2JF|?$LAOF#h=ncxMLORv54B#~xJ+%BO88-JdAMG^Z1@V0mJg`c6 zU+49ycDub<(xIFWV#D|ARoQs>5aE1Nwi++zuD^m#Z$WIXF zG$1=RRM^4Vui<;kFj&VX3;6CmxmBu4sZ>@SI!>IiwX|F5$Yb+UFj{`3B9lU$+_k$m zB<&61IUqe_ftQ*Dg|u{WZFLyOJ`C&n4kDAuX;~`7#6kYtSly8Q1`Z_Fhj@_L@x12V z?Atej{62WDT2ovcG~dn@@$B9c_s|(h?Y}NXL`5mQ@A|F#%98Z3jU0WffQ{eRHe)bo z^qKyrKm1$s<3IK(xpU{19D?E5B`FK_6>tE#4|kDvFk+A{n1KwHPxK$$+w@GXHAgyB=&ekk=%Xc!C9$_dmWOtJl}z4faMu8y*ece*1U+ zgRDK=l~gPwODiX|pfrHdc==o3)0<#1ZEkr%JkgB2_3mYb9ddZ&%;}R7pPChK9AWa2 z75Sh3$!Fxs>lfq!j7!f1wFpU-oaLo?c)u9#WhlN%S&1bGk>r?ji1>Um=0?LZySO0U zBsO}=ugpks7^kBrmSucwOy*!TP7r}NlaeG3#PW1jKK9ucUe zubpU4e2FnxS((?W_#{Hyj>}4KPs%V5W#rye(dEWsonvWvQQEbA?H^BuESrp5SrtLp zU8~e(r_n@eHk5>?C-K6VoV|^o!z9Pk6#i6&RTynQylzOt1fYgCF3c&$(9(R1Pe)b zRY|9VgTmfDN2WuZlnWT0rHEjEldnLF*7W2=qY~`HHGuP@AT23BNVm?m8@pcKk=6yB zm%`+ou6D>+*=O{_!_T@vNQ-htjgS{cl97tlr0^-jF%61RmidEr{G2U12Y?MGK=(n$w%mQ+^AiM%4lvs6b*RkLTt9Gjcoy}&kgd?MK^K-JfS4N1;iM2YcZU~z-E?@qu zuj?izjr8=wlz3su+(1OW`p%0<6RN*=cwt;Z z)qOd4^^UY~Ac*zP#Z#IqO%%qlak@GKPK<&t8Ai%Mt+&2vuLofa7-d9bF^R|hFa#0V zhvzq89L!Wy3arwSXaQ?;{@N|66>(6*VYztYo@~7Rw%osXM-q*yeCySBBt9{t8*7Mv za|HF?`X(MgP>WC5bPB0S47n?E<5&(UML>37s0c5;e&Z@~Yr8?HI$K5v*no*E!PRUc zswm=5wN{pEYdi9Admq>1N^NUZ20VbSt>YRx}|yt)Z;0Kaiao(u>WC5}NF6Z^&y`ZXpe;BJC>4KB6HCpWIu&FX>E1@?+Cd zZHvlx_28)~e9><9R2>N0K)&_HSM8iZazeJZ*Cm4u9qAk(+VdjJuWDz9Q+vghqZ>Sh z>wWq|&&g(K6A?&M_Hiv^32btBqz3lSo9<2on2wtOy7VnUcrybtEe7 zTcmA3^(I_P_QAS)(2}L9q#gxxTr0Olv>++QNSG=d80z*EL8_@4YX;5Ei07iOFn;eZ zePr1XCP-NadW%6%?8E;@^Ht zALiV6Rub8a6sD%Ic@y%+t3S{M&gEh^q;x(V*TwB|qKu*w%p1#P z9XcVYCdC;pUA~SmPUH@21_;f4u^{d-D2bUdxmW8dpeRJeScb;9e_vm9k;G}2;As-_ z;MST9N;|l>Nu{8sM<5gL(2qm7U6C{ks_cX)d%-|GG{bY=CndC+9jqw4C2{-{xsdLP=8O zlj#SQlz6a>YbC+?9<~`d3&S+PQF=Y3I-RCcw3C~F)6VuYEi>y5q zC$K}jVxgF%V^#qQBYO=;CQ{SxpFHTvJ`Us9GpF(3U2`<&HH1GBy@nsC{$72r0qfbs zVmGAMZX+59%03=`8Tn{-d|LX^y!`S{f6jGC6@BflrTjv~z;w&ODCar9|Rc>8HnKa`A{P!vNj7aa(x+GKrvM3Rwwa zlV5xL9cjW4tUXx8!FRO+OHc_Rwd8`QCFt)L74seAfKaKbBhl3HW6!pM4Z)5@1@Arg z{g?3J6Ovk-6FeFTdo0Iazg$;!n?{4sy@8H-CVW^w%4bpFG7(WMMLItrX`~mKY+TwT z>p%#MObKB$sj2Hy-znh%B2~hDlR{h>EpWZDR9dB5eF00>;u4_6mMfyBE~5;e)dSSF zRllvBhcY?;y?z~KWz{;7&j=?)d-%MCsifo)NhRUo4o#=!NH!ufIOykY-I4jp8JR+E z&)I_b{Jg{xNE@;#N#Hrx_P51>(Tj!RGC+vV1LVL(bHFAF!<>MDtnA#EGlvh!N~|kW zkA6aWXa8Cj`8;rNa*2S9=Wx$3NQ;@U!nIdm!0J0Y^3f;H$OKZSeWX9f;8-rNmLwV= zdv0Gma1bo&vDiBe15?F8P9hqslU|#K7HdO%W?%q=j%aPD27u8(TRHf`_!+SP={O?0 z7(?ukbSNx>eaB&)2s}R5lxZS)79;75gpxTJedN(Fs%*s(d=@186Yia<8msfkM8Xcm z!Evw<&hO-bRvK<&$BKO{lyk%zMkPE#7^-N8Yte;{GK6`RKX3r2N$x%mYXZO{gb^8k=!uD!F4rB&Cgz(^YL)L9hQaI|d~P~JR?^FR*Y<6M73XIxtCfub*i zICK%L85Nn^+^aZL)P9KbfD!nFy%-*_Uf|IPmZQE=|9dQe^teIAEF=P6oe1SQWD42o zw`{k75i^I0@H%DNf+1q6YX;g6998a>F&iNd8N0aWy}$8^6NbY)oOmO1FGmMigy73L z5x83snaM4>U*2)$AxaxZbV`Ym(umrCN(fC-A^Sqyk^+>Fss`S@qIA`R8TeXGm}!RAUc5sOi|Wq*pbQEDeaL{F^E%dHAa;57}!DON?lV7 zYB3;lQ?gA0M|`-i$z)85yCn(5k@iuz6h^C$gT%BXgd1Qty^ZHqz~Q}m@jO1?3&#5K7D<)+U+3qQ{ATzb&Yo>rJOgTK zgedh!^dHup{Db6ERGDr>AUtPe&nh)K;*dq!YdIyDDv$!*v4nU!lFrDP{1T)|uT!uLJ1B4^KDHXIw}A_O_`LYgF8=%shA%H>N}OfnDe-lf1J;gA7ro(o#^$sh+U z;Bcfet+t}f$b#eIAyZ^T+ibgA^6=IJ>F(`IaqXTSgu&LP)(dEb z4|ew9IjXXKe_b{Y%J2fP#s?J{N8X(pn?Z6JlW2r=U19C-`-5>U#LOaE$!F(OnU)?t z0uOz3q984APfi~@Apvac5B39e)roA9 z8jcWmcv;q&C_qEcNmgV%jDD|eXFTOadxnDD2|nL?0puqd4Sk993b^l z0T7Q@2i6#nb1;eXFysP^Fx+Qh5AVswVW62dP`iQEdWwm%Mlhlob4UDy>_`nq9ECl6 zzU?RuEeLOq|OD#u^z3_|_G9Gg%;g~Eu3g-p(VDTHc;5y7>3t?un+R!g&b@*3*<7Zp~ z97wH{MM!OYj*e$uxqQ<^k*711j>2MdAvSK^l7I0lKkY6YUy=v6SCuP(tR)Vf!uhu^ zNg|q%`{ypn$vLZ=DAu7wjIR^ZD454aeV3e%10Z&WO$Z7>4TpV7G#11%w zOkt{xnnmTokhQA^>g|U<H*0@HzbfqYx8EaSd;Z?M>aP1<<8xQQpD%4KiCv0?#ULy;d-fvv>=6hf`_arv(#Ww>YUqY0h-pZIOT@SB=1{uW{K|YZ>`EKYEQ)o{db)CZeNUPu zBC5% zLZ`iMQ|I|PhD*vZo>DI(r=g|rrcq*1ooS%B9rfDu%vAN!$v?t;NBWqQLsxMU-_VXR z_Xn1%lS5HHI{?I#f<(GhH)6eDfWP@nRR)kc1|wop&XVxsNn%1H#C9J))=OQ0FMafc zX~O!wdZQ|3@05GX@yi_?^2a~>tV~RVO~KPNY2=KgU30xufT8Dx$87ZB`P$N|wAHKs zFaP47xKFu2AUW5*ZeFaGTB z%=^IG^6mu*q^Bf(>}ly? z(~sqoTDW5kVfDeP&W{h^{fBse3eiH1qo5wja1C{$i^>XKgu($Gapo*NtT$4C0tbdj zz3gDqU{PZ*IxTqP^46|0upYqMR!Su?2yr=gPvVFWC-FEl9*WAt^;NCrFVD?llegsJ zMoII#5IjQ{`DH3ZnQrFLc`4&_lpq8LczSVJ4i2^?jWofZis9P4Di@xFw~cZRfWnqI zY>BW(BN{&!bYAuc|^wW z`!+n$p@j*AtFG+qS75Y_lslws3&PM@VgJ>84VDZx&ns?3mzaUVibVyaH#0Z3cC-+u+z8jTfCnNP~KsG)MF2;Ku&AK z4cOuE819o!k_yxwr41Wu!Ovjt1>p<{(CYRqG+1+XyoRI8%0jH{ysjQ@8c>dFGu3Lb zHlxwE9eg6;CwUW950j$-L6165>QbtdxK19r%ATb~UZ-axTTj3e=`h9dTO-m%B&Gl) z6&|z_YPF8}w^M!F!3QoJL@S9r*pWgS`rzM;7m~g#p66^>Nwx}Y9UKN9^ z;ovhL?I3q)BLw`#|M|z=C*SuNE;=B6SZ7sYMJSO;MdjcB$3Hjoho)s}YFyI9$>W9? z{w5F^6bflMfA*sM%YXfgZWESicY7C>){%6+AiE7mzVhdPtv8TKhGhBhqR#BI%|?>R zYj0hYYJNfUGf#b2d&?ZsX%si**3DZwS6{0&B@vIvezT@Vfx;Cr4lH#lGL_HB*knOx zxes>B2-)`$MjuEr5m6?ga%EqOqC~gx0a6HqIU5mRF7op@UdOh}_}rXKz+(kTLyd*~ z;3qyM>vz_~3nRi}-~mTdaUe-qMKFhhgGq&8%7K?E4cW&v62m zD&=Q0Qc=Q^m~0nIFd9bk*l87bm0P8{Oe9m1NfXFZmH;-1m#jOaq9!LD)@7cC6e%A4 zA6bdmJs~S?pxZzy;+KQsj&y=4@x{jxQ7ubu`jCt-97E)klKj+^viWi%vyYRMo*b8% z<&!d=7>K7`lQh;djT9)J&&k5kB`KUdA;(UgROaNHuYOyO%pH~Uch`*zBmKmDPU4Fz z@}K|9Uztxny&_!_fgmMiJ%V&~BulB450q|=9*{-YCJzATI1u*skfv4l_my9Or=`o* zA6bD(5YlgG$jqM;P{Tt`&)V}?m1)A{hxoTaib9f=Fb^41JCBv$qLW}A&cdUP4iiU1 z8vIWCAMp5!?jw7#KcH}J(%|7@?YusTK>}XOOr+I)7^HA;#JJ_reWE;@+H&++-b~kO z6=qRPKP}yZH52UB4QZI! zj`P4uw);kDsn}9$xBF`S8h;YOkMml;nfqcu1{n28aDW|It^?R1P73 zy@&94K{41aHQ5+OB5%BL=dOm#?|oq4348|9gIkr3T)njhBT+|6gzs(3`6~}3Ha;ooWKs(&OLJ4I{nnt|5f&?+ODQMd|HspN2VHuf*J00l-`jir zdfVQxs7n+Q1POwqK+%>cOQxtU&L|^iG@dj&lhOE}EGb&vTx3PCOeG4`Gr`{!R}M zH7pj`!DEehrZd)Q0k$HKKiNmxVaVAxB^w?I#x!`r;v2_lxnenk;qN@SXUVm7JGFJn zmXMQ97~yW*wHEB9GeJcA;5|6ME*xD%ia=9*W-*(xPP+q`4a2J+SR7BQ^6(+94Gtzj z$+4+mVi?}Ifr#Wrb0T@*O7T)Yr43CwMHVZAfTm0M>^`DiTz%$=&_x>#D~ESR(oxQy zbVCsxisOT0yq6I^FKjJX@72{DqVX>B*omm9W`UUPHaZqVR7~Jtunk$I5)h0x%CZTb z9lJ3-yt57*zBgoVe6AdNgs2#0q{N|nbZ~@sUNR5S>(RZNb_xfd)LC&Hco&B|0w|vd zk+^hjOK=pge&%UAh5TeI8M5E{-ETWzd-*A(CU7*k{}|qD=cob59kze+ul|Gcw?6ZP zJ^886*|)F1V@D4ToE*@`r=LD&wf#qS`Q=Yp9=Xj*CMwQ<3Uk6s+QcPYdJd^x+fIP8 zc(~aP9fFZ+ZroiUG4Gt|12qnk zDN*#fqC;TeE}-@_3y?klm}@V=*XjuPDoNrJoNFas)qid(27E1mkiLJanuQbb(*rI& zx&PB||F_P(ap*X`no}%gEkZgd7Y_svriVm`m126vMx(8NDu@(+{~!K}H=S|JF(Rha zfIGI|{OAALdFze0o%{E9om#!-td^E=!EqeMgm}{sZl(8Et#^v;G$o`+ z2Ub7awaogWoj-HN7Bg|F)NbRNt9aq3H`g^wuzUNqSaB(i$x+zFxGRQNwv1w_q&;f* z%D+Sg)i%jOYxe%zZzI~BM&z$+#dKJyO4~jWOK1V9*6&*iDGNt+!yE_2vuwa=O<`2~ z$4wxJ4pIUf)=WV~sqw_cpL3_uwaDB@91TRjK8HZ?&pU8D*}@jkSk7{6L&AU-vS}@t z)9C1wJd#RK7Xg;leXLkZNKGkhN~p1?oX#bz&t5Xejq&%l;moN%yo=8#X=!G8UCg$5 z7;qfVYYGR_Z4WgKnO$3uC?@MKec0FMKXnzK5x0NwfB(7j@^hC&Wj&qtRZaiO%U9HB z`_^y&zVoxMJ#XipzG!d0_p$TFhuh9Gmrhx~UR8ekt$+JR&R3s3XQ5P19gtSDsRAJf zd&23A4e_3Ofb$Fj%#m9ZJArfK#497a>IR9ZY6uSZ{1IhIlIcy@z2+Ru5Z@D&I0qM= zIyj76q6)ABg1^UAcb*kddQq0#_1khBS9ZgsTnp>7**<08o)l$FML71`hjSpxX4h%V z!6g>4r~a>VIQ$Uq&vktXvM9MBIJL->VdhioaTJ)2faD&WU65WNJ08=iU+5;Sm_0uD zT6>f3Mp_y4PtgvTqum==)dCxIS@v!M6^xV1ru%Kj>qcOUTZBU+2+3=iPbFI~0D zun!|T0_0BG5)LSP+HT{-Hl40*!T}uj#+F`NRRM(*;X~whH0oOQ1jwSPA)zUtvNjXu zu1FNgB&+>zavDA+GG&@jNT)0ng2!dPM14CPuq%rhTU*HM@GUH4L>1O)4Qzt@UMwQl zhOw*{^Hxl__*vJAT!LB4T4AANJ0~5xd;6|6NSVgn0U(A5$6ayH6enS)Ad2YBUNbk) zT7cmkeVs(pmd=+f&bj|Ab8Qo`NC5}N!(r#)pb;gaFeo}uz`!&R7MXInzrYEy)%67p zo3P@)l1&1MOf;-Q&dD}u$$!RBMv>V)m}t_o*YPM@-G z{a@d99^QZC1m!yB_NC9hNFsL&UbLJLaNRe+VXJ`EaV@k*=H&UPPb@3hZ*I`dJUMda_c0(N&R>LpbSY6Tp&Mr^l*Tb; zA_)eLbUZ4uQNn%>%@IWmRr^WU5NV?`1_~uD7)Ri_Z=offh+3;;GbULlXBkNF8kjn& zVR+6&^k9?WSW$h7&tPlV{UHJA+~0~E;vR^&n3ihGkM#s%n`m5P%RvpQxhf1xsF!qS zoSLLE&_DRqzvH;#&TF<1o%)=%8VUMw1CVf!TSlb&d*O30!H`GxPk!S!o#$S9 z#=iAW|96L+?>Xdl@qEE1p|n*_>WE-5Z63jmNr5Dh&x@q;_19nZ-n)KX>B@ikYd`Jn z?3Hn2Tqa6bk^@DJp{k#M{niKe$A9&GD^~!+N!4^xg<$|n#glmOBSgBXb_B?RLZXE+ z9s-$SIL((rbmMSDI+w?b3E1lCO^tPSx?O8kYIcGY#!UpRl#N@fGqjU~LmiAq+jnqq zvvykC`jiA~+V<@`mgAOOF=0phM^?k3?ujtt*cuNHthsm7hTWE(PXlJHZ&{;$1O(6% zS!8$AwloZH1lS$Rgy1X((wUFqc@x#U9#Y^yjqR z81Jyn-GXLU^XL>!VL`MD8))H)?%e&rqUoY9j=`;2d{2pl7kG|wcLL*f@jgvOr7#ZL zCBW*>UsIJkys_|kvF4X3d$!0jUYtKAsUwY}9 zeeeCd&U?2WIB(zEalZJ%RSTyQg3hyU+dg~gETI2cyK-*b?(9{a>mPpNynW}udHPJr z{`G(Ow)0VAZ4{Nk{3K$)idh*DjVsJ`S-gGv6UJ0Zj zvq48)uc;T-Sgt2qor{u;qr_|l4tsquP!V;oT}Wwla`@4K57lm-smMH?jfCXLM@UI< zR`#PBHTDaM_E;N`jMNU%8eAj;AIH812(tce!BptLgi`Rizxwxn(sAMCnys$batCel z<4^rQxEGM8m~fPrLk{?;S3dom{j-1eTMi2zZ-3_p&SE}mTW8nAHBUB@Ao9XqyQVga z=ZsaLU~c75_PRH)bLZFWg{x=m#pkcu?FYxIu;x}*;dGF03`o4WXzglE>A|@xmqoSLvb8)dp@X*;N%LOKgfCtFg;na|WlVGymo7%?@ca&2O@$xwiTt>t@ zfrAXBOBP;VS0TwgzGtsK{e->#^rj^Nlh2)6wGzH8hm?g(J$X3DEc0Tvb9zmSAhP!N zKG8KW$7CcL#e%-3UI0=3)I|%P>`S|@S}$9$*VU@$q*c{$3PmnS3&wu4H|DlpTV$4% zTH9KInVrfl;hD@O*g`@ILQSy;N4YN_(6*n)e2`=rfXc1mOaoyF7-EtN!KB$vCe-H3 z;LjVRT{fwU?i_?|yjSdG)2IERi4uJEC2&Xwy{O%AFqW4^Hyn zk=2HMCj}(>sjWqO<=Hd#kALS+9JVRnxwY%O`OzKcvrnC~7Ta7*x^Z9@b6Il`AjH^% z-;W9APc<(>8toFf7P#x;@nCVyeTMt)`m=uA5G3P>^O#X5PEN#un0Y5`=}iH%iNx?c zW2DAot-(klGw=z&VV~s9h?q~7!!158>BP9<38%~5lrg&o_<1pCQEGkeD?)J)h$xR> zIu=Q)R>K0|3@I54)1-vsd-a$3T&X-uhKJu_^T)LQGa+%2mIiz_U^;d&5C6Si`Vpsr z!{2U_dv6NpGgZNa8*$7v#@(SPgoB8@gz`VQ{*lAIYC0SiE|^C};XRLTe4>gpb3h7C zMsaZZVkLohr7RK-Kl|96Agdi6TDjeq=3YE76DiWr3yHw<#)r480i$Lcg~J`O(A0TY?Ex0=ACz$@fPy$Z7Rczpa5y7YT(DN7Aw9Wb z$g>69M*yf}jcdzkARlV84d=EL@zsrq?~AyuMI@CMN@0@2Tlu7HeO!MFPL{>1F+P_B zDA7sZl7Np(TjwnwoXAj)NY4RO(#RI<blJc0u2lf#?gPP;IS+t8o8YtN{e}(jPa9}vAsN<|TpiFg zIPYuHuG^?;u3%*`Z%0nr?(LUVU>bHODzxUqBMal;AM7FBXjG6oEm)GH)~%ZTAOG)P zJAeC$O`F2`t~xWp)BHlhb^(+g)M^~Iv`!#mWd|u(CSlhuZ>iJK;Ia+5>qTSbs(X|v zWbN{EPg@l4Zu{`W`S|Xxb8UUuzK`_atJj|P?mgUb_+GBx-g92PxTR@3YD!k>9V;vq z0JNw9Fhu$?mY4}q7l&k+4sp>(ogN^*3G#2Y z{L~kmCL=!cvd41K>=SDEiQ7gnvXJPGXM&K-c}8#&WXFjk_hx=WUAZ}O>i}u5a3OKh zGBfdD`-p0*EO>CV6_IUey#yHD)aS5`83jyQSw)^-?b-di+bV=`{~#QStKG6+t4ks& zn@cMqBoGN^)F~hvF&vFPUjm~eZ8Rq1VOz=ueTEl`V^$l0*cqt`XNqZS*SIQz9JAR( zu7&hqa}|FE$kyrGpi#H>QB{Q_N=b1tY=S6I;Mno7qgn{_!!B}K&cKtHVFoD8K6(x) zse?aj<9Wm~VMW|&aPDAafx$m6Gz8GS|#aCO)oT0Rl6 zESxLCqFP!BK>Pxn@2uCb&6RUF5FyKNp0Newp0ia%?Mpxq+*Vso#cUPV zkj*A62e`OYEWyb{wCr-}3_b&gHXR9BwTk=2^Qqw=b6kAtC9N``QgT)VFEK#bI}aX+ zcDsSUL+Pw6B3mhed(LM3vDk56RAMt0p;kBS-FwIO?ptr$&05pOq~R(p+N}o%cJJ+X z?N*~_hxoh?-oIx%x8AdP^hJ99K`$e|v` z^@o4vBI@-w{khE-i6#(SM%pl(l7oQ5O+*k}b;h$$3d2D_Ig+`w0r|7OE(g*^))+Vd z#R*V67xx=~_X`eJB|UijkomjknnmXD0Q;VJxr7o^ZCbI_;miFjE$6KX?;QqwOaSgu zvpx$WltiGv_u$2pKEnHE+Nz zIC85k6j+aN?cn~Qe&q~1?}DvBddGUDVr8I$03NOj&mPUD5Y+*fQ?BOs51K6m@sJJ; z`)t&l&m+Gb)hd=s1g!?=aZ)=r53rI&mqIdy7m4qUyV~4q^=4M3mOwJ1WsE&Up(fX( z6H(;Po|S>@=X5%OkR`HQtTM|ZUD>XdfwBtLMs8XvW^E~vvXAfVInOL+>=~pegTYMm z0MDK~Ytd3hZL~}-ZY#xt<}mJ;n|5?kgJa0q(pmwIYi#>Fw{3CdlpS+~84qD;aaHr* z9E_QC5E(hVf`GvJ{Zqvh-e+2aEMuZTz}@Z`sUVzj1@}}hpQu1u?@vS$LqlJ~`#O8^ ztfdNR3r@S{09PlN9>9u5hk?d<*ovp63aI8;+lohu%}tb?ot)-M1&6xF8g8s+6-USI@z@NA1TpGj^voaVV4a&7XYD;z%3+?eG7w z^H(3$v6z`-0GT-pAJ zdn*&Q5jo|@(cj3(55NFcS! zT7+_49@0s+vDhVG@lN`Ip6YINTE0X!Nqff%ctgsbk=!H}_Nn+n0kH(LFv(p3iik$S zJ}ufzq`m%nKZ~I3285+#0_*(d&wk07YgRg_2+f>a-pu@i#i^zM_3NXqMet=AytsTJ z2S`}Q7sR#ioM1K6_5Yj$2E#792CTwHmHToLr@>;(xihv%nQ3^%#I$d_AK$Zo^Y8xH z?pHg4SzR2Yk8XWpUECbodPAfXtkiN#k(K`mQVDKb4LHh3brv2tc;{3qVlO;>QA0wc zFRLD&*byTCNqeB-qd9WZR;y)8ON$a^VAa-{kECT^t5%R#a)6Wj*JI73cTW!SStC_z zQ;1$%!HmOMaN;e>+|gJ&ATv^i}V@oA;bIKe*%E+c|cA z;tS6M%_8#hT*1bX<%qS2dU|{(E^Ii3!#?hHaeYC5BM^=;q1+j^iRZ*69ulAQD6B~; zHL~)?BKo`IktgbWGWd*yI3kGfZSe#S=G@Vkh+t;^m}4O7`s={6aZh8$0g{t&U<+r4 zhc+3@XjX%ELIl7X7!d?uiJu-5(tG~GlIQOvX;M(U0CWK41Yi+VlH(B}c+Luhv}G9l z|5=ONuYdhjhl>P+2V;&gbAaf^$G4s9fAa%pHJ7)){N5*ad$)>6kbzUls_Wpu$*iue z;UIaI$>udM5uw!4#Gh{B{(f`Rvld?%4*sE2R>4 zYHh)m*A{L6!HyM+84dM31Pm9=IXv%!oqgOx&YXNw3c5TnN5@A-#`hqu$wO3R-@TB_ z;eq2YE|zTX!F{{<^fMO3i&{WT$RUC}|LUjhqZ>DIoij~=5w#!@wPU>Olg>ah=1ik9 zfQCmv6OvzSHLTP*1iF}5=ireAaNVRIr;w*ddTK&6F4HXJ#AwTT3)WadKq=MM5Dp=t z$};J!5-^4ug-07Tq%aL@aUL9w^44GcnVrEsbu&>rb9xI0Y-lYwBhsz+xC@ShPLfqt zmzhG<;h4g3s39CuMjRH9`ed}4x^}pI$Cgj6SP9R91ga(E<3wXUIF5Sx(AKxkO3xsf z%ZNVyq*=yy0mZp-*%a5PgK!jtptVj@%)_itaJ`x3Lhs36x7o^zax_l;hUH@c&HWEZ zv5xC`g!GF9qhxVP7Zxqp$Gx^|7KbC?M&=vW-?pE9@d==bW&6^n&RHDK^K(y~vv+Ur zGxpmX@7{F2@a!e^@CVdb#HmTaxpHfks?p4k$>z(cO+FJY$^?M|x)YyNgi?7T1fdg! z)8)D}i)eiYI%;D~d)nov`Y^W$SkvLkIVVclUEv^KIGV8u5GWlT$F|8t6({cm91|yP zL%tl47MK`xxQ{}j7Q*)!P$h?V9O`FIJRNk7569zv5M<#vG7o5piSq!ixB>^#C}42q zm~hDTQ+xIzrfL}i@&3{`zUT}GK4AfSnB+Vw*Sq!){_9`!KK=Yv`}8Z%*r&8Tw3|ur=In`fBhr1_hw>4 zbre13Z~)AgXk3gMQ%<#!iD=FoX6i3gc=$WKG5qh``7?ND0V~2FCtT$O27UhOdF$>U zTZ#Mra8@-$99GCz@OOIcwqWko)~ZsRQMbdTZOaCR_VUG38vjfKAw-c!bACPr$Ckq( zBV|_{k)5qMa`(Od$~EMqJOX3m08c=$zl*&sLPatMFOt<5DG(h? z1aPwsG%}|qBwKWN7(?Xa-BbzB69)+nXo)R8pq1{huN*Ch>nH!+C%36gl(p(f*Y+z- z(UH@k1n|D1NHN-M@4#W#kE_-Lf(j7vaO@S%qQ83De*e2au&s;d#RkOj=vu31X*k_^ zEUv+p1RPkH`6p99u4hv<7VnE}xj_-a&hadYmO+XU<{mx_HICdr=!8{Kck$fXIGk}N zzkHsH3-tZcEqL_tI~L0>n2STwgfmz>b43h1oKXmJ;3mb?jvV`AtL^=@MK68XV$*#~ z6i?gX!2{8qF=d!=7X!~bmW<(h$CgWFY#7f^55D)Y!`YHUAdvs% z|NK+ONU9O^skdK!>6#@eDF!{hJzcF+2h^$~>1s&Rdm$m}5S#<&AvkKB zASFB5qULPpPIXL&oE)S>VE`dypFZC9BRYp|G0=!;#C$bt5`z#5&=ez-4IBAt!A$Y^ z-_x<@?*Q=HX8sO@`!hfDWrrh;^b-6-ZsT#*|GPN!-+AK)&YOSpfs@Ln?ea5ES~i)s z4szX8+!d4vJeC;Z&a>pENt(eK=SW=qY}KO!tJK>PDERUVm%K;c{f@o)#@ph|U)frN z!$7__Y>8Vh5hQ#Wz#!mKuJt(}1eiW- zmG{ch%B$2XRtIcM&P;2ghsRB^z0TldM#w2ob`Jnidomnprr{8Et1WzH+fqn1HgND` z?5R@gVB7`Fq$n!#EiPE}+K8Zlw=l-@OKGGwQ>}xta7quJhY=kh!g7v)d0aZdX-HQ! z0g|t$Najdk2#$8L=thD@zFW5CSnb6@%mQNfVc2P)tq9N(2WiTj%g4bU_YtWGt6`zs zY@-rQtFPG)t0PC}Gc6RB?3jZ&Fr3f7aK&=C{&l>=2A4`;fU{@{&wXMm%W&vOE7(Tu zwVRUnPQge6)CExIW+H+O7SQHi&E=^>}35t4H2F;V3yq)60XeEaT) zaAs{=$gil?Ro;7On}vd=>N4@9?vbg)ZLtR%z9$_%#RAl6*YmMMmGvb6fVuu&-Zva@~IOPj5J%zq)CcPoJ`PwjVhm zjpVxa=8cb>H{Som`P_?7$yspNi)z6MJa2LcG;0lU?z6C&;&M}~Y3u2K-m5a~%Ga=I+e5vGeEEGS-W97umb zhlI2)RfAZu=fDr{pOxYP(V6S0FwXsIvR2b}7*IIp&q&W=;MDar1HeDyoG`l*;@G64 z2zoy6Fy|b^Er{>><}bYNcoU!7oC6Y6f@SeRLLBs#@NTD;mf^8dRz2R+xUE(T1u^{H zMZ^FNc8dt!ad7Pd}_8-0CgRgA9AY^b4# zkp_?Y>TeTB4Jcvd@lfR@H??19J_zWaDIm{3w(jwPE~btb*T!LHZ~jiLYE?wa7SITn zhsJ?8;AX_a`J%=?JvcEZTe1t+o`MmEk^e>P{aX*jn>Gc+>^r!A7{$Fi_mr#lYd!Vt z>-CyF^VADA#KS9Iyl7{xK8FYpu+7tJ_Q~BHy!04QQ4V=&3y&fqRw0s6P$6l=iJovo zY{#VFCgU;5HyG(z6wIW^U=x%_4$u989zxAA4txT+BCFV;(xN>)ID%t=vxQTcQ+^B2 zyowZs%Q|H|J1&q!fz;wiaG6&|k<<5q3bSds* zWy=CZ)yIzQz55nYvNchqQ$?AMP#bk2IAp{c1Nkl`UEug5 z!^9HqFMs1pk_ICqE++uF@MEGYb}bU(vIp}1(t>pX$2isJiZRtyrI>Aw8SaquM=Ssa zsbs>HOUe>cbP=EVBd@*S{mXy%`*u>P06o<0?78#sm?`V;?IK#$)h=T%pJbz~XjABs z5=#-}SuTttLrwu)HKn#`i20RORq#jipdI4iKf>ikk?$>LQ#K)uGotpW-?Wokx2<~X zj>W4-wiI`)5Exq&#?z{`#E23;IQyhaKS_SQM-x(v@-e4(d%i ztoH1k_usW6JfEEpZrJrd{S&)&Z{N1JcdYb~MXQ zB1uNAW^X7W74D{!lp`KPS^@MB;64Bx1v@0v7~IA)kA%}Ur&2GBfcxxC7;+d#xq^d~ z&!KLg~B; z!zWw;=7=jkrvrPO(#iTXdT`u9t;MpKc>UIUMpB83Po1%E{q7$-r>;I>XJ9v9d+CCG z@4dUucW>TvUb?WUjuk~wT7#iR#fKe=h6v1R_YE2b+cB%mgPLiL87_#b-c$)-gH58(WkSM zF%zwt`}H6HERf6uHwQCt{lNyZta92Zi3myZMPLI>^>LYjt%Uw$rd7}gi5hWH?6r=% zBP%1qbV*$V@A;qn!q>b24$tk{K<&T);NaS+C+x+a`A@BK_pT*UGd%FPh9SsZ7lHA! z?@qd77P=xZzHBO|)&~h4M$L|Pv73m*1LmKpyye$6?S;!{5kc|b0Phbzxg};A&y89H zs3o#--l_?FMj~$qjiE&W9}g>a>%)i}V^7R3oD=A``&KG0Su~pvO%-9)$nlpyxQfY~ zjWpDQdfk>v1*;>~agejGA}_8YLiLX;mPM2zab=n__DFj;M?fbqE|;x=l%$XfTfKZ_ zTbHlcVY{t+?t~H=>l~973wfx6d+1lnQUl^N8ONFl-M06(ZFzIeIQ*1DWI4UMq+WDx zeG_OPDZN1E>Jz;5Y-omSOj#O{MXjhJq6Me?Iz4-IxN9DucN5XC4MWYuU`(Bcn1!Nn zt~65Rt3W*4$B)dxJB#7-$1t)AkOWnk$K_pBv8(lls`2AVUv0Av{%Jfqv|+nz%f*z{ zfYid?(2|}jLQ1kKr(jQ|l@)l5MeBMI>)yFxODh|857B!7H$-YM4z+M|af%d#Y`A5h zp8fj|tcsK_jMRoTmneB1A{l&tR|?ZnNq3tNNMU8o+HfeZt)%P^zW>nq`(J<6o8#Kc zWZVIo`DpjR;iAzOuU!?b8v~xW@xre54q`}G7hsD`)^aE|>iK{0j~vZUP3twO_vy9kUtv!;xokONu$Z_|0&T2~XM9A(UauCy~xt6VZol67u%X z@pD%e^WN|N`~S!Gw@>Wjx31gXNyiqy@Y8_&3r=AB0~peYs+T-y1CC8{UMHuICvor-+?bklt$DC#NA(trJ82<2Y|dpz0fh?rl%-gN z<3KqEDl~04=r635o8LG zofX|~pPOHvr4czjEj>j98^b^`2QXMpPR0vKqsmvO)z#7u`3I;2$LN*^%%|E;Jmd&P z1rQM@h%O%feKK{8YuPt<_AC{g+Nr{_D!_~a^C=EWIAt9;i^~1`Dw4%;Z9}dg!^^YM z-$Gh9YF4arSTn|e4viNMHxHQo^wzqaPxIiIMp%imsArgReZiEi)2nuxMbNGDHp&1= z5aH#DcuqOXTzb~vVJr&g(~m@@jO)OWL?eKw3#)Kyt^`p-h+18;Z&=dhnaWU(2*1_<}F2s&Z2lhpqN-Sg%AQEy&3uGR)D1OGZBcvG_ zQE9cc^G|rrivMzP)joRk(CY1xb9?*PdF!Lw&ey*5vbmYGoej=yyIgU;d*iy>s>Wogvar(w5=pBpT%U5`8=ntn)Dq zBg)`X5J!T=1*l%XPZ`E3Jc^3CaP09=T9i7vv_Jp#uXsl=*mvNyCx9d2 zm4YQ!Hf?il!}&}I`T6zl+AK7YvxyMGvTZ^}ok-f!)DYkyVBrEzh)O~{v{Gl8&edCu zAm`5DbC*j+^I+WVM?1EC;FDdF_BzbIMhkv)NzPC04LCIpcO z=aX4L;DYqy8qJm!kh2{kAI-yfoh~QGXZF=EzpRZr2UfDYTJo8Q(rN8pjOT3mB+bKN zNZ@6a7BX76Ndw7@ICf0IP5k{>CZWIE>vS}rR5)|WYDg8PNUw^)xS(SkXl-jLZ@Xip zYOM5<8^=@1B+N8QUFj8D=WMiYT6Q*9od!r5SdhIV%6g;mqQ2_64A_(?C3H zWNboml!3us1~NJW$F;J)gp?$y!lDOcb1Ig$RUH2HRMs-3O)EX~qQ&uRs<>h!yrV|_ zMAMTUIGj&kdk!|1)Oc-)?{&3kwL#AShO9R7>|vv0sfA4hjJ#zxp0G%1-2%y|cJ<3Z zaw~XuNjT&6Ygep2;qp$_9+hhgPgwWYDzXu^3iHl9K0g%OyF*#qX{`VN2GK8<%zW-ZqBNH`inz#uQ+5YT-9I}#oJc%rTs zTYKaMWQT|P8dUb7L^$ce0!$?cfo8rKD9Z%gZ{d<333{mzLKWhu@FUy1ziWH# z77pxK#FI40O}4EDO}k&KS*nmyKauld zi6m7lNuiZR8x|P@)Nh~rW0Tw<3&F_3aD=hi3Y9c**ndFCfX7}9JO*C zjxb@(N(;^x5xv{7@c?kUPdai}{r*m?htD=~$a#qN>rvd(`hv~5){1<5fE4Iqy=&oa z#gb7%`<^W!`mL-l+7Ygy*=Sl0&Z=X=i5BEgkk!8o1CgUjc`tqs`@%{#0&sLV! z?b2pR>*geCSu13$jbB%A?^As2BGSM0(;L>P9w2pGvcpf_wji8r5$W7B>6yjWSMAK! znn*rN%!|7N%UeifAM1Fp*YG^<)2V*&7j_)WIlunRAM^f)-~L1A^7Aj)qt3`4?(aI^ zd*_Dpx#!N~-3PSDQ-CdUp{#?Hp~;O*IO_t(hNG7{X@PkrUH z4o7AuDk`LXWf2yz=t)8m%}T2}i7!s43YOx43@)v(uw<)C3o1l?_46-!ceZz|gBRZ? z%@tb^FpMUQmje#uKFbp}A}@AXs7WMjh1~==iZuS6oFIM&#Bu&wG&QzMd%;{DiEde zdBE6ZyL;o7o!(rseJ-CM8ukG%*9r+GWqj%DD<$QH4c1*?>=V`^m=g54T{u)%;9Qh7 z8Mb6$Jcw{H*QX92;hC`Dluo3i7_1ja(h@-HIr8Byo_!S8$eD?&=eDfYol5w!h2N)< zt>6&%@%BiEb)FGKo6!4bP;`qEDYC&e<WZ_94zYX;9@q1QS+>m}>F`KpueD&T* z9S$WT(Nd09!&a@&8;{(YOEFvRt_(B*s%Y0;;=@&zR4L z8r?0oNBaFMpZ}u0^}X-d83d}EyGPEA4?cEwD^=&S7tVNJ`^+`_jeq|~+8+GE^B0iX z4z*Uxf;97es#dW^BWX7vg-)kwG4ls-NC(CqJR>TJSGm7}tj)rd5$BpO&{G|0sT)pe z$AX{9eH$(M;0y#vK*}i3nHP>ElUYdJ6`y^WDT0a7IjYriu|EN_<~wBlfprJZpO&4d9qEc-gruc(ATe?V1pRGL_e)>-G;l3oGA@+)hQts7Be}NP zLL_bihS3{kOI&3Q!RtiiZGwo<&EuN&>P_#j-hN*!=7gn^HAY0`NNJ$c@a42%3>4HH zi`mpyO+Ch8FRU*4FvJUKup*I3;-Z4cd4rMy=cF5ll2e?`!vn~|Sel3+oQWTID$4gr zNJ@_O3480fp#e~g2ow-;hVa&_>&y0N=aHtif;hBztE#Y53XEEMRQ^fFQ;)|e$N2eU zb8yh8J`<*s3HYK66l+M~+By|{KCWTbZzJzXi4tr5^cK!e8ZT#pycG}+2TuBQa5!wO zk~kxb?=0aNkPM>(NYDBN#V5F1aRLWN$6H)kwvRr%VYjMnu?W@MxQ}s9I~rs+VuhD% zu>%-oBA*rgT7oNo$d6-OO@;9%k|`}@(U@4+tL*Ps3a5#}7LD#ewTnF*4hJbtc4bXY zkZd$m8p=#riAR)Se;JOF((D|h(X?g6ANh7!=;R75zB7dP%vp8L{ji-{6qN2;tyZ@4 zr#9f=fgXd7ipL>$E_9KFeKZlhqN`hY4*}b+bfrx|U4lU${|`_*wX|xT;ly^EBPmLy zGC4bG2kbELgoP4Ci`MonK)N(IrXSqhwkFy&-#*n0yEm+c-k+zQeGej43Ff%Cxdr}@I z$q4rl0vaQBH16$aZou<^BlfD)3fTsoUj!63mZ zCJs3##qPa(3oj<)9kNBlF9@oXiU$_67$9!>(IY!NF5AY1E0(~E;?!Uc(KV8cNy(H% zp1FjpO@&s!qnyg+YHGcq13Usejz-DU+cn~dIie$Hr8z@=@75>C<@?A}CzdSaRmC0; zDYWKGK=m6nUlak?Of7W|d9c4bf-$gHnqkM`v7jW2CjGw8JVQq}AYUFHS`KK4#hf0X z{&Br+$B&MzR%wXpie!B80)h~bAjvHM(yST_Lw@O7z=Tf%6bIbCjRjte}l3@oC zHytL?MMLaAeWU}NF=qvxy7UDc{_b?H!c};HNcdRHViZI^31?iy_XcB0J1HN-kw%r8 zgyC4Z*4@RS>#!(`d+c(c3J$c(Sc3r3L4TuqgSk{9;ayZNyFiUSX5%DHt|o!r3m1 zBo~1!Q`Sg5We>AYTPqI7lD>k^sA`BT2}HWEyl4x_kY&Tk;_X*^_~@7q#?`8 z_S@h73k9}|7q{&9{_wAzYZp#iPBe8>djdh?gNOUh8}HwCzI)@I^Xio=9Na*vf_sJm zu-Z>Vnt)@WHs6rE38LEy!>;_oo!EK-@5w$*UP+D(TOh7o{y8-GNRl7*Z09 zyDn588nIY7_r-zO?Ff*!AQ({kDn5X3{Pb5G>8FwJed24a(j&12=Sd87E@46z6{^U+ zpFg$kRjN3A@c1o2$N*qPI+9e2ij#00F_^)S9zNW&YtO%A8RT|cQw$?=Jh<^84t*Ms z))7yfWSG+_i+B@VB&C{~gN{Bk>HR)#P=Ts zVyU!h;%4KL2FF-~IDFjGr#@Z+@RtKKO|0Ih$W3V z1tdxT#PL@yVuVD*;fdUoluzS!O(dc0gls%@UTd!*GOhyF4V{QB7vq-V1|<$3*;yX8 zyS4x{1&Coa{QFU-snOgqqR9l`I|OVDachi}Y>uxdc=6I19I}$gIHyA#s9fIm@w0T4 z!9?63+qeJn4d?Pw!H!5bm0twJ zrHEDbXZ^E-75DwC-Zp#kt-?F8R)7EVOp#f2{*vDz9H2$5UER?$rd439137#=a zov~r@X&lD7B)sNc&GIoo{Q1DT2uNY-6TmU$;K&Y<-u0>#E2X1$gu}Ue(zMO>HQUmwbC*?{daik_Bo_MPh=ITZRN)PM8VJ?DiBYyLzlnW&Mva2(hh z4YY*A!l}9%v~}7VwfFGsCHc)h5sQNOHH@^Cn}XsQfDO!CIOEYokva&(J;A%Aqn3^j z)s30|^9%)i(IKW~9Pg#(0e>%wduKtDDS3~}Mf0hqM;|Md`>a6oA2I|x8co;S0PK;e zn#57ZeT^2=>5#h2{l#y*?(l$)`eR=bjJ)DxXGQ+Q;e*}?(V$wkhHGUi5ut~Tk{M;LR?*&rdsf3WCRf&N3!gg~PQ>5N39J}CYuq1eHMmxXkz}~b zPV&yFqKVW{;E^fI)vHv+_Db#mdS$8#2gvt^$ix8*4gk%a8H}%Qt7{8ZK0H*>B;!Uk z>rEPHa?mpmXMUA}mtHEBVBAXLR_3x5^#H@HLQkv?i0>lR z;+kulMI|7t3Y;R`hcOVl>>r@AU#v zUxG@)qY)tuc8WsYSo{!N4vXNq_XnOeU|d}o<>t8yR&TVe2lREZ00h`M5l;T@}7Uson!KXpM{ zh!lEdo9&%de)5Wa>gF~7N#{8Up_lOvSdK{c$agS52JftkdB99*j z#C$8-Zq~BMF-Y-M7LYy3jCpElcV|8GaDB|jx%oE{fk#-IwG*uh`+_Yl0&_f`uL{};|s%xS>g6XrNkwMs5s_Eh^e8v(? zl@Y-|+BviyLArhi2bvX6F^vK2tCN|j-LsAJ zXU*%50e$C|gwxq;;1J-RPU=;l3pVz`c5np81PGm70VKvDue!7z|^#jNcLUk%As^xe3ZGw+{*L3_1cGaZS4dpS;X441MBBrv`*~^?+gwt>1mFl z1_#qe3PPfoGEh#7+?GIIb-cI5e9D%9;6B(tuvcIElknmCfuu@Pc%G2b=%{I5AFK5|J}ZH%#VoQt#b9Jg}P&5AARY1du7ID{*Fh z1qM8Yfdw>!Px@!(v~2OQRl**Khe&k^AB-Bx_C&`K|WT*=~Vh&f-yPQqwRFguvkpibIfr1;2&|xPKTMb?&!T zH|*vKweE|ebfV^9DjpQw*Z>ELhnaeMn(a*I?2zQ4xVP@kJz*#=(46WH3Bbwkd0Q)m8;dx(u=P8^)wc4}{ex*3b4|~X3Jc+t~E(!zX zz5r#fQ}{ItN4C>u#3h9|qF9Whz%H&8=?mOUB$|;X1AF6yuzbdx8Gx%+_ooj#$R*<% z3hTlSBH^ee;0V8iu`trKj1`cdvp%qfe`o8F#VnqO(*ne1u?<0^I~{2dh*}Rr z9M~Z4H=l_pMGLm~ZM^ZL)_QaTbmUq#y8#4~vQ%!xLZgbM0)5fMhtqKtDJc#TbUk&Q zs@;y>S#NjW_ILJ?)@ALj4{q3xz4Ee^?|xwa^7p>yym9@e^Y(|IIKTSUm%W!SpSJJc z-ge%6_m1=W^H2NSlCTHn`!RgB3nxhe+8F*jx4NKx3et5^l8(D0M69uNTornb+a{Es z&lRxJVandmbqI-~*nM(F^B*qri<2OvCI5-^14uJYQcxE9$PJ)v;R)%-Tx|wADxrn+ z{v}qzBBR7dO#B{m5rdipQ^{`3_aAUvv0AYR&X&9Tw_Y@7MwUexk5u!KG7(W^v2mKrA34M7ZR@d=xJ= z#-{*}!lj%6j5Z#Ck>t`=CwD$sS&oh@fCrhUDh&P}>ldU`o{!pAz(KAwJDQQ#jJ8qI z+!G|?9)AR0In0y*5tF2u%zIgoLQ`MFmdeutD&MYq21TXhAA||>0PuflC8+b5o z4wbYC-%ADDL(>xRtc}_nnnAvf_s8LqP$X<|t^!l`jIvhak#cGh2eZ%ZQW6SAG4531 z?59#oT06aNcPV(1N?Qt!B?+flA>|t)Ftr;<_Z3^*u=+_|L?69zOZ3)DX&@(7!uumX zVk7n7JUt00**paIvLA*D1 zT#gzPU-g-MSWxb_J2r=-q)Z!kJy<77Iljig_%Q`OAv*L+{V zrXkyatW|ZpLJ}My=8ixx8B?0%{^T$H1gS%`HO4l^&wcGjJ@WUxclW*q5GKQ(jGjGG z_7lghseKbhzLn+3Fe3W;`l4+vEg({r1ogPHY$DTzAHdvy&05t2JZ8&fets@25#_+HOfg=I@5%|W4FQ+ear^;H~@mZE(K z-_50p035=cUKiijBf}1$9`^_?JbTTK_6~7xEsepB5q(&&Qt@Q&_h=@`Pg{T!Pq|Ip@S#{#7 zK$Om~Pdyb=QUp%E2*;bpA*gq`|L1Ga)w^}+M&x55Ia;oPJ0Whmd1`IWkmIr@(}R=i zQUDVUsejbcL}zc@RM#Q^R6q?!8fITBUXGSG|?z6o|#p<4)w8f4N9{b0)d*$-R(9 z*k&bd+6V}N()JvX;xktNK4^Yh6{!FtH?9D19}kQVaS9JM7<2?3NpeArH9{~_Y0*IudNHCBq7hC_ILL(Da`w1w zRYc^Xa7_Wi<091XV-=3z&PN9hzcbITCq-R4Q7tXK8GBF{p-mq;)$GdiNIDm6X zSRtE)@%!9*61PCaPjDKOXb+!5F2BOGWzB>4kP_yt=O!$XE!tKNX<4wYsm%-=5jh5u ztZijo1)^HDZAsE&;XrkpRaM55MWjFHp0G~+*jk4bhXXdB`SJ^P<@sy2)AOwH@Lk(G zXxi7l`Z@c;#ZyR~95EzMbSXnoZE-c4C$2}AUw(ouS zP1}30r(I~y*K@;;jg2@NZc?}rpaJp*GXLaH`*X@-M=X z;IZoU%6~l9=XO_7X5!~L+BvfrVm$sT{*QdJoHStqbvPHG6*dIo;~l>Ep+c==k!v^9vqd$IT%yA5YrlQ zR=wh$Mw{7LA#Z=16J>ZNoZLH+nr*~V#k9H8plG!`7B(HWk!E%lapTru#ga>lwvI!c zES2nodv9AIw+f^8g*zrdhLzq>D$fHv(-IIAIU=T`iQi^I$|M#WTvtBf?~<@Un80(G ziGIox(wUIe2k&%iW5rGYn+J$;qd?QT$z>bExfN3>MYdkEYjwb2MK$i7(BX0-kA|xW z^r%EY6A_lI4VZFJ4Ev!p!ku$G2h04sbdT_mYLv;&WsF zKd6j%s-k%qwl^Xhk?6pql4$qHOUQ*^l8kZ_mGpjd)&nAGNhh2ic#V8lp# ze^G501y$suUBn!pZG;30tmJyLpbjC6VSOCr4lam1fHAF2PE=GQT@hud$hWps$mk~H zoXdxi71L20!-G?noJ=Z{{#ZP48p>f7fn1gZB|~jMnIheMG7%?#pFH<#%NFhVqMaQs z{@`KI%Z7b`X|qAw67a61Ad5d{=Vfb!B8r-_!Zq zJ`7}Wy=ePP0gh|7wos53UYz~t{fdfZeYohx;l9_Y)1k%W`uyd;m{?qVK?s8%_~eWyvDCKVXAG!t+S9i&V_ z9Da6vj_OUR1qYgK`xrNI`O+C{99L}8tXl$(g#s*Ye8_B_nH5zaP3b4Izu2fGED-Oxm=WGFJ?aKLc zcK(THtqb(Bi}$$KAR&8I3khTF7(ZsW}_KB?=aV2yeLUw2g<1!~l6e zjEmEIv6wXM!=+^jb&P5q%K%`CtuX%{rE@j@pp^YI6!APN|6tLu)YAR>V7z+( z$@VJ+TXozN%`7(!I3IOIhk>*a_e^>> zz}fJmYs1(@>!&VR-!0m3?XxyZZ6VM!tXA&Wqdt&Sw`_?*LCa;yTvEzRY^n7SnU5-E zJGD{-fM{7B>A;0cmu+YF*bX1wGVf^5GE1jzP$TiIBfiE_uVs^3S)=e;mgNkK)~Bah zrKaF5Z<@V()<7nB9z-Hpim2vuVs1_X8IZ=F18?N{=QE5tKB|~V&~vQGKA{|(C6|Rj zI8~xTlFM>{hm6ETfwY~Oq{yaf^>HhZ2byCDTx5#?T5zb390aTZj3n+mk$fFx-6&5_ zb|Y>mdO#-bSAXm^Cyp1AD`oYAPK3OE_|SwFjP>Ddc#FyEX}kF3MdZ^BjmO3)*Tm6V z96a)|5BY__y7hWTzXoBn;dmAgZc#E!TpQ(LN(P53jtA%>0<7m;Yt_4mBsge*ds}DE z+wE%IYW0C;@uPTg#b;l{!He4RN&yhEXqV4zNFBIDk}7ptgzD2 zL=zEt`W6gmO5u)`O$#F*jl|OSfMOOfR_3`(pMsn=!$VGS2q-~8Z_iSM>12RGv`*ti zvIibcM158yz?mSIoybrF2gu!mRIZ>XLh(^9%hbvh%Py@b6)G(hrB|N@%#Dy#h2xZP zFfrF3^~B9umQ+yO`_AUXhD*AswPidnil>rbgrbr#<}OmVBpel4fIMpC0iCA9NgePM zjO_XINDUToaGD()R{R~VUPn2a3MYyX9Sl#zoSaC<)dfh!LK^Yqh&OfWQ-IZjdPP#) zWPNtv069PtQfd}ahlB%RG*%)f%6w5}ncNEGYX~wgh6Bpx5=ae>tY5j0XMAj9AcARn z$*O@Zyf+t4zNcj`N{w-&k?pcDP8KKdC?M-OzEH>jk#X3BL&1ArfAUGIA{~0~;}5KN zuni}$p_%)!6V=w;PPJ=oE-1l>rX0iO!PO#COiMtN8sp?A2dS9CX`qe;S?1f^ZXJ&m zWSFM*DDFY$O3_eGRZ?p)!r<7Kpbk?^s$fxcmx{|Xk;)>vbMJpfY4V^nFDR@N2!y3J zMCUQ4GY9%1QsD$GISLpEC2`ClssM-0fRcM1A>V)sgh6w^@cfgGs>UY=(%PGiI(U#_ zEv>}Kxt|PMu9&qzqbwni#6rnBFt(tijVG!KH{ey-!z3jar?OZq<9s@+#l0zBB0jHC zt!kTzxlJ7*?g)Rrb5OR!cE?)7xn`LgfUYe1u`MzM97^Ka%Qru<^8Sw9+1|C=Z@zDx z!$WKBY+Iz+N0^U^a`-o1mU1OF|){GlcV#atXu|iV4r{mZ?y6-Ki&zxx0zT&u`PoJcvv`PH|HF^px257Lpm7_AJnR!q;4nXv3QBN< z6?yJMP;iw{ohWJ!h|1w8_MfQ|?I?F0t1ZRi>~PSrcxl7Z%UKbP?mav*cQmp*i^sUg z)neLa;@!tP#IFsepxlydu{9PF@1Vf}|4`7y!Sl;5K53~r?>z%!9@|mqv_&QzYu0zg z8Z^K=d~|PHY)F(jbKq>qUCBac(j#+H+G0SSd3^Ws*(>(p^>^*zqaC~UOf;5CIS~x(8 z>=OK-DiM{0NGi%SnY#dFC7w=HDC8~x?T2THw#cF-(<&BBxxUS=3zv>K8x!C=Av$F{ ziq6Pn-p7xGo;e)>p${>Ga&S5RT)3T-XWuU^YB<|KAm>gnw1K? zRuWNoSze7TK^C$Sh~!-uP73fS4=6Jy^3$GNx!656(TN#;5J&Wy?}_%pW3sw{%w2F9#JBX4TKI5{ClRUa2G+(DGv zF1HY!M;0NsV2G9Ph>gYe3d7<0E>~yUZFp38O7f!jD^}8H}4V z`D7+y-W1V;MfAWMCa=LF?tudS;GE@#tJ;w&n0k_qd2M-a+ zQ=B9tZ95Dy#z+C=cC`J8rGW@I$H3A~7>J|8Ly32kTF7XkGo)dbsRBkK;LPFD&oE$7rRT+*u5kPw6rr^x_ zn&NcW-lTp3P=QM*ivw|T|1BW2lFdq2;DCzewhw^}-a`epJ9!O!mFnyUC`wYY#( zcditR8>}3mXYgWmpHqwzEeQp+^_pE;v<}j1a%<9YF|toN^h4P$mo(l$q|E(2A3a66 zMXS-Zxr*2nRTcF&rTJJV%H-7!W?NL4pQ$c|U8o+!Is)tc~P4LEwMaqw1o%UKrZf)@DVWg`0z;iDcONJOu|UMBq0rW zCo1ofJtaa(?wGY61k#O5qLWK!ieriS>{wP>q+KElH@4Ty0c8 zRx6H_V z1il|$Kqo|4{*PrDNMQ4DFBdYUdWJ4~}jeLJnThA(*^P>|)*$u1X9n@xIjK=dB0c}+p{~t~76>M30UWcuH_Q^S)b93K&J52ZVU;<_^ z17biV5+ERgrYV^OZK_yB+p;Lz5T7y^^0 zr*rqs_vD=RiC*hFW1yyHx^Fmp|Ka=Am)5eOB)@nBR|Jo_c|Vr9gqH13_J5@a*Z0)?9rc2Ox)3)4y@HcK1+ydKXVC=XmDDS5cNUn3$MiN$dXzgm`v%4D$zco5!)>?30GU3(~yrhhfqKAWIQoa&-1eiF7G_W*e4CV4SMG=4@DAFzK}*s z)wq#kJg9QolAhT=UE!kAM22t_gi4eC1Vehp)j+MHNh8|m5=qE1X+C}^TNPN3P--Y4 zz)RV!Hc{)-x`mS1Ehl)Hr8GP@wO{2m7d)^_ZfK)5GWp|$kuuPdPe<0I5lAGF*_L&l z+o*7x8?D}b@!sc@43vbEB~l21CD<7j3rqw%yZdG-C(^u2rH$Rlc-8rR;)YMA1K26V zQOrb;rPWRn?yeXzMd&@#L^K;b3=L~%=62Emg+>0DE6}P>EcWcrf>`>qNYjX@wB-fX z%r_Ek&_;`BMaeHE&Z7D=jiy?%XX-%YyDRY+rYD}$YK!_j#Bd=_)U>(1g^5Nx%hymp zZDJ=&2%X6C`==K6>}~9sTv$f&I1T*62aoV@*}~byJ-A~UovDMTG(b~&*#*NPUQNui z3Cj@#<^iN~WlZv$xEwQP-J}ORdxUv(ih5&=8om1k!=V0rjP7D$A}2y~)n)^=%VQ%` zoiRyuxsZXyg75P~5!AxOq$@(W2qnvu2&{Wy^+?d_0e{ zk&s0IOaAP=drvX#cg?7|JV&BoyLbPw^R?Grz(E?Wn4Bi_!H3GwlXvLd7n1kZR30y>stiha3~3_6G^-LO)jGp7(}g#f2qQBkKC{uS_&D9S^~;%hI|;u62gR`K9y9^ViWA z^_Duzc*v6*+cr%nR-=BKhBLzpH5=mTWercJG-fwn#Ww%$x)hfQ;j`kM=f&E~?-DpA ztjQ=VQc%WCMYUr`BPic|0qMXTncN0$-n@a^R}Zm~+d_GBAJ?9_if69wVC%*+$liF4 zzyAh612m`63vL}Eb?X&4d)o+YWpJbewzbQ+oqJEC(Ijd-JvqmNcizW2|M3w;IE3Jn zvnSRZ6OXHYtu>g~Sy(N4aCkX0B5Vyh#>cpm&tQxD*E;IKqKI8ltZ8c0lQI#{ z6hj4%=w#+w+FZSOD;%TBgCSKl35|$`Jcfm~hicoAu&PR$%7GD)YQi(Ya8(jyqR5js zS5Jx(t|~PsNjz31Oh`Z>08yg!JHvD`ZeV5Iu>o;yX=+eSa?Zl0HJ5alK~afm4nS#Z z8X(;ZRhHDGXW}FZYlXG~5#t?nfA(vyJJO=luN>5yMp0cX<{7W~?U#z3l?DzQrLxf; zE0$QAy6M~+ca%BKGtNFfJF~g^M26mkRx=Tbaf1m_Vro8s@!XC3l6h_;!=SQ7^zgXa zMT>`agRxRPu$}^xK&bQvBodpbtK}JL^tHPsd4NWH3lUbsmatnDA`^?i?cY1B(JybGJN-mw@lt#?4ng0GF zXx?@#Qp*tEZ%S)St2)u8*JPNxFe~oxod?Z6WAY3SUeap0>bFnFByTme5|{cTq=KWI zgrv9}Y0Ghg0@;j>UW@15&rNnhDHHMZ^WEGyj9*VMZZhRzq9Leoo&NCMV{{o`w0SU+ ze1@fkEHo(6wkJZ$D#I=`;`Q*LQssf(#B+y-xJo#>Ny8%|RF7WGpC-C%k4&JYQL7`z z!{=-DAXM8^d63UkWQcb9^b9M;?fba3sQ#G_L*aLH! zd+6N#2+fZkqVnNg^p75*{?SM9B$&!j#Ch_B&oqG7xJ2vd9KIsaL2ZDC@4b&zuZGvY z@HN!uC5G*BI7CcueQ+0rLXv2?gW$roiib#aL`0)r0A=wfvuF zKcdll)$@CO8!s2vqS&ZST~mZO^2)xDiJ@4nUPC_`|Mjn%+SFs99DsNPM2V-iVv`J0 zV;YUc!slB5OTeVXCU#$a>z-rl1yMp*lx7o6)ADz?KmTw2wCVnx6DrN-BgW!s9^jZw zA}v%pV=S%&-;5uSN+kHAi#1O^H$IvOKn#J8E-p>7+2H{mwVGU@ys~D9%Y#ZIeKj@7 zVyVHXZe8h((Fp2$TIViguHcM)Jm#-V`ZhkSUPQG9%Y0j|phfEFa;|(9p9;2@15YS50x%&nBJkt9VIRq zFYVygr(UrktRlY_;O=Hjk2ZEkbZr7am|gk~86pj6_}NnMOPSA@12G zL%G1k1)dzApxP!}?$2=C9AFTQu2pj7C3uk1%BKXE7`40Hub}n&OA%)@nH$BLhEj$K z$7r-f(l4p(m@DR_u~l{YCQcbd{k(>JDQE4>jgu1^1t~?Zu#*bm<>Dp|xDKzCv&daL zG}6+CfAq)L>@|@Osl%~=-C_>q?L(p#za_M|lo*#jf!xj^9ZVY^TnsVZ{}Q%7^C~je zUV*!@1An;;TsuIY;nLvdYiN{jU`%Av+TFrsp@4I5g*J`eV(SXJ=^G3wBJlHq*Pq#}bwd|AykJB(l^+)0tbX*67iwyI1q|G@w+XdG0611TCeb zkX6qn%I0$|RIP!xZYvgaH)(Gr%_Rt;zFwhp|H5kjy5tc$HT4IG13;t1D^2&g)-=DK zgRnB{!ZZk!X!I!wv-Fu(qjDY+`4RVrY)y~`TM2jf7r*vJM~xawC24rcMX9aKqdMXe zagi(}FljW=tBB7&V25nbYTJ~bILG?k5e-4yF3)(>Maw)!bZ%A($LWCE|^LYqP8b}te+Kj<2jf1?ChG+(zp|y4@ zTO8Hl?R)E?A~66Z#NxUhgO<33+B!9dAQ27?5sA^rI;;2`DH^1(J2jp+%`w-1K4KNS6sN1C>;BoE5lC2h#mcM}~Yi{fdVGwzkKNYYrg`!yb@h-IS{BB?piu|#9Q z#M_z81Znq`AcOtmNsS-r;+2%LZ*5+*&t><3B+x+vrN*~?YsS$yuc|nF;t7*N8!*U20{zD9dJ4kNd#Gvsuwm#R>ev1O{>i`mUFV1I+;zVA+G~hK#ID@tMON!;$eN~BCd9cGlo|0Z&D2w& zMja&w)o{go79bjw{F}VLG#)gl|#Ibc(=6{RYa7`F#>J z5&6!{8jyq(ri%NWfKB>|pHLMzdHg8P?n*7t`nu%y#JiykhPyUc?l1h@&pMU!V|1$L z*x0{$7(3&g^fs8Ts8q}nwvU`i!L zv8||ki!pJO#zGX>vpFGlB8>FBXPsXXz*KppBPufSmeGn$L_s!#bup>y4jV;|@LcOnn3VTtVKD zNHMuSg9?JY$Zh2p2*EQu+t_F9sF*s(%OT>)UBd3PPu`C)VZVV7Z2D5hpZyy(d6h3_S14OuPg@Y@2)Mz03=nbqkzKB2i z!*4lX{=5GPb`mane1=Wm7~A_foX}dRMCo}0wBwtoyHOytw8nEQEUqIu>e}Lph(Hf~#ij%sv z63E_a-TR>Au5s~8ypu>l)h35)tI0rdGic&;uGpSusBBGI%Qa0NjjqT-#~ALrEX-0)?Q24n3aO8=FFAlmSzAg|3#x^^>9yJSH=q% zTC1G8>)vF=Lh5smtatz#eJgtv85gUYYB3ogq?vdpg$mI{fEQm$LaCR^g37Wf+bbF; zNn~qKNETLEPE#ai46c_oQ3TB$=tX3K1JdQe2krL0<*C0e5VMl@`UuTqL#buNgOCMLzDq@7>&`fQ1wEQTTt-|2&o(4wKp z#CdVs9SlNogi~o7(Ulaqy5v+gZH+}AmO_XIS`&ogz1KXwsHkGOqP1n0vngCWeu$fd z(YHSR8s2*2PY~gnKXY&mr!=&BH+la^BFfJin5b!;VVp;!bVfrk;WJGDV!bS+V&2x znZxnfPjKbx3&@wZQLU)oNJ%@HJi7H$-%ke=JU`ECD8HZ zQ9~J7h8eN?L!zoYok|Z6PMatlei7GiUBkV9{XgI{ufBl$7oPL*tsgkgedU+2lXNgv zWr@y2q4IpG^X`~4>-77G^J1%}FS@!gFYa9ElFmjYO|`;H=TR3{{1wYV*K`Dyq6wR? zD*@^#RP)emJ~qlc3%ymP^2S!?TiM7wOh9$zH(3iiheE-Q%8r^RSghsBh3s^0T($UX zzDK+eblUExUwPi~dtJh$tTmyu1vmKM(yGU_VI>CD5f}0r!ja~=dWet_bmxyG-X!)Y1U@JLlb<>HSs=-SzRs)Da9QDid zASw}=DrVO6?u_%35=YhSkJNiI2^$Ia&mF{5QEP5mBy_m^2+)%bDiy@&9dDMCh;pCK z9)Ey=voKa7g$(Kkzp_=fth1l-t*oeD+<2sg%~G(@1iyy3J$j zYd_?9J>d78t#*(|ZsVK3^E=La@BGlY{rXqA1|7VA=RS5{|79X1A~FQ=7r*z9oS%OA zHVU0Ld8UZy#FfbNbJ=IuGQGf^_a32q?In~#O;jcc_;a^-9~^x2o&OEL^0&W?gHQef ze)pTd=iIt+9kEs0TH;k|lNz*={gcb56H=gnoIp{rX%3D*n2S@Tdc2^$>n6e z=3khvTXc;*+>Kf8M_K!b^ch@@C1HR0Q{S1V<`WTvRU6?|T+gXoyFB=;Gc} zOQh=iVwoBDhjs`xEw|!D8;*LITZ^fL7$^KQA*vvVXpMqcR|CWZLx|~!rizC?!Nc5T z3_ju_4ySACDXH0Ns;$|mn?{=$U*@XsTeAa9lTd_;S#G*``IYgG(U6Q993&LUeO~(({OW}*w~|I z;N^)Bii-@y6T6QHHpNsViZFG8X#gmuxremPYLC4R4xW1vy$|p38P&J3GVeXqzy{&H z;vOZ$7SoY+iD{!<=>Qxbn-`7KQx1trROwJ|A{7oBycEaWCOuy%s*F30l18FUmu`gJ zQVHXB1CNg$qS37wOOc)d+~c|x_V)1b;vU08hEs)-aVe^9EtE1`1Vmp;w3p(+kEkCD z({|lF_>>+=nVRLmgR5Kvjkt!gVylpOyb@7plukyIgL9rS%P*M9(im|f1vwtkbBiWx zlSm;DNuf#Oq#2Vjkeu;>SMY=1|DT*IpZYq+y$Y`1 zc*R;|594iw8}C@+xyg_#Jgn1*rifn7@#gn_2e&hEoIieo|NGnDb6)=1H~8EaIC=j& z_@%GDhG6L#{Ps8h(0TsGHvHmyJUwTKoHVhMu$Y4^Pqj29<>gFOl7)G1W%3o;$Z${l zBP3Dr0%c%;uoE;tchX*E~L2WRn}0er;;}TdYW)x zEjKFtvrcDhf8QWv9Cv$W$&@V9eEj5NYp*Q1FCMq{S;faXRL)q`&)j%f{;ue`A~vBk z=#DH-5+D@qoLGO9g&ip)%0t`J6pwWO6dUv31O9v_?3zBBN`)KSTZE5Iboe_7UEpd6 zBLquihW)gLelB!pg!9SR-a`{t`?sI7p%xt=@f-U1Gkto&z}A)}=F*8E%Di+@XO6T> zD9puFf<-L9i*^mUWE_jp*b*``9ug%11(QYkpr)tbux$fI?XBDR>pKrnZ?@4sd4&1# zQyi8OHUlnb=!<8Kg3L)LZAeMk1&u(@SL-oO8HyA`FrO*AIEeDn?x`WA(M4@2qLro1 z_Cxh{8pzWYA#al?iifJ-8yTHe{j!PNb_qL~l+lWh72DIBi3usl&&v^Zipq@cl$UtL zy%`#x!S(CAa8%JyT**CN(C~>L|B#=b;`zA8eN%aHMW`Rv2z5AaVV&z=8f99wJLRS7 z^1@9lBoh^Rra+^>czH6D-1ywG*y`_}84ttEsH%0&2Mm$K_aCG8P#JO+QG#yD!_GBc zDMk)ie0|9GYSb>Q!!*Y|eEOt@dG>3F?_9;B2X`EWp~rWA?3AB<9lOuIN=L#4Wmvcx zHECcUB8(9>vPt~pTmOt`GLOKO7cd{z%;-vMpe}Z#=mPuOY0Q)R*x7rADCm!ocV^h$ z*~9G@KMl{x;~?ipG!?=-_wFD=2dZ8djUe~vwHKz)6Qn~_rXJSM;#!(-Zd73thFGH5 zSQ&q#W2By1XH^73{3l3MJF_OAAdNzt8~k`h=rcTNh$o)POOtEJgB>$yv9Wh#{nq(xw%W5TRz7 z)gLfgC{Y(%Xa9>?#$_>MQB89(M-#JMFVVxo0XtBB1omJ7Jpv!+HqbgH<3b?vGar{ET=nUt29)^R$B&Na@fjC~h+@?L zK?9TGnu%guLqTGpU2si9i7?*!@w>cy1)Q|bdDvInucYW&!$h)}e6{xrkEbro&A$WoQpQr==B+Hno+sV`=>GOh&8@+iw6bQZ>vC9Et5 z6*Hnxwc-1$6z?eqV?;M9QSy7f{L?QvYBEr^T*46|OVj{Ia4G8-Hs+CN$ZynOK0f$Z z1RuJPdT0&y@L=TgNnTW+O(-d8IGglLTY&Bc;&&Mm|4$-oRhy;FEb{@yALqEn)+@%f z9xr>E9(eE8b+j5)y9{DEnW;@z_EJKmya*G*Lp98(P9Do-@%Zc#Nh$N>!#J)S6XFC3 z#fmt4c#4}huA(cM=%WYNSF;h{Ph=$G+b>JWSEH8Bn%h0eg;R^KIM`KYQC&W!-U3N1 z#Tf^xG{b#WtlOO|@bK>Yh-iMFv98HcaTEHytUI50715o23{Ni+$_NrVHdvBoh!83k zG3P%XFL00R*P~Z>G++o3()|6JYCJ4)2*!pYU=Srf3RVmcZ&wcl_Nu%tcMekF* zaezUmjWSWqf}a`A7ZBk)D2Xcp)-e%VzF0u0kjFh5x!Jr+h&n`Al;E+vm0Wug$>3g> zc_4#?>;BQgNM0^h^IKP@S7Nq`|``rI1xUGh$DldDuQElMM@Ne3ClFc zG%_7AkB%W}Ja8u4Ek<5$VD{sfa^Oqmo+{LI?XG~v(s1p;b^(?fkYo1;)>rCN@jHKG&*Lf&ithEv8RRo2T(tjTh zt!>w9_pIg8i1B$KqQ$iF?yY!9mA)Dh5sU&c%ep3}edp)s*&mFSChw#cP-!fL(rF{s zR5@yw$V4KinOxGWu@X!PA{ANuC_@QNnFS51siqz_UOF`{N#sPsP{oZ+?9#eRU#1x%KXy&AiXE!#Gb404zHASZ$or-!Z!Zcb5 zUPy5WsxqYB5>=1JVo;_tQO>0{4&seJ|F%=y-o^Qo4~+9t-He5+ui~Wwk?r*Z)Rs{? zd!mKzL;h@=DAL2Yeva+s2&;4qCzls=DkY<}R}Ef0FY=&qLo*5d`Q^X=n>eOnJbwHE_h@^KI5hni30d-6JdrACPn6SwYi;Ut-YbQZL57v; z$dwkR!|*Ygh#K*VGJBfb3`h{xsNfn>{)ZlP}al6WX_J47kIcqjo)gztB$~e+R@+hJQAq{rU7}m#2L^RC!rSA@H3=RS24b;jCv-+2!Q`@8UUYnV1$=xG#n zT*ZPLr)DIL)cWTWxZ@tq?mgi~9pjh>TqCKqd-rTOW!S4DIOs4&tf1YfVBD;u+iB1+ zjBs}Usg<=v*06JBA7dWi4k4Z|9k=PQt*eLldU%O{@#7ERFvju`wk7zSO6!WYOa1nu z8W(q9GOElr?0|@XMVp%NFOa0c5s&_)%S$23D3!vN^ym_XAQbO&%?=MX%>eh?XJ}O) zAyK}Lqs9m!uZys^So1FO=N@&Y2z9E6)9|Qu*|$`v)lo`CH1r7bVD@;C91TZ_iaTCF zAh&^0^AhE3mft_IgxiFMAj*sJ85-3zjqc@igqxe2*rW0N(c3>jm1>cF(X2FJpROmiGd2BNpYMM&%Y__{i#6SI?BS2KOck?sYy>ScspZFra z_y7F&PX5NL_(GX$=xg%PlGqH?Ou$m=?^VP3^9W^4@+LMn^*uSyPkMWt+bSAbR z5qYY~Pg;y(2a=GsV;TJ=_GqvM3~j{2CCd7c?vs+YBE;qSRT!qykV>`E5|qSVSd{jX z6;tDq1`oJq9`Ddxa$+*~DzDQ~i$ilFO8eEyss%pf*hC=u)z7`?D8AGXfi(S=jH4EW zxe{yeGcJ}<5bt}E8#`%rxUu|NwtNKYF#w=S;JKTU0$YEdqi(GXYAR>^0H#GQ&}3sR4QdtgT*aEavGcu?%zQ_ ztjRUnVICl9BB%zupivD)LRJogl#e6_MeiOAM6Itvf~CX$92X27G#HZG+D1ns$zsn{o=oeKmTX{qZ2;(I#EW5$nHKJLjYSLX+jPyQx56zGR)<*Un}^E zQeNe0o|SN>WU9*;k8E=9>9CD=zVioo`PI+z9S8WSn}_(P|MK^oFMR&J^y%0M<6PFPxb3pR%7_Z!(lP!2ZB~-t?+7e|DHF`PB(IM~|6So0X7mJ$*Q zE9Vn8ZMs&si&;7gkH$EzvMiB_vf?eGsG;i2%J0xK1qxf3(6H26Z3G!3Gm4^ja&V{e zi0`;#`Joi|J}h=3UhGS6Z1h_*8jv=ToSIKU3?nr*t-X~TdxY<*Fma10Oe({X@oe28 z>bOS3JyZ#e#wMgPv}ov)k|Aseix(0V7-4Sp@&xEr;qlz2KJ}Z%rMIF* zyq&*^qe>IS7e9{?Lo)SAtY!oLw;%QTeaw0d%ouV=o1)ikVbSaul&;npk}k){@!Xa8 z+2QO4>XQ57^KBH$JbM@D^89`4M~|HApL`atz4j8)Vw>LF#_6L+hVI0Npel%K3ZGGa zruZcn*2LxuI5yrJut}Z3x|d(v0HeN@&DG-V7c!zVQsbGb15r(qD%(#(J{1a|ER06Y zuf70vuS&km62~j!0bGf)oX#}35=VpNg{Kn!^iXtj6&di;K6|23s#FoK&C(tNk-)wD3m&MP`w(u#;=!!&q!*wnNkk1TVg zzIs6;9Y)b@hxlM2i_h1JI?80G2=m%>JI1j9u2rP8G!Z%R{m@Edch zR9m!=b8e34snzZ&#oWSX$+{jBJmd++f}$7`lM+udE-x;S%@q)qSZBRqHP^x1hn?*$ zK2OAwsy=bTxl>GA>e5SC=cBmYC)~VrSid)D?5#nfh4jaRN7_tr3WoSjqjtm6LLq*3 zTA5;cf^am5hY!!tQ@Kuxvf-drO!|yt^?QblF-sdoD>;fQUbNGB#oSXOyG#zJkMCnM zl}EqJ%i2jvOM9zec0wq3tA$#~*yA zMbMR22ty67(xOMJ5=Mx|AYWi;%XL0$^ilW6Q6u7Nwa3^gZs4r))LLuRmAK32ENyNf zvb}-5>(Ao{fAX*J4}SHRk=CT1?t%I%=um{>?!NsKWXdJ$I|!?pOBa=A$CB#CjTp9; zU?r0S;;wZ3RuYWzE`|84;sTsc2mEu=8i$00UG8&~XK-kS(QnOnGP+aVO(@h2eq5?9uY)} zUr+K7mvTJhtF=a)r=|~HZgJ$P^-&#FL0bKEWQD(bqlmM+cX3Y0KEABe+b56}=Xv!4 zb0QTHOk6)G;pno>*oe=?!&W9Lh^aG>hbYVg5Q&S5%rg(Zzrh$;LK^h^#j)s>4JFJy6bBX0)Q zOuD8U2U5lv&`ZrMOcGCGC>XO4sq1-`096G-EHNT~RO&dwixQ*}?$H2TK6;3o`&W(3 zLc>XlK?iffVF{+_f)TQ67^KD6eb(+G#)GrTy^_@RobM+3HR&IQxo;tQ$UC(r5lRM| z*A9t<_;IPcar&+3S$Z_Q-FDA(8GO?&4{Q`2deDBgBJu&F{|*uDRUh5KmHqv7MTP4W z6`3cWS<-Qu-i#6jrLq|$fw6mJ|Skm-!14+dJGR4QI6ozw6x@YBUPthYyh<3Q~t@u2A5`ZdprdD#eJl z-{Af_rdAwPQ_xhTr4ba0n=~#nqNoVY&oAIDdBGVjhzwRgpQd+ol4<=O= zBfgtFod(c+@|04@O=gXUFG^$nxT~h3wQy$T;t5s^XJT|h`?)lcz!J4O!-(`Da(>m_ zBSN|!y$M>%Jo6yU0#RfSuA27@6LLC% znbCot_ti$6Muwje;4`1rIv5cWs--hm%p>lu5GNcA&P6q~uvvBWB!t={^qxMozG}%a z*;Jvb98%e(flxV13`QF0aOjPj^q!+3e-90bT9IL0iUDN&Hl%6epFuv`D!fFTmnBCd zdP(@I2|htU2|tE4k4;2UBNSGTd{1zUh+(|&2-!s`J*KA>gR2k2-q5N9^;XZm&xjlO zEaC#l^Dqq_yocKPnf3JN(~hxuk*g zo<78tD?2E0ot8nud+tO1=!A!Ah2r&R(5=_eVR&LKrF_PSIt}ANOI)f`v$&bJ)?*E9 zi7`0L7`~_}(FhOg!}lx~q-5Y_^%A@)L`+MRc%IT+LowZUCNAjN=`kjj#4Q|NA1!|kx6|Zikqb@With}V@yQl9u8U$zI6DakT&9V z{KXI7boM^;%f=i%)o{+lu|5_@s!coxS9c1Cch3+BXrgh9vybi*+3~{CSSIKMTN>s` z#n7dtUX3L%u>*&^O>)G1^)AU_`P=?JFnfk!n5Tf&iBae z?c>KEyiKH%w3&WK9@rXO14gQ=%zaP;K%*|kd`7Vfs~tEhWUi_eooGrWNpS|+&k-5% z-U)>Z87SfI=Uq^qMheCXA@%cWi&w}mj)G`BYpw7~MC)_KzO1m;eg38A)T?VG1ELag z`QN&1rOi#u8%>BVY{f-t&RlHVx<#uB8za1NxNVCuterBp$@1dNt$@*xdBGELY!g1)FavF1 zj8?TfQ`R_z{@EoWlJJs%0xwE5vyO=)T&&Yh1?}b~;>A5g`1uMcdh}rTXhBcaddh_i z6CMX>prSND8N##T&1X^GD;o)F|Ag@#y>v@~8;wY>*)`_Xu;7%KR@A#sG?YmDkYj8e zW86RYh0QoNc!@O~2g36-*Fhv8En4L$ib?>rivickm&qDuoF)qEotAagdGypR zg$9}@r`M65!X^!It#X7rC#N{-5|W=+;Nv0b^ZT}x=$m<#sLO;x7Eg7U4|}UhFstO=l_jUc=l(IA3jB7&NUry?fskR za$Szv9or}ES1FSrG7QiNJ2pSjZ`P3HyYJBW9MN%>>DYew{$uAGU;Z@SzJDLD7Lxeg zA3t(lytPYYW;r+P-MEdnzxO?CY-~WZRi24_xW?40yD;Y7NYz=W(oqsnotwNEu~^E~ zt>W&wVNFh0(}UrF1WCjYHD7BB+8|IEEk3tD=vw!vjONVLhg1$1BXZ2jkVZ@_$#C&| ze&g?a)$#gk-g3oKXWE2Q8;AG&zNe5a850m%0OQcUG@8Kewcr6cqA)K&MNIV}g2pFUV91jS`n0w{KW1KW*3ZQYgH^h_zA?FeqINLb*6YFB+)T0I|@RsOK?;jUHaOzK`nE#gkgihKV|-C#W(c zJAd#P^)``Q?-)Gw=yfX$o#s-muz1-$%6IOfWru3XeuB zBgR~%_g53fpgn_@WgeIWjeW*9x5llI*n*VU6_YTbZA7HZ)e1hU)DR+CkSM1VlUwx` zmMd>9z9L~0e(og=bjD=dW@s}Un5i1TgWI0ME=8CI!4cU7A@N1MY2HpTbAv`=xtdxN zOC%8>N}Dj$Y?+Aa$?-W2jK_CLT1k4qi(F&eE|QN-)`#PMm|@gfrdxw#(iK#W>EOom zSPk2FJPc!>XDPyUIB%U`K?eh`iazaloA2c)H^xw4*lC;L?bf=+;3M&s0-f3WAAN{# zeC9>`*Z<_-IREjld>z02yWhkY3PJq-TSw08ufJwBcWFj!(Sg4EXWzyC^_vp$UN;v> zDAXHTqtAklsz?MSv>kRu5$~8mh{e;^1}$nlQ;Omx(Eyp`^K`kTlqE)Gzw$i6kc}nV zfC1k*5Ol0RKpK)Gsaq+jKU&Z4c>IFsdZJsek+C(BJ$S4`5z5>Ro4Ut- zqqBl2L+QY&b#%Pq{cE5mnWJQ$_$GuCZFV@#2c6-9m%q=4uX0iPi-2W9MJ5rU#~HMm zAjCjSEJuXWG5$wjvc%awT0IXV%kt9`G9>8Fq?R+sISs@G z(S&BUd$j6lB7><*Vf#&}is&r{=6x%Dau1+qg1gk|e$k;wZSnG4AIAqMczP1X4~ z9?ZGk3_~JmUIqo}A;b<3F)44sfAu!nj2+wg9AZ}w;OEb-az(iD0uM*b1R*4_>YsIx zmnt&RQj%*{;d|5=%S$oHi#fR9<#@AtRF-cuBbf~r(#;W5_<&3&5&RAAu-C?~=W9J$9>@Xy0^$Jov zyQz&GBr_W{3=_LFQ6=MA@1r(y5XxNTS~I?;6B-kdbn5R}2({{5;-l~ZQ7*$Je-4e~ z?uVzS`b$N8bXUT7G;_XTmKfPD7PRA0%)<1jWyLe?Y zfoGH$Rr0Spu`a)j8#nR(kNyVN_pTZV?O1g7(V!WZpqhia0~;+C(WeMKeHtXH#n+Fn47gfcTg&M*~AD?P+RsNt6~M5(r0P_I1B8Q2VUnpb1jxM=I=ezy1qf zas+eY;vwT^#0a5|A3wHwr6%0kJlILbtWl9i5`x{kIJM>$hu~|o$U|m~Jbr|2mU(F; zhN85Z(jqBw)|;*Awj@uig^*IP8a~7tG#z_(`3ACdKEH{FwEKi_k%YyBOCG2JtzuI> z>J!76ak%2FsH${~k-)q#LnAatYG36F{fuQQt z&UzY6Nfarzj!lcuS&M6qh9<1&sSKEAyiQLT2!t&WRNy;5w_U=+JMUr`Na12Exu}So zw$0GDX*9+n;ZRvu)aD|5P#4D1H6x}Horamjl~AC;su9762CJdbYaWJqr)~{b4&%W= zb%2wz3u^>X4^1YpRza4eRg!ysdus!EdaV+T%pMU2-x{UC3|Dt=fsr(}QW|*5%ck-& zH)tgJzC1wEq0cc6zkTfnidj*8@%f`U5x#8G5yXVqUw!LZ(vs3 z!i)xD5XfN~O&h&;VykF-FHzSCFNg*iN7I05{+;xRMiObfI~d}UF|^2M8fPblOoq}g zpo4f^y+ozfV7S@BN;9FnpUvRFaNa7oWAjGkzD7 zkVei$C#H(RBDCiAQ{_nKe6Dt4cP$w<7k?*_NBCogAtjkL)-44pB@l(U+<*JiHyzC| zk5!|WJaV^du~|YNqi#SYzj%m)^g5TvkI}n4N58*9ZfBEcM6t-q_~ArvEdq$vV6Yb2 z6x0xz0SG7e*nuwbaA>{sE{()c^8unxQWz_SL<}BAmN32a4n}+rkq*Q#rN@%qpt=m_G&-KR*>hQj6THkm z%}TEajC`sFOxOGd8sAh-pxbG#65pU`k4pFm(x!BM3{@1xBhV^Xbh zed4Cp+aC>#JVj&8KIK#R_da@Lu^so6Bhf$y(T2vIr@;gb0imR(B57nb5Yip-J!n*V z62TC`X{(0>4Vj5X@(@YeK!zzs#G}qV^)sl#!f>02rO)uDhbZA`_wlK^{?R>pf)+!t zWUh=sr^@fAN9heM2ENL0ZOBj}A;n|<{3iFSOatktyx1Nfq%l-M^s&x>K01!LLNrGz z&PkgANr~x}$SgvGF=+MaNK{5$!X>&{%o*b@!|*kTZVDyr9PGf&WHDz5nN0Jd`l4{+ zbPCx#n!IcS8tJOS37(H9C#N_+y=PMMDsjcRo?-4)o3Vn&z3VlOF>3a(q!F5o7*f)x z&-wRlBCNSTMg%}q_T#td7#8&C=Y;B6oIdy~tj-@Gvj04?gw_7W1IG9v3>a4{v^$IE z@buw_=<;)Yci%+)qX%d=xn>)iD5oMwsZ`88jB=k7rq?&KSXyPgkjm72KIIQIx6NfV!;*L_#p-IB3#u7w0>An}G#{d| zUv+=z9*R8(>#|-XDghqd?a(^$M^B%W^w?l*$?0H3rP7tDNVzt@NOtTejH%P}Kl^NG8U7B?~mGJ`1wOW#a%*wRdstdkx>gbOOV9mrNRund2sZs5u%7t*l#?6VbCQvC$UJ)S9BVv zG`kpk4xWw}dhwuarD7P+Sj~wpq`92op7$A}cj@saeUdkz2twF>I^AggVs0G^EfE`o5(L|v~?_ZO~GcQhRIK_-!FhmbD z=?~XZ?xMXCTG`&l7U6qd2J32h@Z?m(?}iPrHGZgU8IRYg_-BEXDQ zfYffC-7KLd%?4=&>|aNd4}DIfAgZ(>W9-uPYp6*K5CzxQj7gbLb^@AKey(VQ zufxswH%)kC^UPudCd?hzFRk-PM4vXvH)q_$L#kw#L_-T3y!`ZZ19~mS5mvg=|C9@r zQjFxPMJ_5;6kRM?)~K}IM29Sr1ZXP#BO*BFi%97`{%GRkj5Y0F* zsJPL*xnuJUOG0;vp$JwN3z>B8_`(x8M|i<=B5d0&sRaj>3J@WPvP+b3l=XTK8!BT&>$Rc6JodZd$)Gb z*Ck~9y1l;#ulW>{_8He;g*c(S$W5C(#F2EtRBZ=+8R!YdgMl&5XkBHvMaCho#B*!o zy$gw15N0c%qXr?Bw#Hg78ayF8RY0VA%Y$KUs!^^*k@1mc-o-m14hfH8NnDJ_{QNva zJ8lSe3Q6SBDHPLjn-w`EDopddxl%!vA~QqNXn6xq#02g0kccO+wUsvm8RtGpwrz59 zf&dYkKf8%YC`N>sVbrpLEru^*+R3lf-I~I<{4y5&oY3}FtcrX5?1+{50z?4O%O4{l zW@kDjF-wOu1yH}hTmxqPF`5ijT8!5_?J>?D9-&*ku!+d(#W@-iZ_Q>+lqOc+h)Y9D zliws7NQG7=>gqBc>kL}(Gkn;5=2?9AkG_rFtIyaOAM>UT`h9D24lvwR!x;)SBqCc?L^NAP$K(F` zFMZXiJbjE#cYq*Rx zp4v5T@`+@WY5y-6=T#dmQ?u2;P>_Z~6ND;@X~;pwLL!Buxx!-?S#FvJBYe?yPq=Ef z60#ifa0y;cyZv<&Loi_6>MDthSJGCi(?e^tF=RtI7Wb$_j|V{W+}#?VjfZ?ZR|t^9 zT-3~5EREJS`8#C<)Sd~6iKwqyq#itYjVF(cJw@6Bn%E0W2Z$s$oG0J^Q-t#ywEP21 zcu>{l*w-w9L_361h=%g~=-_O;rVG;?K0Q^!@7R2}sKBI%bg+>iR9>J;PpBm0ijaK7 zgC#w|iL%eU94;?M*W(5@PO-CFwlVDl7vagHQ&hOdk86EY>ogh+UEZbl_VE(Pcm z!n!?~S#Dw;axEJ#3O5bQc#GAV2v(c`YCV;XfygM-YwyBZUWZ!qY?6nY2hOEo;Q5k_ z_+@iwq$)n{TaA$aU}FoJ0KM#Vh~tYo$|02#)lEtWOhmLn1X5J@Tm2Y$8omgPSe%A< z-nuaE!!cv?Fb&p5K50!js``i2E!gCRqZe)y=?umlzB~6LoU=x$N%I)V$t8ADL@&kH zkxr;JJj>@RqClrG;iVrci5rj6Xk_5z=(I{DI>SxWiAXQ#!Ovq^G&BfBgW~45d5^+2 z9>1XBSKFrThHOI87AysIj}VoX_1;B<-h_q_{4Wm zDW8{kIrU7Ad`e_1O1kM}#Pg~)`nWakY5nIaElOQLRP5r#TujZW2pQ^lP8qg2H0=J5 z^KR~EKXuC)P8W9Q^Nj0Bei`o(q{I;Hkuqx=zZ5)$}!ON4z<$1*>yL4#9(_iKK ziltce=$e=lf1j!cLQKUVH;|X$#i$P;l22T*@0n z5`wgRmTncp@e;9c9w{1Qm9P}U2Kl|weZp;VCCt`s!hzt@NF_>{6peV7VPJnf>%qM< z(N;e1^=oBZUQ|toaKZ3SWTu)aS!fW3mu02K0v*i7)Xs^~!HJ%Yj-^iHqv=u`exiX( zB3tphHg};Up)88z$}|b6k$$1Ar8*7ya~d~xf97*9 zIc`LDkrkvA_e7P9zXeBN6}H zAS{)J-`I=@uLKW~`0{7!V|M*UVo0Bhkn#icz~Z78|6M#CMuCT-Z)F}{tjPr7Y@P^O zvc~~y$eHo?d+Hfa&(ZNHsjM>;|c+ShW9NBP1zt@B>N$Wi}8V0Q9YKa_JW>iym zYRC~UTPWn%n63`zNEbnBKFvPPX-MMyzVK>dqz&P~62I`;r}3RX{tk-ewDGC6=nbun zmcKi&Tv(z-Gv#iCznO-ur%`B$N!A(v^%zHs#FJ=b&b5do@|N&9tJV-ua*K$>6S_&| z5agzAk`vxaDhB!a~wjqEwXai2Q3WHGgj&wJ27iUZJno-~o$>(pI}PipkZ9^zgGP}azeK|u=UFHa z3CP$nZoq{5(qVWoP}N7%hchWI_pCcl?`e4@8c>x6PcCXiI=4`u8^|alPUFxt?tvM4 zJYN_5oUXUd-PC$hj5RPLavG6wMY(TFns#QfGEH*7(EUwXZCWHLJAufpoy>^Sn zd}8x7v0I0TA6&!juYMVI8i_k^{S78(AJ74AAR`HI{_f$N`$40nc@m9B8_IH)Hk_r# zA5y9_ZQ7Hn(y7_Vrh!$7V;JI%$3_gYSnbzz8E;qHZHp@E{tmf zCkuIM!mv$#Z!je8x2193OS(pUbfSe8eUYC~E=miQnM)|L%}W{jxYLSpAHBKg$rQsV zdoCF7GTs$BQFh*qrRez;DlkMKB9Kx`SYAjRYN8!8;dIzM_SnWK6XADuQRk+t0`l-CV!_cURYfA z!!B}St{u;9PNA=|BSQ~CF>x-Wl8pa}p89B5fXrWT^u#vZ@Vk4=qZmnX1sUp8{xjy`0WHyV0%u`(5DnL(}$f^s3##ZrG zByDx#h^r>530`{krl}JviI>|cF{BF;wb66Z>knpg>p?gEIZ0@5=Fw%?GvIr4jgmTG z(|`W3-;|n%3~3aasZgcTtXFx0&HZZ(0oD@lE{(9tJO23ywI>fy+`Y=n&I{FR(`a|O zb_2Zf^79Ps7N{s6wFp=ldamL+JzJ-K$#XU49=6b#iB5hWBfh^WCu@*KyoH*d7v}`m zM;ZmoYzZ|UnAG;3p-=JrZE25b?31~yUFK$up{f#d`LfZIzaMxG$DJO|y(pF)4;v9a zL$?i|#C}s}*`O8h^~@>*$Xda}9MTbkEc+sonum z^l6GvgraiVA+cOD1o4@=n6w3_rUx-MV&R3MRei6cX~3WT@@JjhD_2m^rJ;Ad^Y9TN z{*V{Cf}I=B8k6tLxo#>fPBEv@(utKeMtDCqr4|_-SlE&#^b2t_#2=szMTG@|Wpio5Nw!KfS)u?_-BcUL z&&>0A;;8~&`t(aCdmiHV255Ndgj#(e9zr!6V)6TsqcNIF`#m7>&IC7ZM6czU@MoA` zQ)7*fF@-Ujs_zT*lg?o#ou5qQ#>p z!c%p%x2Ow z8eues^y-ykBFm(SQs~geX&5wiKBMOsxu-nT&_^`Fy^C&a;_NTJi%p)#sZoM+J<6Nb zP8%lD9LLh=uSN{>S`0^0DD(4M%3Tqqh#Yh}7!moUc{X{trKv~6F(#Tx(DCdlkHnZ< z?e3SdgFIl#M8;I5CjNjiSW7Hb$-|3f5GRYcg-Kmr*qnccN&Ny2*OLbiZLY&=wAQf< zGn`V%ZK66d*X8{2BO+Npzm}#!s90DO=cU}DbC{MkFle@srelfn9BvhJnD)8942=%= z_J~+Us2(37oiFkH!8kB9>FKF@roMhvkt8PT`Yi#da7`5;sT42Qq6sG0D*7*1J^%a} zBmb~m`P>?+777o9%yp-vMEoE9#;-aqt?jtevNqUcIgSVS-p8#MUqLPrv570`kj)&w zO>se7ZUIdz1x(LOO)i!P;DMTWE8_!{MAS^pH2lAaC`CuDW@XhN{n7(a+l62oA6$eL zqW%&kb~cx`5JR%w8tiCK$EFovCA)FWh(!Xcn6;LU_0N3GwXQyA&A9ulbv0-;_%JtI z!w^zRQ3#->qpoPoMUYAFA$n#(At@b+a$ETh0wi?!t}YiVoJi9Hhj8_|XYux5zTq6C z7+=%-9XC2?O&zP*2gK~6djD);B&G@j)N3H4G+PA>^7><8=d1M9*C)j~~JC;<><71T>F;*e$Y!bUyQyy#JdDC#8`POZ8iF8m15!JLP( zKs2$UQIKTRfQDEt*quSmVEaNur*R?)qKQ5)r`nhsL{0N44{0`u#?upe;(_rrD0egY zSm!>!S>hUwOx<`+m@NU91TCv1%cHz_((;?}GA_8*QKA!v|EO-LJ?JgPB%I>*>ykMJ z;YHh}m`BD(j)VS;UcQg5{XOe|Tk??WkV*#5?RRaE#qXP8D-pHz={24rTfWNgWB3y! z>e3*T>o(+Q{9^TXsdZJs<*bayaxKKA@q9#TqCW!9b`X9J*Z(N)B2N>d7LrmB(8T?^%lBub$G!?p<57ZrE6d z(AA>L3kzgh584lHpm$6}9q1jTWt(g)W=l=W>>k+Q^r2;Rt*5td%N|2p=S$uuBwaXD zDt7tcK=)_9hfwuHt0icN$h_=RZzONFrQ>)kcovpghIj>U-)@&j)F-` z4>`ZGw_bnEE?@hq9aLGOSvf;49Q$dCbHF`a2*izrO3~X9DKE~9(BYKP;GO05b<(jn$cHsz|ghLLRWgtv#TW(u^#HM>Tl7mh;&0q(D#l+w!C9K zea#@EfLN!Dqala~O)>-sP&q*j?GP|wzeo=Q;t@zr=utzSr0c0DLeWEIj1*!ID9h%| zNy7jnNJqT_L~!lPSMBO^tB^X;`OtrJn5aMaR+l1Kv5Jw-e6QWb8-Pv`sv;5^Jd}T_L`) z1eqYR8Tflh$dMJ*N|mylf8^YaaeM5APBi5pW?jHW8|pCW9aWU?*AFi{DvAeFZ!@Lj z=$6zDbT1Etwl;EDvw`kYe=l8&bZt}R*lTz0X+hg{qvgv$>+#6bGr#J0RqxprKk|rG!CAyvxg4_jkgnSsYPJpvj_Wou1mh{v9U>DnWE* zm5IEl)_d@o(wUJ>ul~xWvo>95i(#4)(p@On)Ms~WTE1ed;gMa-D=5{jdj-BXK6dH( zQp7s1-o;{MRhf88h@^G+xL4+x_B@s|5G30wJM9RGDBVgdva5%O_W4I|`}%RMzT@db zGV0n7zw=G|^WXjvy!gT|?7wfk02qcKd4WaRTZ932 zv2~z;igN^02YRxL4O$R3DE1aoyK^}4AQ(#GuRf^J9)GNC*wdZ2` z*+gkcRe8Qc=k?smIkp((#FYQ8CS6}4E;`wSym%l-p#y}x7owLSs7O&HmyLW&s{}oo zjOu$g9<%?w{f3PMFZ+599i=#<$=n}4c|8K8P@os-XDiyQm)k8XM(YqtEeT=VKRPwk z;`53`OCX>eUm1(jeJo&UiR!l0^FU5&BIjAI><9@>>}(hd(&z27dndZiv@b9*WJUXt z8E>SWmU1AZWo-G;ukYzuFQCoReHP$9P_(6>ORb<)+p{YT8HcXH4|uEPju(3FfcBpb zYDtIS80~uf?ru>z^ZD3%wz+joVd zK!{@|bXiE}T-!b?1T$AOq`N~E8nKWDEKbcmdnn||a1b`aHX`#E9evifVDXh>8!V zv8673*D|vs%cqo%?(cZeNX`4!%=fHPSX*sAut(z1 z&f8WzxFTCDxTIbkl`A0}>Stb`Vr-q61Dz?55NRx_^+e}@o#|XY^kN|dw!X{4&=33u z8>I-Gfz`&9wZq>$|C69t-?P_V{+GUAmxpRu4tT>nk3Q`9!LcG@-Y1lx;)a`?VG+3O zjy`YOouhN_^UmdYfcP^xfdC`W&lI7W7WAgoljCqHe`gLI>TL`jiLC$vPn-js_eA2+ z%$kbgRE7KFwqU&;TG;Ta=3Ljck>Sd+T)H`ckQ7}3Cbab6BX|tv%JKDp*ShJRjIb(a zHe_lGVo*K&zC3?L5tG`*R4=5obLe?I!xTk19YjL1@~A+m>rZ||IpjU-9No9EjCZ2L zI+O=RihRtz!)QAPz(gOzRC5X|(3r5b4 zvnu&KLg33K#Y$byj5!JNzQ}jn5qW?u2WDdmbFRy!XO)HNa#kRkD(PlzTvt`!h-eB-e$#E6tis&*Nr}dWc7mz&Hb2vZk`QCm#16$Na zQLW>0SIln=2W=;X&B?*77lD&f=ALM6l^Ld8L-q+Xe#X*TJ7KwUEfI0 zJ+gdt$5y$NQ`#3{%1uU!cH1>~G$~xKxfgFH%=Be~rX%8)O zcoUYJj5BkwJHv(|K@l4N(1k!!zWy8fet>!T(tr=CHoXm&`@+Dd)0OwnDeyd)BtB}JM#D}{!g58gj)t@GR_{C)`HN=B zh6jZd5j=av-J&y|xK0-oH2NIAkn^k<6av16dcf1JC7HTcJAGT6Z9qNHTC1c;Sa6DQ z{xAZgksdnqUNP-TRyN16E+;R?M24BRD%@x~@G;*>#jc{Z%BBvM;qq7WsP$e&J3z@Y?F1XQ7aX5;+3|l#GBD?nWx*S>2dG_J8 zpDOwl8%>vpN|^tymMve2oOorS&#x$oCC9AN=9KsDxqt-4wII8;=6=(zU%X_uZhmaR z!M>{>E#%Be5tz2@tkNznLO*{EbcR)!R7(gi4&a@OZBO0^`w7m zhG!V4%2ssUGQ=SRS4v+hkd^Fs3$~z?=OLXVeHMj9q8lm1sSsgKhw4hbVk@Nzv;L7s z@^<%B(Q9S3sKHCH-B#U)%_hv&!`)xl63?tCim_4-6K{ziR(0eNLl#r3`ko6Z+f2wY z@Bk}hpz8yrj!|4k%Krp zI<|GEqjxO_sJy=~M=S%i@`Xq2m6!f*&p!RMefs%lwyXC>Eex4CQ0b$WF50aRZ^~u| z&MAl<0+L?Y4Ff=lpC`zBne#=q&LzMUMAs0t1X}_dkT!~4P8$xBHYq)cFyy_Q3mnDQ z_cFn$e&PD1N32@PSwjbd<%=;|Y!PzOiVn(4=N`$IKHm-08#6p714yx~5auke!^RqD z5%LFm`>Z3wa*EU!Yo|g76t)nc3|;V%KIX;=B-6kRmKc}}R6b-y89JUjop+c59M0(B z0ioc*yRh4o_nJAS(s~YDRUWEbnE|DN9Kc2|aKW5(29nL9OOp3`XHI&VS9BzQUc^Hm zo1~)4AW%kL9k!W~3~(3qo6XRE|AVjDd+*GGQ+bLNoP5n4yVp7OjmTo9_{B?MELX^+R<@|XM7+MIe_BE}E9H!g zTN91vy3Yc{t<+u^=hW}b5zkcAj`hMzx(>Jly~Y3}SEO0YgdQTn+fvm2tig{tkgHB6}-km zB}+Mud=9BPH1^WYj|kVE4M=N>zWrItubmHb(>a$t)|3uyob@Rc*8I@VQ$n8MuI(LM zP-LzuW$iczV*-P8uuzH-`6MLomSrhs4l;Vb(`?R0xVgGsab$xb8XDs9TkLW1oLC9=IQs5(HT5ntbGa+<{ zOL%P?1=_6c3tBsfK@#l7w(W0p#38t4d^>#Rr_Ti!xS=YCCGV4JEYXBIBouQy#~s0? zg=^H2b09d8-E0Rk;@R5UaiMQ1<=t3OvN>s=Iu$X)ChSbpI!TkmQjymMB3jApJk;GQ z!cDRzf#{zLitVIjjB+qD9oms1tzcxm&QMS6E2-@1uUM8K?}R#Pg<$Byi+5ug1Mr=Z z;|vmF{k}!IhA|s<%@$3 za(CsqVMgi==bm1qlI^q{GTu~W7xBhx2fKofu(zFk5pmXO zy9QuI2a6Hgj0|^2`Cwo9a!v=X(;Zq~5pp?R`tx1MxzOHg3!%h91;~0OGTISakA~h} z(b-?2T0j2uo@Msy)@s!4_|9!d55;2Lw;%h8imi%L3gxf&PtIJEFN{|fpHJ=1{fD-H zuxs=7i4En{i4tX9lPTghg-phJPK@~?HZev8SJyM>PPWTh?6bpAn`Lc!?8P)R0YOJA zy`Lex3Q)l7okRPb)uHg!X1XZQ$19qWlCXU^8+BZUo+2+%GZ3QLFvKF1c8<>dnKmOMGJBc+|`X4B@wwv&mlZNg{_E5V7PF2twM!OfD; zr!QklZ_BRND5zogmEw#R4X@kW8JyUpdt@yIu&M5;qM()$bWa4mQ8CJ<|DXCb@_^rTi`9koC4V4wd;2K{SUmB z;)+|$O9=H*6l5NRg&$akQ%WOA16M95Zd)a;Fz+1#()P4$dj>jZEg0XtN_;=(|D#~~ UDMq+|K>z>%07*qoM6N<$f+(=mDgXcg diff --git a/examples/webgl_loader_texture_rgbm.html b/examples/webgl_loader_texture_rgbm.html deleted file mode 100644 index 7ac29f388d2292..00000000000000 --- a/examples/webgl_loader_texture_rgbm.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - three.js webgl - materials - RGBM texture loader - - - - - - - - - - - - - diff --git a/examples/webgl_materials_envmaps_hdr.html b/examples/webgl_materials_envmaps_hdr.html index 4b1440121b6080..cc819d0130a1c7 100644 --- a/examples/webgl_materials_envmaps_hdr.html +++ b/examples/webgl_materials_envmaps_hdr.html @@ -32,7 +32,6 @@ import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; import { DebugEnvironment } from 'three/addons/environments/DebugEnvironment.js'; const params = { @@ -46,8 +45,8 @@ let container, stats; let camera, scene, renderer, controls; let torusMesh, planeMesh; - let generatedCubeRenderTarget, ldrCubeRenderTarget, hdrCubeRenderTarget, rgbmCubeRenderTarget; - let ldrCubeMap, hdrCubeMap, rgbmCubeMap; + let generatedCubeRenderTarget, ldrCubeRenderTarget, hdrCubeRenderTarget; + let ldrCubeMap, hdrCubeMap; init(); @@ -114,16 +113,6 @@ } ); - - const rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ]; - rgbmCubeMap = new RGBMLoader().setMaxRange( 16 ) - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemap( rgbmUrls, function () { - - rgbmCubeRenderTarget = pmremGenerator.fromCubemap( rgbmCubeMap ); - - } ); - const pmremGenerator = new THREE.PMREMGenerator( renderer ); pmremGenerator.compileCubemapShader(); @@ -148,7 +137,7 @@ const gui = new GUI(); - gui.add( params, 'envMap', [ 'Generated', 'LDR', 'HDR', 'RGBM16' ] ); + gui.add( params, 'envMap', [ 'Generated', 'LDR', 'HDR' ] ); gui.add( params, 'roughness', 0, 1, 0.01 ); gui.add( params, 'metalness', 0, 1, 0.01 ); gui.add( params, 'exposure', 0, 2, 0.01 ); @@ -198,10 +187,6 @@ renderTarget = hdrCubeRenderTarget; cubeMap = hdrCubeMap; break; - case 'RGBM16': - renderTarget = rgbmCubeRenderTarget; - cubeMap = rgbmCubeMap; - break; } diff --git a/examples/webgpu_cubemap_adjustments.html b/examples/webgpu_cubemap_adjustments.html index be697090b70cef..7009b93fadf82c 100644 --- a/examples/webgpu_cubemap_adjustments.html +++ b/examples/webgpu_cubemap_adjustments.html @@ -30,7 +30,7 @@ import * as THREE from 'three/webgpu'; import { uniform, mix, pmremTexture, reference, positionLocal, hue, saturation, positionWorld, normalWorld, positionWorldDirection, reflectVector } from 'three/tsl'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; + import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; @@ -55,11 +55,10 @@ // cube textures - const rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ]; - const cube1Texture = await new RGBMLoader() - .setMaxRange( 16 ) - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemapAsync( rgbmUrls ); + const hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ]; + const cube1Texture = await new HDRCubeTextureLoader() + .setPath( './textures/cube/pisaHDR/' ) + .loadAsync( hdrUrls ); cube1Texture.generateMipmaps = true; cube1Texture.minFilter = THREE.LinearMipmapLinearFilter; diff --git a/examples/webgpu_cubemap_dynamic.html b/examples/webgpu_cubemap_dynamic.html index 8dfede4cfbe0ab..376673b18dbae7 100644 --- a/examples/webgpu_cubemap_dynamic.html +++ b/examples/webgpu_cubemap_dynamic.html @@ -31,7 +31,7 @@ import * as THREE from 'three/webgpu'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; + import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; import Stats from 'three/addons/libs/stats.module.js'; @@ -57,13 +57,12 @@ const uvTexture = new THREE.TextureLoader().load( './textures/uv_grid_opengl.jpg' ); - const rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ]; - const texture = await new RGBMLoader() - .setMaxRange( 16 ) - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemapAsync( rgbmUrls ); + const hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ]; + const texture = await new HDRCubeTextureLoader() + .setPath( './textures/cube/pisaHDR/' ) + .loadAsync( hdrUrls ); - texture.name = 'pisaRGBM16'; + texture.name = 'pisaHDR'; texture.minFilter = THREE.LinearMipmapLinearFilter; texture.magFilter = THREE.LinearFilter; diff --git a/examples/webgpu_cubemap_mix.html b/examples/webgpu_cubemap_mix.html index 9eb42c1ca9dbf6..21077f5466d327 100644 --- a/examples/webgpu_cubemap_mix.html +++ b/examples/webgpu_cubemap_mix.html @@ -30,7 +30,7 @@ import * as THREE from 'three/webgpu'; import { mix, oscSine, time, pmremTexture, float } from 'three/tsl'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; + import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; @@ -49,11 +49,10 @@ scene = new THREE.Scene(); - const rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ]; - const cube1Texture = new RGBMLoader() - .setMaxRange( 16 ) - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemap( rgbmUrls ); + const hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ]; + const cube1Texture = new HDRCubeTextureLoader() + .setPath( './textures/cube/pisaHDR/' ) + .load( hdrUrls ); cube1Texture.generateMipmaps = true; cube1Texture.minFilter = THREE.LinearMipmapLinearFilter; diff --git a/examples/webgpu_pmrem_cubemap.html b/examples/webgpu_pmrem_cubemap.html index 474eb5a35319e6..9de9e5bd315c6a 100644 --- a/examples/webgpu_pmrem_cubemap.html +++ b/examples/webgpu_pmrem_cubemap.html @@ -24,7 +24,7 @@ import * as THREE from 'three/webgpu'; import { normalWorldGeometry, uniform, normalView, positionViewDirection, cameraViewMatrix, pmremTexture } from 'three/tsl'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; + import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; @@ -61,9 +61,9 @@ controls.maxDistance = 10; controls.update(); - new RGBMLoader() - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemap( [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ], function ( map ) { + new HDRCubeTextureLoader() + .setPath( './textures/cube/pisaHDR/' ) + .load( [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ], function ( map ) { const reflectVec = positionViewDirection.negate().reflect( normalView ).transformDirection( cameraViewMatrix ); diff --git a/examples/webgpu_postprocessing_anamorphic.html b/examples/webgpu_postprocessing_anamorphic.html index 8b1158f70da1f5..132558cf3696c5 100644 --- a/examples/webgpu_postprocessing_anamorphic.html +++ b/examples/webgpu_postprocessing_anamorphic.html @@ -31,7 +31,7 @@ import { pass, cubeTexture, screenUV, grayscale, uniform } from 'three/tsl'; import { anamorphic } from 'three/addons/tsl/display/AnamorphicNode.js'; - import { RGBMLoader } from 'three/addons/loaders/RGBMLoader.js'; + import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; @@ -53,11 +53,10 @@ scene = new THREE.Scene(); - const rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ]; - const cube1Texture = await new RGBMLoader() - .setMaxRange( 16 ) - .setPath( './textures/cube/pisaRGBM16/' ) - .loadCubemapAsync( rgbmUrls ); + const hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ]; + const cube1Texture = await new HDRCubeTextureLoader() + .setPath( './textures/cube/pisaHDR/' ) + .loadAsync( hdrUrls ); scene.environment = cube1Texture; scene.backgroundNode = grayscale( cubeTexture( cube1Texture ).mul( screenUV.distance( .5 ).oneMinus().remapClamp( .1, 4 ) ) ); diff --git a/playground/examples/basic/teapot.json b/playground/examples/basic/teapot.json index c1abad075b5c64..4114efd6150844 100644 --- a/playground/examples/basic/teapot.json +++ b/playground/examples/basic/teapot.json @@ -1 +1 @@ -{"objects":{"71":{"x":1534,"y":591,"elements":[72,74],"autoResize":true,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { RGBMLoader } = await import( 'three/addons/loaders/RGBMLoader.js' );\n\n\t\tconst rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ];\n\n\t\tconst cubeMap = await new RGBMLoader()\n\t\t\t.setMaxRange( 16 )\n\t\t\t.setPath( '../examples/textures/cube/pisaRGBM16/' )\n\t\t\t.loadCubemapAsync( rgbmUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":71,"type":"NodePrototypeEditor"},"72":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":72,"type":"TitleElement"},"74":{"height":507,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { RGBMLoader } = await import( 'three/addons/loaders/RGBMLoader.js' );\n\n\t\tconst rgbmUrls = [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ];\n\n\t\tconst cubeMap = await new RGBMLoader()\n\t\t\t.setMaxRange( 16 )\n\t\t\t.setPath( '../examples/textures/cube/pisaRGBM16/' )\n\t\t\t.loadCubemapAsync( rgbmUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":74,"type":"CodeEditorElement"},"77":{"x":1346,"y":362,"elements":[78,120],"autoResize":false,"layoutJSON":"{\"name\":\"Teapot Scene\",\"width\":300,\"elements\":[{\"name\":\"Material\",\"inputType\":\"Material\"}]}","id":77,"type":"Teapot Scene"},"78":{"outputLength":1,"height":null,"title":"Teapot Scene","icon":"ti ti-ti ti-variable","id":78,"type":"TitleElement"},"82":{"x":750,"y":240,"elements":[83,85,86,87,88,89,90,91],"autoResize":false,"id":82,"type":"StandardMaterialEditor"},"83":{"outputLength":1,"height":null,"title":"Standard Material","icon":"ti ti-ti ti-inner-shadow-top-left","id":83,"type":"TitleElement"},"85":{"inputLength":3,"inputs":[92],"links":[115],"height":null,"id":85,"type":"LabelElement"},"86":{"inputLength":1,"inputs":[93],"height":null,"id":86,"type":"LabelElement"},"87":{"inputLength":1,"inputs":[95],"height":null,"id":87,"type":"LabelElement"},"88":{"inputLength":1,"inputs":[97],"height":null,"id":88,"type":"LabelElement"},"89":{"inputLength":3,"height":null,"id":89,"type":"LabelElement"},"90":{"inputLength":3,"height":null,"id":90,"type":"LabelElement"},"91":{"inputLength":3,"height":null,"id":91,"type":"LabelElement"},"92":{"value":15860226,"id":92,"type":"ColorInput"},"93":{"min":0,"max":1,"value":1,"id":93,"type":"SliderInput"},"95":{"min":0,"max":1,"value":1,"id":95,"type":"SliderInput"},"97":{"min":0,"max":1,"value":0,"id":97,"type":"SliderInput"},"114":{"x":140,"y":405,"elements":[115],"autoResize":false,"id":114,"type":"NormalWorld"},"115":{"outputLength":3,"height":null,"title":"Normal World","icon":"ti ti-arrow-bar-up","id":115,"type":"TitleElement"},"120":{"inputLength":1,"links":[83],"height":null,"id":120,"type":"LabelElement"}},"nodes":[71,82,114,77],"id":2,"type":"Canvas"} \ No newline at end of file +{"objects":{"71":{"x":1534,"y":591,"elements":[72,74],"autoResize":true,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { HDRCubeTextureLoader } = await import( 'three/addons/loaders/HDRCubeTextureLoader.js' );\n\n\t\tconst hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];\n\n\t\tconst cubeMap = await new HDRCubeTextureLoader()\n\t\t\t.setPath( '../examples/textures/cube/pisaHDR/' )\n\t\t\t.loadAsync( hdrUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":71,"type":"NodePrototypeEditor"},"72":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":72,"type":"TitleElement"},"74":{"height":507,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { HDRCubeTextureLoader } = await import( 'three/addons/loaders/HDRCubeTextureLoader.js' );\n\n\t\tconst hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];\n\n\t\tconst cubeMap = await new HDRCubeTextureLoader()\n\t\t\t.setPath( '../examples/textures/cube/pisaHDR/' )\n\t\t\t.loadAsync( hdrUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":74,"type":"CodeEditorElement"},"77":{"x":1346,"y":362,"elements":[78,120],"autoResize":false,"layoutJSON":"{\"name\":\"Teapot Scene\",\"width\":300,\"elements\":[{\"name\":\"Material\",\"inputType\":\"Material\"}]}","id":77,"type":"Teapot Scene"},"78":{"outputLength":1,"height":null,"title":"Teapot Scene","icon":"ti ti-ti ti-variable","id":78,"type":"TitleElement"},"82":{"x":750,"y":240,"elements":[83,85,86,87,88,89,90,91],"autoResize":false,"id":82,"type":"StandardMaterialEditor"},"83":{"outputLength":1,"height":null,"title":"Standard Material","icon":"ti ti-ti ti-inner-shadow-top-left","id":83,"type":"TitleElement"},"85":{"inputLength":3,"inputs":[92],"links":[115],"height":null,"id":85,"type":"LabelElement"},"86":{"inputLength":1,"inputs":[93],"height":null,"id":86,"type":"LabelElement"},"87":{"inputLength":1,"inputs":[95],"height":null,"id":87,"type":"LabelElement"},"88":{"inputLength":1,"inputs":[97],"height":null,"id":88,"type":"LabelElement"},"89":{"inputLength":3,"height":null,"id":89,"type":"LabelElement"},"90":{"inputLength":3,"height":null,"id":90,"type":"LabelElement"},"91":{"inputLength":3,"height":null,"id":91,"type":"LabelElement"},"92":{"value":15860226,"id":92,"type":"ColorInput"},"93":{"min":0,"max":1,"value":1,"id":93,"type":"SliderInput"},"95":{"min":0,"max":1,"value":1,"id":95,"type":"SliderInput"},"97":{"min":0,"max":1,"value":0,"id":97,"type":"SliderInput"},"114":{"x":140,"y":405,"elements":[115],"autoResize":false,"id":114,"type":"NormalWorld"},"115":{"outputLength":3,"height":null,"title":"Normal World","icon":"ti ti-arrow-bar-up","id":115,"type":"TitleElement"},"120":{"inputLength":1,"links":[83],"height":null,"id":120,"type":"LabelElement"}},"nodes":[71,82,114,77],"id":2,"type":"Canvas"} \ No newline at end of file From 288461a2775d98052cd72aa24a9c32a81384e960 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 5 Aug 2025 09:41:23 +0900 Subject: [PATCH 2/3] Clean up. --- src/renderers/webgl/WebGLShadowMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderers/webgl/WebGLShadowMap.js b/src/renderers/webgl/WebGLShadowMap.js index 5a734139aa0f2b..0c3d6448125fb4 100644 --- a/src/renderers/webgl/WebGLShadowMap.js +++ b/src/renderers/webgl/WebGLShadowMap.js @@ -85,7 +85,7 @@ function WebGLShadowMap( renderer, objects, capabilities ) { // Set GL state for depth map. _state.setBlending( NoBlending ); - if ( _state.buffers.depth.getReversed() ) { + if ( _state.buffers.depth.getReversed() === true ) { _state.buffers.color.setClear( 0, 0, 0, 0 ); From 7a1f975aca878c0c5c50bc74b051c1e6bb6269d3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 5 Aug 2025 09:43:24 +0900 Subject: [PATCH 3/3] Updated builds. --- build/three.cjs | 2 +- build/three.module.js | 2 +- build/three.module.min.js | 2 +- build/three.tsl.js | 3 +- build/three.tsl.min.js | 2 +- build/three.webgpu.js | 199 ++++++++++++++++++++++++++++---- build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 199 ++++++++++++++++++++++++++++---- build/three.webgpu.nodes.min.js | 2 +- 9 files changed, 360 insertions(+), 53 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index cfa2c7736681a8..cc7ca3b387fb16 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -67148,7 +67148,7 @@ function WebGLShadowMap( renderer, objects, capabilities ) { // Set GL state for depth map. _state.setBlending( NoBlending ); - if ( _state.buffers.depth.getReversed() ) { + if ( _state.buffers.depth.getReversed() === true ) { _state.buffers.color.setClear( 0, 0, 0, 0 ); diff --git a/build/three.module.js b/build/three.module.js index d35305ae2abfe7..2bf4fe3249a529 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -8474,7 +8474,7 @@ function WebGLShadowMap( renderer, objects, capabilities ) { // Set GL state for depth map. _state.setBlending( NoBlending ); - if ( _state.buffers.depth.getReversed() ) { + if ( _state.buffers.depth.getReversed() === true ) { _state.buffers.color.setClear( 0, 0, 0, 0 ); diff --git a/build/three.module.min.js b/build/three.module.min.js index 9a1c7615a79d88..68c6c6ea768616 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as r,Vector3 as i,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Euler as u,Matrix4 as f,ColorManagement as p,SRGBTransfer as m,PlaneGeometry as h,FrontSide as _,getUnlitUniformColorSpace as g,IntType as v,HalfFloatType as E,UnsignedByteType as S,FloatType as T,RGBAFormat as M,Plane as x,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as A,WebGLCubeRenderTarget as b,CubeReflectionMapping as C,CubeRefractionMapping as L,OrthographicCamera as P,PerspectiveCamera as U,NoToneMapping as D,MeshBasicMaterial as w,NoBlending as y,WebGLRenderTarget as I,BufferGeometry as N,BufferAttribute as O,LinearSRGBColorSpace as F,LinearFilter as B,warnOnce as H,Uint32BufferAttribute as G,Uint16BufferAttribute as V,arrayNeedsUint32 as z,Vector4 as k,DataArrayTexture as W,CubeTexture as X,Data3DTexture as Y,LessEqualCompare as K,DepthTexture as q,Texture as j,GLSL3 as Z,PCFShadowMap as $,PCFSoftShadowMap as Q,VSMShadowMap as J,CustomToneMapping as ee,NeutralToneMapping as te,AgXToneMapping as ne,ACESFilmicToneMapping as re,CineonToneMapping as ie,ReinhardToneMapping as ae,LinearToneMapping as oe,LinearTransfer as se,AddOperation as le,MixOperation as ce,MultiplyOperation as de,UniformsUtils as ue,DoubleSide as fe,NormalBlending as pe,TangentSpaceNormalMap as me,ObjectSpaceNormalMap as he,Layers as _e,Frustum as ge,MeshDepthMaterial as ve,RGBADepthPacking as Ee,MeshDistanceMaterial as Se,NearestFilter as Te,LessEqualDepth as Me,ReverseSubtractEquation as xe,SubtractEquation as Re,AddEquation as Ae,OneMinusConstantAlphaFactor as be,ConstantAlphaFactor as Ce,OneMinusConstantColorFactor as Le,ConstantColorFactor as Pe,OneMinusDstAlphaFactor as Ue,OneMinusDstColorFactor as De,OneMinusSrcAlphaFactor as we,OneMinusSrcColorFactor as ye,DstAlphaFactor as Ie,DstColorFactor as Ne,SrcAlphaSaturateFactor as Oe,SrcAlphaFactor as Fe,SrcColorFactor as Be,OneFactor as He,ZeroFactor as Ge,NotEqualDepth as Ve,GreaterDepth as ze,GreaterEqualDepth as ke,EqualDepth as We,LessDepth as Xe,AlwaysDepth as Ye,NeverDepth as Ke,CullFaceNone as qe,CullFaceBack as je,CullFaceFront as Ze,CustomBlending as $e,MultiplyBlending as Qe,SubtractiveBlending as Je,AdditiveBlending as et,MinEquation as tt,MaxEquation as nt,MirroredRepeatWrapping as rt,ClampToEdgeWrapping as it,RepeatWrapping as at,LinearMipmapLinearFilter as ot,LinearMipmapNearestFilter as st,NearestMipmapLinearFilter as lt,NearestMipmapNearestFilter as ct,NotEqualCompare as dt,GreaterCompare as ut,GreaterEqualCompare as ft,EqualCompare as pt,LessCompare as mt,AlwaysCompare as ht,NeverCompare as _t,NoColorSpace as gt,DepthStencilFormat as vt,getByteLength as Et,DepthFormat as St,UnsignedIntType as Tt,UnsignedInt248Type as Mt,UnsignedShortType as xt,createElementNS as Rt,UnsignedShort4444Type as At,UnsignedShort5551Type as bt,UnsignedInt5999Type as Ct,ByteType as Lt,ShortType as Pt,AlphaFormat as Ut,RGBFormat as Dt,RedFormat as wt,RedIntegerFormat as yt,RGFormat as It,RGIntegerFormat as Nt,RGBAIntegerFormat as Ot,RGB_S3TC_DXT1_Format as Ft,RGBA_S3TC_DXT1_Format as Bt,RGBA_S3TC_DXT3_Format as Ht,RGBA_S3TC_DXT5_Format as Gt,RGB_PVRTC_4BPPV1_Format as Vt,RGB_PVRTC_2BPPV1_Format as zt,RGBA_PVRTC_4BPPV1_Format as kt,RGBA_PVRTC_2BPPV1_Format as Wt,RGB_ETC1_Format as Xt,RGB_ETC2_Format as Yt,RGBA_ETC2_EAC_Format as Kt,RGBA_ASTC_4x4_Format as qt,RGBA_ASTC_5x4_Format as jt,RGBA_ASTC_5x5_Format as Zt,RGBA_ASTC_6x5_Format as $t,RGBA_ASTC_6x6_Format as Qt,RGBA_ASTC_8x5_Format as Jt,RGBA_ASTC_8x6_Format as en,RGBA_ASTC_8x8_Format as tn,RGBA_ASTC_10x5_Format as nn,RGBA_ASTC_10x6_Format as rn,RGBA_ASTC_10x8_Format as an,RGBA_ASTC_10x10_Format as on,RGBA_ASTC_12x10_Format as sn,RGBA_ASTC_12x12_Format as ln,RGBA_BPTC_Format as cn,RGB_BPTC_SIGNED_Format as dn,RGB_BPTC_UNSIGNED_Format as un,RED_RGTC1_Format as fn,SIGNED_RED_RGTC1_Format as pn,RED_GREEN_RGTC2_Format as mn,SIGNED_RED_GREEN_RGTC2_Format as hn,EventDispatcher as _n,ArrayCamera as gn,WebXRController as vn,RAD2DEG as En,createCanvasElement as Sn,SRGBColorSpace as Tn,REVISION as Mn,WebGLCoordinateSystem as xn,probeAsync as Rn}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTexture,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Float32BufferAttribute,Fog,FogExp2,FramebufferTexture,FrustumArray,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NormalAnimationBlendMode,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,ReplaceStencilOp,RingGeometry,Scene,ShadowMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,SphereGeometry,Spherical,SphericalHarmonics3,SplineCurve,SpotLight,SpotLightHelper,Sprite,SpriteMaterial,StaticCopyUsage,StaticDrawUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp}from"./three.core.min.js";function An(){let e=null,t=!1,n=null,r=null;function i(t,a){n(t,a),r=e.requestAnimationFrame(i)}return{start:function(){!0!==t&&null!==n&&(r=e.requestAnimationFrame(i),t=!0)},stop:function(){e.cancelAnimationFrame(r),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function bn(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const r=t.get(n);r&&(e.deleteBuffer(r.buffer),t.delete(n))},update:function(n,r){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\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 ) || defined( USE_BATCHING_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 ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.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; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\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}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.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\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\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\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_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 ), cubeUV_m0, CUBEUV_MAX_MIP );\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_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 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, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( 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 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\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 ) || defined( LAMBERT )\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 ) || defined( LAMBERT )\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:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\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}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\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 ], geometryNormal );\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, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\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\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\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, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - 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_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\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, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\n\t\t#ifdef USE_REVERSEDEPTHBUF\n\t\t\treturn step( depth, compare );\n\t\t#else\n\t\t\treturn step( compare, depth );\n\t\t#endif\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\t#ifdef USE_REVERSEDEPTHBUF\n\t\t\tfloat hard_shadow = step( distribution.x, compare );\n\t\t#else\n\t\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\t#endif\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 shadowIntensity, 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\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\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 shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\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.shadowIntensity, 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.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ 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.shadowIntensity, 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\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\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, vSpecularMapUv );\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 saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSEDEPTHBUF\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\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#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\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 \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Ln={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,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 n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Pn={basic:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.fog]),vertexShader:Cn.meshbasic_vert,fragmentShader:Cn.meshbasic_frag},lambert:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)}}]),vertexShader:Cn.meshlambert_vert,fragmentShader:Cn.meshlambert_frag},phong:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Cn.meshphong_vert,fragmentShader:Cn.meshphong_frag},standard:{uniforms:r([Ln.common,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.roughnessmap,Ln.metalnessmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Cn.meshphysical_vert,fragmentShader:Cn.meshphysical_frag},toon:{uniforms:r([Ln.common,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.gradientmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)}}]),vertexShader:Cn.meshtoon_vert,fragmentShader:Cn.meshtoon_frag},matcap:{uniforms:r([Ln.common,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,{matcap:{value:null}}]),vertexShader:Cn.meshmatcap_vert,fragmentShader:Cn.meshmatcap_frag},points:{uniforms:r([Ln.points,Ln.fog]),vertexShader:Cn.points_vert,fragmentShader:Cn.points_frag},dashed:{uniforms:r([Ln.common,Ln.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Cn.linedashed_vert,fragmentShader:Cn.linedashed_frag},depth:{uniforms:r([Ln.common,Ln.displacementmap]),vertexShader:Cn.depth_vert,fragmentShader:Cn.depth_frag},normal:{uniforms:r([Ln.common,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,{opacity:{value:1}}]),vertexShader:Cn.meshnormal_vert,fragmentShader:Cn.meshnormal_frag},sprite:{uniforms:r([Ln.sprite,Ln.fog]),vertexShader:Cn.sprite_vert,fragmentShader:Cn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Cn.background_vert,fragmentShader:Cn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Cn.backgroundCube_vert,fragmentShader:Cn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Cn.cube_vert,fragmentShader:Cn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Cn.equirect_vert,fragmentShader:Cn.equirect_frag},distanceRGBA:{uniforms:r([Ln.common,Ln.displacementmap,{referencePosition:{value:new i},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Cn.distanceRGBA_vert,fragmentShader:Cn.distanceRGBA_frag},shadow:{uniforms:r([Ln.lights,Ln.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Cn.shadow_vert,fragmentShader:Cn.shadow_frag}};Pn.physical={uniforms:r([Pn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Cn.meshphysical_vert,fragmentShader:Cn.meshphysical_frag};const Un={r:0,b:0,g:0},Dn=new u,wn=new f;function yn(e,t,r,i,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,R=0,A=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?r:t).get(n)}return n}function C(t,n){t.getRGB(Un,g(e)),i.buffers.color.setClear(Un.r,Un.g,Un.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const r=b(t);null===r?C(E,M):r&&r.isColor&&(C(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const r=b(n);r&&(r.isCubeTexture||r.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Pn.backgroundCube.uniforms),vertexShader:Pn.backgroundCube.vertexShader,fragmentShader:Pn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),Dn.copy(n.backgroundRotation),Dn.x*=-1,Dn.y*=-1,Dn.z*=-1,r.isCubeTexture&&!1===r.isRenderTargetTexture&&(Dn.y*=-1,Dn.z*=-1),T.material.uniforms.envMap.value=r,T.material.uniforms.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(wn.makeRotationFromEuler(Dn)),T.material.toneMapped=p.getTransfer(r.colorSpace)!==m,x===r&&R===r.version&&A===e.toneMapping||(T.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):r&&r.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Pn.background.uniforms),vertexShader:Pn.background.vertexShader,fragmentShader:Pn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=r,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(r.colorSpace)!==m,!0===r.matrixAutoUpdate&&r.updateMatrix(),S.material.uniforms.uvTransform.value.copy(r.matrix),x===r&&R===r.version&&A===e.toneMapping||(S.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function In(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),r={},i=c(null);let a=i,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],r=[],i=[];for(let e=0;e=0){const n=i[t];let r=o[t];if(void 0===r&&("instanceMatrix"===t&&e.instanceMatrix&&(r=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(r=e.instanceColor)),void 0===n)return!0;if(n.attribute!==r)return!0;if(r&&n.data!==r.data)return!0;s++}}return a.attributesNum!==s||a.index!==r}(n,h,l,_),g&&function(e,t,n,r){const i={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const r={};r.attribute=n,n&&n.data&&(r.data=n.data),i[t]=r,s++}}a.attributes=i,a.attributesNum=s,a.index=r}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,r,i,a){d();const o=a.attributes,s=i.getAttributes(),l=r.defaultAttributeValues;for(const r in s){const i=s[r];if(i.location>=0){let s=o[r];if(void 0===s&&("instanceMatrix"===r&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===r&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const r=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");i=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:a,textureFormatReadable:function(t){return t===M||r.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const i=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&r.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!i)},precision:o,logarithmicDepthBuffer:l,reversedDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Fn(t){const n=this;let r=null,i=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,r,i){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==i||null===o){const n=r+4*a,i=t.matrixWorldInverse;l.getNormalMatrix(i),(null===o||o.length0);n.numPlanes=i,n.numIntersection=0}();else{const e=o?0:i,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=r[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Bn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=C:t===A&&(e.mapping=L),e}function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping;if(a===R||a===A){if(t.has(i)){return n(t.get(i).texture,i.mapping)}{const a=i.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,i),t.set(i,o),i.addEventListener("dispose",r),n(o.texture,i.mapping)}return null}}}return i},dispose:function(){t=new WeakMap}}}const Hn=[.125,.215,.35,.446,.526,.582],Gn=20,Vn=new P,zn=new n;let kn=null,Wn=0,Xn=0,Yn=!1;const Kn=(1+Math.sqrt(5))/2,qn=1/Kn,jn=[new i(-Kn,qn,0),new i(Kn,qn,0),new i(-qn,0,Kn),new i(qn,0,Kn),new i(0,Kn,-qn),new i(0,Kn,qn),new i(-1,1,-1),new i(1,1,-1),new i(-1,1,1),new i(1,1,1)],Zn=new i;class $n{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,r=100,i={}){const{size:a=256,position:o=Zn}=i;kn=this._renderer.getRenderTarget(),Wn=this._renderer.getActiveCubeFace(),Xn=this._renderer.getActiveMipmapLevel(),Yn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,r,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=tr(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=er(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=Hn[o-e+4-1]:0===o&&(s=0),r.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,r=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(r,m*p*e),v.set(u,h*p*e);const i=[e,e,e,e,e,e];E.set(i,_*p*e)}const S=new N;S.setAttribute("position",new O(g,m)),S.setAttribute("uv",new O(v,h)),S.setAttribute("faceIndex",new O(E,_)),t.push(S),i>4&&i--}return{lodPlanes:t,sizeLods:n,sigmas:r}}(r)),this._blurMaterial=function(e,t,n){const r=new Float32Array(Gn),a=new i(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Gn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:nr(),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#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1});return o}(r,e,t)}return r}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Vn)}_sceneToCubeUV(e,t,n,r,i){const a=new U(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(zn),u.toneMapping=D,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(r),u.clearDepth(),u.setRenderTarget(null));const m=new w({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(zn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x+d[t],i.y,i.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y+d[t],i.z)):(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y,i.z+d[t]));const o=this._cubeSize;Jn(r,n*o,t>2?o:0,o,o),u.setRenderTarget(r),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,r=e.mapping===C||e.mapping===L;r?(null===this._cubemapMaterial&&(this._cubemapMaterial=tr()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=er());const i=r?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],i);i.uniforms.envMap.value=e;const s=this._cubeSize;Jn(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Vn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const r=this._lodPlanes.length;for(let t=1;tGn&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?r-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Vn)}}function Qn(e,t,n){const r=new I(e,t,n);return r.texture.mapping=a,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function Jn(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function er(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:nr(),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\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function tr(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:nr(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function nr(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\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 rr(e){let t=new WeakMap,n=null;function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(i);const l=void 0!==a?a.texture.pmremVersion:0;if(i.isRenderTargetTexture&&i.pmremVersion!==l)return null===n&&(n=new $n(e)),a=o?n.fromEquirectangular(i,a):n.fromCubemap(i,a),a.texture.pmremVersion=i.pmremVersion,t.set(i,a),a.texture;if(void 0!==a)return a.texture;{const l=i.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let r=0;rn.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),R=new W(x,S,M,u);R.type=T,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const i=t*n;let a=hr[i];if(void 0===a&&(a=new Float32Array(i),hr[i]=a),0!==t){r.toArray(a,0);for(let r=1,i=0;r!==t;++r)i+=n,e[r].toArray(a,i)}return a}function Tr(e,t){if(e.length!==t.length)return!1;for(let n=0,r=e.length;n":" "} ${i}: ${n[e]}`)}return r.join("\n")}(e.getShaderSource(t),r)}return i}function Ei(e,t){const n=function(e){p._getMatrix(gi,p.workingColorSpace,e);const t=`mat3( ${gi.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Si(e,t){let n;switch(t){case oe:n="Linear";break;case ae:n="Reinhard";break;case ie:n="Cineon";break;case re:n="ACESFilmic";break;case ne:n="AgX";break;case te:n="Neutral";break;case ee:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ti=new i;function Mi(){p.getLuminanceCoefficients(Ti);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ti.x.toFixed(4)}, ${Ti.y.toFixed(4)}, ${Ti.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function xi(e){return""!==e}function Ri(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Ai(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const bi=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ci(e){return e.replace(bi,Pi)}const Li=new Map;function Pi(e,t){let n=Cn[t];if(void 0===n){const e=Li.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Cn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ci(n)}const Ui=/#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 Di(e){return e.replace(Ui,wi)}function wi(e,t,n,r){let i="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(xi).join("\n"),v.length>0&&(v+="\n")):(g=[yi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",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 "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reversedDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","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","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#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_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(xi).join("\n"),v=[yi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",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 "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reversedDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==D?"#define TONE_MAPPING":"",n.toneMapping!==D?Cn.tonemapping_pars_fragment:"",n.toneMapping!==D?Si("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Cn.colorspace_pars_fragment,Ei("linearToOutputTexel",n.outputColorSpace),Mi(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(xi).join("\n")),s=Ci(s),s=Ri(s,n),s=Ai(s,n),l=Ci(l),l=Ri(l,n),l=Ai(l,n),s=Di(s),l=Di(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#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"+v);const S=E+g+s,T=E+v+l,M=hi(i,i.VERTEX_SHADER,S),x=hi(i,i.FRAGMENT_SHADER,T);function R(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(_)||"",r=i.getShaderInfoLog(M)||"",a=i.getShaderInfoLog(x)||"",o=n.trim(),s=r.trim(),l=a.trim();let c=!0,d=!0;if(!1===i.getProgramParameter(_,i.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(i,_,M,x);else{const e=vi(i,M,"vertex"),n=vi(i,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(_,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?console.warn("THREE.WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:g},fragmentShader:{log:l,prefix:v}})}i.deleteShader(M),i.deleteShader(x),A=new mi(i,_),b=function(e,t){const n={},r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,re=o.transmission>0,ie=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,_e=!!o.specularMap,ge=!!o.specularColorMap,ve=!!o.specularIntensityMap,Ee=re&&!!o.transmissionMap,Se=re&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Re=!!o.alphaHash,Ae=!!o.extensions;let be=D;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:w,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:G,batchingColor:G&&null!==T._colorsTexture,instancing:H,instancingColor:H&&null!==T.instanceColor,instancingMorph:H&&null!==T.morphTexture,supportsVertexTextures:_,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:z,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:W,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:_&&q,emissiveMap:j,normalMapObjectSpace:K&&o.normalMapType===he,normalMapTangentSpace:K&&o.normalMapType===me,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:_e,specularColorMap:ge,specularIntensityMap:ve,transmission:re,transmissionMap:Ee,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Re,combine:o.combine,mapUv:V&&E(o.map.channel),aoMapUv:W&&E(o.aoMap.channel),lightMapUv:X&&E(o.lightMap.channel),bumpMapUv:Y&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:q&&E(o.displacementMap.channel),emissiveMapUv:j&&E(o.emissiveMap.channel),metalnessMapUv:Z&&E(o.metalnessMap.channel),roughnessMapUv:$&&E(o.roughnessMap.channel),anisotropyMapUv:ie&&E(o.anisotropyMap.channel),clearcoatMapUv:ae&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&E(o.sheenRoughnessMap.channel),specularMapUv:_e&&E(o.specularMap.channel),specularColorMapUv:ge&&E(o.specularColorMap.channel),specularIntensityMapUv:ve&&E(o.specularIntensityMap.channel),transmissionMapUv:Ee&&E(o.transmissionMap.channel),thicknessMapUv:Se&&E(o.thicknessMap.channel),alphaMapUv:Me&&E(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:B,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:P,morphTextureStride:N,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:j&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===fe,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Ae&&!0===o.extensions.clipCullDistance&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===o.extensions.multiDraw||G)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);t.gradientMap&&l.enable(22);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reversedDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Pn[t];n=ue.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let r;for(let e=0,t=f.length;e0?r.push(d):!0===o.transparent?i.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?r.unshift(d):!0===o.transparent?i.unshift(d):n.unshift(d)},finish:function(){for(let n=t,r=e.length;n1&&n.sort(e||Gi),r.length>1&&r.sort(t||Vi),i.length>1&&i.sort(t||Vi)}}}function ki(){let e=new WeakMap;return{get:function(t,n){const r=e.get(t);let i;return void 0===r?(i=new zi,e.set(t,[i])):n>=r.length?(i=new zi,r.push(i)):i=r[n],i},dispose:function(){e=new WeakMap}}}function Wi(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let r;switch(t.type){case"DirectionalLight":r={direction:new i,color:new n};break;case"SpotLight":r={position:new i,direction:new i,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":r={position:new i,color:new n,distance:0,decay:0};break;case"HemisphereLight":r={direction:new i,skyColor:new n,groundColor:new n};break;case"RectAreaLight":r={color:new n,position:new i,halfWidth:new i,halfHeight:new i}}return e[t.id]=r,r}}}let Xi=0;function Yi(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Ki(e){const n=new Wi,r=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let r;switch(n.type){case"DirectionalLight":case"SpotLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=r,r}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new i);const o=new i,s=new f,l=new f;return{setup:function(t){let i=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(Yi);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Ln.LTC_FLOAT_1,a.rectAreaLTC2=Ln.LTC_FLOAT_2):(a.rectAreaLTC1=Ln.LTC_HALF_1,a.rectAreaLTC2=Ln.LTC_HALF_2)),a.ambient[0]=i,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=Xi++)},setupView:function(e,t){let n=0,r=0,i=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=i.length?(a=new qi(e),i.push(a)):a=i[r],a},dispose:function(){t=new WeakMap}}}function Zi(e,n,r){let i=new ge;const a=new t,s=new t,d=new k,u=new ve({depthPacking:Ee}),f=new Se,p={},m=r.maxTextureSize,h={[_]:c,[c]:_,[fe]:fe},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},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 \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new N;E.setAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=$;let M=this.type;function x(t,r){const i=n.update(S);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(r,null,i,g,S,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(r,null,i,v,S,null)}function R(t,n,r,i){let a=null;const o=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===r.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let r=p[e];void 0===r&&(r={},p[e]=r);let i=r[t];void 0===i&&(i=a.clone(),r[t]=i,n.addEventListener("dispose",b)),a=i}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=i===J?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(t,r,a,o,s){if(!1===t.visible)return;if(t.layers.test(r.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===J)&&(!t.frustumCulled||i.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const i=n.update(t),l=t.material;if(Array.isArray(l)){const n=i.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==J?{minFilter:Te,magFilter:Te}:{};null!==c.map&&c.map.dispose(),c.map=new I(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),i=c.getFrustum(),A(n,r,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===J&&x(c,r),c.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const $i={[Ke]:Ye,[Xe]:ze,[We]:Ve,[Me]:ke,[Ye]:Ke,[ze]:Xe,[Ve]:We,[ke]:Me};function Qi(e,t){const r=new function(){let t=!1;const n=new k;let r=null;const i=new k(0,0,0,0);return{setMask:function(n){r===n||t||(e.colorMask(n,n,n,n),r=n)},setLocked:function(e){t=e},setClear:function(t,r,a,o,s){!0===s&&(t*=o,r*=o,a*=o),n.set(t,r,a,o),!1===i.equals(n)&&(e.clearColor(t,r,a,o),i.copy(n))},reset:function(){t=!1,r=null,i.set(-1,0,0,0)}}},i=new function(){let n=!1,r=!1,i=null,a=null,o=null;return{setReversed:function(e){if(r!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),r=e;const i=o;o=null,this.setClear(i)}},getReversed:function(){return r},setTest:function(t){t?W(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){i===t||n||(e.depthMask(t),i=t)},setFunc:function(t){if(r&&(t=$i[t]),a!==t){switch(t){case Ke:e.depthFunc(e.NEVER);break;case Ye:e.depthFunc(e.ALWAYS);break;case Xe:e.depthFunc(e.LESS);break;case Me:e.depthFunc(e.LEQUAL);break;case We:e.depthFunc(e.EQUAL);break;case ke:e.depthFunc(e.GEQUAL);break;case ze:e.depthFunc(e.GREATER);break;case Ve:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(r&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,i=null,a=null,o=null,r=!1}}},a=new function(){let t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?W(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(r){n===r||t||(e.stencilMask(r),n=r)},setFunc:function(t,n,o){r===t&&i===n&&a===o||(e.stencilFunc(t,n,o),r=t,i=n,a=o)},setOp:function(t,n,r){o===t&&s===n&&l===r||(e.stencilOp(t,n,r),o=t,s=n,l=r)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,P=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(I)[1]),D=w>=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,O={};const F=e.getParameter(e.SCISSOR_BOX),B=e.getParameter(e.VIEWPORT),H=(new k).fromArray(F),G=(new k).fromArray(B);function V(t,n,r,i){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||i.height>n)&&(r=n/Math.max(i.width,i.height)),r<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(r*i.width),a=Math.floor(r*i.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+")."),e}return e}function E(e){return e.generateMipmaps}function x(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function A(t,r,i,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=r;if(r===e.RED&&(i===e.FLOAT&&(s=e.R32F),i===e.HALF_FLOAT&&(s=e.R16F),i===e.UNSIGNED_BYTE&&(s=e.R8)),r===e.RED_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.R8UI),i===e.UNSIGNED_SHORT&&(s=e.R16UI),i===e.UNSIGNED_INT&&(s=e.R32UI),i===e.BYTE&&(s=e.R8I),i===e.SHORT&&(s=e.R16I),i===e.INT&&(s=e.R32I)),r===e.RG&&(i===e.FLOAT&&(s=e.RG32F),i===e.HALF_FLOAT&&(s=e.RG16F),i===e.UNSIGNED_BYTE&&(s=e.RG8)),r===e.RG_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RG8UI),i===e.UNSIGNED_SHORT&&(s=e.RG16UI),i===e.UNSIGNED_INT&&(s=e.RG32UI),i===e.BYTE&&(s=e.RG8I),i===e.SHORT&&(s=e.RG16I),i===e.INT&&(s=e.RG32I)),r===e.RGB_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGB8UI),i===e.UNSIGNED_SHORT&&(s=e.RGB16UI),i===e.UNSIGNED_INT&&(s=e.RGB32UI),i===e.BYTE&&(s=e.RGB8I),i===e.SHORT&&(s=e.RGB16I),i===e.INT&&(s=e.RGB32I)),r===e.RGBA_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),i===e.UNSIGNED_INT&&(s=e.RGBA32UI),i===e.BYTE&&(s=e.RGBA8I),i===e.SHORT&&(s=e.RGBA16I),i===e.INT&&(s=e.RGBA32I)),r===e.RGB&&i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.RGBA){const t=o?se:p.getTransfer(a);i===e.FLOAT&&(s=e.RGBA32F),i===e.HALF_FLOAT&&(s=e.RGBA16F),i===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),i===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function b(t,n){let r;return t?null===n||n===Tt||n===Mt?r=e.DEPTH24_STENCIL8:n===T?r=e.DEPTH32F_STENCIL8:n===xt&&(r=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Tt||n===Mt?r=e.DEPTH_COMPONENT24:n===T?r=e.DEPTH_COMPONENT32F:n===xt&&(r=e.DEPTH_COMPONENT16),r}function C(e,t){return!0===E(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==B?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=h.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&U(e),0===Object.keys(r).length&&h.delete(n)}i.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=i.get(t);t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let r=0;r0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void V(a,t,n);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);r.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[at]:e.REPEAT,[it]:e.CLAMP_TO_EDGE,[rt]:e.MIRRORED_REPEAT},I={[Te]:e.NEAREST,[ct]:e.NEAREST_MIPMAP_NEAREST,[lt]:e.NEAREST_MIPMAP_LINEAR,[B]:e.LINEAR,[st]:e.LINEAR_MIPMAP_NEAREST,[ot]:e.LINEAR_MIPMAP_LINEAR},N={[_t]:e.NEVER,[ht]:e.ALWAYS,[mt]:e.LESS,[K]:e.LEQUAL,[pt]:e.EQUAL,[ft]:e.GEQUAL,[ut]:e.GREATER,[dt]:e.NOTEQUAL};function O(t,r){if(r.type!==T||!1!==n.has("OES_texture_float_linear")||r.magFilter!==B&&r.magFilter!==st&&r.magFilter!==lt&&r.magFilter!==ot&&r.minFilter!==B&&r.minFilter!==st&&r.minFilter!==lt&&r.minFilter!==ot||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,y[r.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,y[r.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,y[r.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,I[r.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,I[r.minFilter]),r.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,N[r.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(r.magFilter===Te)return;if(r.minFilter!==lt&&r.minFilter!==ot)return;if(r.type===T&&!1===n.has("OES_texture_float_linear"))return;if(r.anisotropy>1||i.get(r).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(r.anisotropy,a.getMaxAnisotropy())),i.get(r).__currentAnisotropy=r.anisotropy}}}function H(t,n){let r=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const i=n.source;let a=h.get(i);void 0===a&&(a={},h.set(i,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,r=!0),a[o].usedTimes++;const i=a[t.__cacheKey];void 0!==i&&(a[t.__cacheKey].usedTimes--,0===i.usedTimes&&U(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return r}function G(e,t,n){return Math.floor(Math.floor(e/n)/t)}function V(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=H(t,n),d=n.source;r.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=i.get(d);if(d.version!==u.__version||!0===c){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=$(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,S=A(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);O(l,n);const T=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,P=d.dataReady,U=C(n,m);if(n.isDepthTexture)S=b(n.format===vt,n.type),L&&(R?r.texStorage2D(e.TEXTURE_2D,1,S,m.width,m.height):r.texImage2D(e.TEXTURE_2D,0,S,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(T.length>0){R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,n=T.length;te.start-t.start);let s=0;for(let e=1;e0){const i=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*i/g.data.BYTES_PER_ELEMENT,(a+1)*i/g.data.BYTES_PER_ELEMENT);r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else r.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?P&&r.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):r.texImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,i=T.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const i of n.layerUpdates){const n=m.data.subarray(i*t/m.data.BYTES_PER_ELEMENT,(i+1)*t/m.data.BYTES_PER_ELEMENT);r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else r.texImage3D(e.TEXTURE_2D_ARRAY,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&r.texStorage3D(e.TEXTURE_3D,U,S,m.width,m.height,m.depth),P&&r.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):r.texImage3D(e.TEXTURE_3D,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)r.texStorage2D(e.TEXTURE_2D,U,S,m.width,m.height);else{let t=m.width,n=m.height;for(let i=0;i>=1,n>>=1}}else if(T.length>0){if(R&&L){const t=Q(T[0]);r.texStorage2D(e.TEXTURE_2D,U,S,t.width,t.height)}for(let t=0,n=T.length;t>d),i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?r.texImage3D(c,d,p,t,i,n.depth,0,u,f,null):r.texImage2D(c,d,p,t,i,0,u,f,null)}r.bindFramebuffer(e.FRAMEBUFFER,t),Z(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,j(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),r.bindFramebuffer(e.FRAMEBUFFER,null)}function k(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const i=n.depthTexture,a=i&&i.isDepthTexture?i.type:null,o=b(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=j(n);Z(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let i=0;i{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer){if(a)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?W(n.__webglFramebuffer[0],t):W(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]),void 0===n.__webglDepthbuffer[i])n.__webglDepthbuffer[i]=e.createRenderbuffer(),k(n.__webglDepthbuffer[i],t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,a)}}else{const i=t.texture.mipmaps;if(i&&i.length>0?r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),k(n.__webglDepthbuffer,t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,i)}}r.bindFramebuffer(e.FRAMEBUFFER,null)}const Y=[],q=[];function j(e){return Math.min(a.maxSamples,e.samples)}function Z(e){const t=i.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function $(e,t){const n=e.colorSpace,r=e.format,i=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==gt&&(p.getTransfer(n)===m?r===M&&i===S||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Q(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=D;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),D+=1,e},this.resetTextureUnits=function(){D=0},this.setTexture2D=w,this.setTexture2DArray=function(t,n){const a=i.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?V(a,t,n):r.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=i.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?V(a,t,n):r.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=i.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=H(t,n),c=n.source;r.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=i.get(c);if(c.version!==d.__version||!0===l){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=$(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),S=o.convert(n.type),T=A(n.internalFormat,g,S,n.colorSpace),R=!0!==n.isVideoTexture,b=void 0===d.__version||!0===l,L=c.dataReady;let P,U=C(n,_);if(O(e.TEXTURE_CUBE_MAP,n),f){R&&b&&r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,_.width,_.height);for(let t=0;t<6;t++){P=h[t].mipmaps;for(let i=0;i0&&U++;const t=Q(h[0]);r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&r.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,S,h[t].data):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,T,h[t].width,h[t].height,0,g,S,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let r=0;r0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===Z(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],r.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let r=0;r0)if(!1===Z(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=i.get(t),u=n.length>1;if(u)for(let t=0;t0?r.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):r.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let r=0;r= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class ra extends _n{constructor(e,n){super();const r=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _=new na,g={},v=n.getContextAttributes();let E=null,T=null;const x=[],R=[],A=new t;let b=null;const C=new U;C.viewport=new k;const L=new U;L.viewport=new k;const P=[C,L],D=new gn;let w=null,y=null;function N(e){const t=R.indexOf(e.inputSource);if(-1===t)return;const n=x[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function O(){a.removeEventListener("select",N),a.removeEventListener("selectstart",N),a.removeEventListener("selectend",N),a.removeEventListener("squeeze",N),a.removeEventListener("squeezestart",N),a.removeEventListener("squeezeend",N),a.removeEventListener("end",O),a.removeEventListener("inputsourceschange",F);for(let e=0;e=0&&(R[r]=null,x[r].disconnect(n))}for(let t=0;t=R.length){R.push(n),r=e;break}if(null===R[e]){R[e]=n,r=e;break}}if(-1===r)break}const i=x[r];i&&i.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getGripSpace()},this.getHand=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){E=e.getRenderTarget(),a.addEventListener("select",N),a.addEventListener("selectstart",N),a.addEventListener("selectend",N),a.addEventListener("squeeze",N),a.addEventListener("squeezestart",N),a.addEventListener("squeezeend",N),a.addEventListener("end",O),a.addEventListener("inputsourceschange",F),!0!==v.xrCompatible&&await n.makeXRCompatible(),b=e.getPixelRatio(),e.getSize(A),"undefined"!=typeof XRWebGLBinding&&(f=new XRWebGLBinding(a,n));if(null!==f&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,r=null,i=null;v.depth&&(i=v.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=v.stencil?vt:St,r=v.stencil?Mt:Tt);const s={colorFormat:n.RGBA8,depthFormat:i,scaleFactor:o};p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),T=new I(p.textureWidth,p.textureHeight,{format:M,type:S,depthTexture:new q(p.textureWidth,p.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:v.stencil,colorSpace:e.outputColorSpace,samples:v.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:v.antialias,alpha:!0,depth:v.depth,stencil:v.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),T=new I(m.framebufferWidth,m.framebufferHeight,{format:M,type:S,colorSpace:e.outputColorSpace,stencilBuffer:v.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}T.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return _.getDepthTexture()};const B=new i,H=new i;function G(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==_.texture&&(_.depthNear>0&&(t=_.depthNear),_.depthFar>0&&(n=_.depthFar)),D.near=L.near=C.near=t,D.far=L.far=C.far=n,w===D.near&&y===D.far||(a.updateRenderState({depthNear:D.near,depthFar:D.far}),w=D.near,y=D.far),D.layers.mask=6|e.layers.mask,C.layers.mask=3&D.layers.mask,L.layers.mask=5&D.layers.mask;const r=e.parent,i=D.cameras;G(D,r);for(let e=0;e0&&(e.alphaTest.value=r.alphaTest);const i=t.get(r),a=i.envMap,o=i.envMapRotation;a&&(e.envMap.value=a,ia.copy(o),ia.x*=-1,ia.y*=-1,ia.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(ia.y*=-1,ia.z*=-1),e.envMapRotation.value.setFromMatrix4(aa.makeRotationFromEuler(ia)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=r.reflectivity,e.ior.value=r.ior,e.refractionRatio.value=r.refractionRatio),r.lightMap&&(e.lightMap.value=r.lightMap,e.lightMapIntensity.value=r.lightMapIntensity,n(r.lightMap,e.lightMapTransform)),r.aoMap&&(e.aoMap.value=r.aoMap,e.aoMapIntensity.value=r.aoMapIntensity,n(r.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,i,a,o,s){i.isMeshBasicMaterial||i.isMeshLambertMaterial?r(e,i):i.isMeshToonMaterial?(r(e,i),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,i)):i.isMeshPhongMaterial?(r(e,i),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,i)):i.isMeshStandardMaterial?(r(e,i),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,i),i.isMeshPhysicalMaterial&&function(e,t,r){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=r.texture,e.transmissionSamplerSize.value.set(r.width,r.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,i,s)):i.isMeshMatcapMaterial?(r(e,i),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,i)):i.isMeshDepthMaterial?r(e,i):i.isMeshDistanceMaterial?(r(e,i),function(e,n){const r=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(r.matrixWorld),e.nearDistance.value=r.shadow.camera.near,e.farDistance.value=r.shadow.camera.far}(e,i)):i.isMeshNormalMaterial?r(e,i):i.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,i),i.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,i)):i.isPointsMaterial?function(e,t,r,i){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*r,e.scale.value=.5*i,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i,a,o):i.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i):i.isShadowMaterial?(e.color.value.copy(i.color),e.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function sa(e,t,n,r){let i={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,r){const i=e.value,a=t+"_"+n;if(void 0===r[a])return r[a]="number"==typeof i||"boolean"==typeof i?i:i.clone(),!0;{const e=r[a];if("number"==typeof i||"boolean"==typeof i){if(e!==i)return r[a]=i,!0}else if(!1===e.equals(i))return e.copy(i),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const r=o.indexOf(n.__bindingPointIndex);o.splice(r,1),e.deleteBuffer(i[n.id]),delete i[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;r.uniformBlockBinding(e,n)},update:function(n,u){let f=i[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const r=16;for(let e=0,i=t.length;e0&&(n+=r-i);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=D;r.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(m=C.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=ue.get(r),v=R.state.lights;if(!0===J&&(!0===ee||e!==N)){const t=e===N&&r.id===y;Re.setState(r,e,t)}let E=!1;r.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||i.isBatchedMesh&&!1===g.batching?E=!0:i.isBatchedMesh||!0!==g.batching?i.isBatchedMesh&&!0===g.batchingColor&&null===i.colorTexture||i.isBatchedMesh&&!1===g.batchingColor&&null!==i.colorTexture||i.isInstancedMesh&&!1===g.instancing?E=!0:i.isInstancedMesh||!0!==g.instancing?i.isSkinnedMesh&&!1===g.skinning?E=!0:i.isSkinnedMesh||!0!==g.skinning?i.isInstancedMesh&&!0===g.instancingColor&&null===i.instanceColor||i.isInstancedMesh&&!1===g.instancingColor&&null!==i.instanceColor||i.isInstancedMesh&&!0===g.instancingMorph&&null===i.morphTexture||i.isInstancedMesh&&!1===g.instancingMorph&&null!==i.morphTexture||g.envMap!==l||!0===r.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Re.numPlanes&&g.numIntersection===Re.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=r.version);let S=g.currentProgram;!0===E&&(S=$e(r,t,i));let T=!1,M=!1,x=!1;const A=S.getUniforms(),b=g.uniforms;ce.useProgram(S.program)&&(T=!0,M=!0,x=!0);r.id!==y&&(y=r.id,M=!0);if(T||N!==e){ce.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),A.setValue(ye,"projectionMatrix",e.projectionMatrix),A.setValue(ye,"viewMatrix",e.matrixWorldInverse);const t=A.map.cameraPosition;void 0!==t&&t.setValue(ye,ne.setFromMatrixPosition(e.matrixWorld)),le.logarithmicDepthBuffer&&A.setValue(ye,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(r.isMeshPhongMaterial||r.isMeshToonMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial)&&A.setValue(ye,"isOrthographic",!0===e.isOrthographicCamera),N!==e&&(N=e,M=!0,x=!0)}if(i.isSkinnedMesh){A.setOptional(ye,i,"bindMatrix"),A.setOptional(ye,i,"bindMatrixInverse");const e=i.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(ye,"boneTexture",e.boneTexture,pe))}i.isBatchedMesh&&(A.setOptional(ye,i,"batchingTexture"),A.setValue(ye,"batchingTexture",i._matricesTexture,pe),A.setOptional(ye,i,"batchingIdTexture"),A.setValue(ye,"batchingIdTexture",i._indirectTexture,pe),A.setOptional(ye,i,"batchingColorTexture"),null!==i._colorsTexture&&A.setValue(ye,"batchingColorTexture",i._colorsTexture,pe));const L=n.morphAttributes;void 0===L.position&&void 0===L.normal&&void 0===L.color||Ce.update(i,n,S);(M||g.receiveShadow!==i.receiveShadow)&&(g.receiveShadow=i.receiveShadow,A.setValue(ye,"receiveShadow",i.receiveShadow));r.isMeshGouraudMaterial&&null!==r.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);r.isMeshStandardMaterial&&null===r.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);M&&(A.setValue(ye,"toneMappingExposure",C.toneMappingExposure),g.needsLights&&(U=x,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===r.fog&&Te.refreshFogUniforms(b,a),Te.refreshMaterialUniforms(b,r,Y,X,R.state.transmissionRenderTarget[e.id]),mi.upload(ye,Qe(g),b,pe));var P,U;r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(mi.upload(ye,Qe(g),b,pe),r.uniformsNeedUpdate=!1);r.isSpriteMaterial&&A.setValue(ye,"center",i.center);if(A.setValue(ye,"modelViewMatrix",i.modelViewMatrix),A.setValue(ye,"normalMatrix",i.normalMatrix),A.setValue(ye,"modelMatrix",i.matrixWorld),r.isShaderMaterial||r.isRawShaderMaterial){const e=r.uniformsGroups;for(let t=0,n=e.length;t{function n(){r.forEach(function(e){ue.get(e).currentProgram.isReady()&&r.delete(e)}),0!==r.size?setTimeout(n,10):t(e)}null!==se.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let ze=null;function ke(){Xe.stop()}function We(){Xe.start()}const Xe=new An;function Ye(e,t,n,r){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){r&&re.setFromMatrixPosition(e.matrixWorld).applyMatrix4(te);const t=Ee.update(e),i=e.material;i.visible&&x.push(e,t,i,n,re.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=Ee.update(e),i=e.material;if(r&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),re.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),re.copy(t.boundingSphere.center)),re.applyMatrix4(e.matrixWorld).applyMatrix4(te)),Array.isArray(i)){const r=t.groups;for(let a=0,o=r.length;a0&&je(i,t,n),a.length>0&&je(a,t,n),o.length>0&&je(o,t,n),ce.buffers.depth.setTest(!0),ce.buffers.depth.setMask(!0),ce.buffers.color.setMask(!0),ce.setPolygonOffset(!1)}function qe(e,t,n,r){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[r.id]&&(R.state.transmissionRenderTarget[r.id]=new I(1,1,{generateMipmaps:!0,type:se.has("EXT_color_buffer_half_float")||se.has("EXT_color_buffer_float")?E:S,minFilter:ot,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const i=R.state.transmissionRenderTarget[r.id],a=r.viewport||O;i.setSize(a.z*C.transmissionResolutionScale,a.w*C.transmissionResolutionScale);const s=C.getRenderTarget(),l=C.getActiveCubeFace(),d=C.getActiveMipmapLevel();C.setRenderTarget(i),C.getClearColor(V),z=C.getClearAlpha(),z<1&&C.setClearColor(16777215,.5),C.clear(),ae&&be.render(n);const u=C.toneMapping;C.toneMapping=D;const f=r.viewport;if(void 0!==r.viewport&&(r.viewport=void 0),R.setupLightsView(r),!0===J&&Re.setGlobalState(C.clippingPlanes,r),je(e,n,r),pe.updateMultisampleRenderTarget(i),pe.updateRenderTargetMipmap(i),!1===se.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let i=0,a=t.length;i0)for(let t=0,a=n.length;t0&&qe(r,i,e,t),ae&&be.render(e),Ke(x,e,t);null!==w&&0===U&&(pe.updateMultisampleRenderTarget(w),pe.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(C,e,t),De.resetDefaultState(),y=-1,N=null,b.pop(),b.length>0?(R=b[b.length-1],!0===J&&Re.setGlobalState(C.clippingPlanes,R.state.camera)):R=null,A.pop(),x=A.length>0?A[A.length-1]:null},this.getActiveCubeFace=function(){return P},this.getActiveMipmapLevel=function(){return U},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){const r=ue.get(e);r.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===r.__autoAllocateDepthBuffer&&(r.__useRenderToTexture=!1),ue.get(e.texture).__webglTexture=t,ue.get(e.depthTexture).__webglTexture=r.__autoAllocateDepthBuffer?void 0:n,r.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=ue.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const et=ye.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){w=e,P=t,U=n;let r=!0,i=null,a=!1,o=!1;if(e){const s=ue.get(e);if(void 0!==s.__useDefaultFramebuffer)ce.bindFramebuffer(ye.FRAMEBUFFER,null),r=!1;else if(void 0===s.__webglFramebuffer)pe.setupRenderTarget(e);else if(s.__hasExternalTextures)pe.rebindTextures(e,ue.get(e.texture).__webglTexture,ue.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&ue.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");pe.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=ue.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(c[t])?c[t][n]:c[t],a=!0):i=e.samples>0&&!1===pe.useMultisampledRTT(e)?ue.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,O.copy(e.viewport),B.copy(e.scissor),G=e.scissorTest}else O.copy(j).multiplyScalar(Y).floor(),B.copy(Z).multiplyScalar(Y).floor(),G=$;0!==n&&(i=et);if(ce.bindFramebuffer(ye.FRAMEBUFFER,i)&&r&&ce.drawBuffers(e,i),ce.viewport(O),ce.scissor(B),ce.setScissorTest(G),a){const r=ue.get(e.texture);ye.framebufferTexture2D(ye.FRAMEBUFFER,ye.COLOR_ATTACHMENT0,ye.TEXTURE_CUBE_MAP_POSITIVE_X+t,r.__webglTexture,n)}else if(o){const r=t;for(let t=0;t=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&(e.textures.length>1&&ye.readBuffer(ye.COLOR_ATTACHMENT0+s),ye.readPixels(t,n,r,i,Ue.convert(l),Ue.convert(c),a))}finally{const e=null!==w?ue.get(w).__webglFramebuffer:null;ce.bindFramebuffer(ye.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,r,i,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=ue.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i){ce.bindFramebuffer(ye.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!le.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!le.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ye.createBuffer();ye.bindBuffer(ye.PIXEL_PACK_BUFFER,u),ye.bufferData(ye.PIXEL_PACK_BUFFER,a.byteLength,ye.STREAM_READ),e.textures.length>1&&ye.readBuffer(ye.COLOR_ATTACHMENT0+s),ye.readPixels(t,n,r,i,Ue.convert(c),Ue.convert(d),0);const f=null!==w?ue.get(w).__webglFramebuffer:null;ce.bindFramebuffer(ye.FRAMEBUFFER,f);const p=ye.fenceSync(ye.SYNC_GPU_COMMANDS_COMPLETE,0);return ye.flush(),await Rn(ye,p,4),ye.bindBuffer(ye.PIXEL_PACK_BUFFER,u),ye.getBufferSubData(ye.PIXEL_PACK_BUFFER,0,a),ye.deleteBuffer(u),ye.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=null!==t?t.x:0,s=null!==t?t.y:0;pe.setTexture2D(e,0),ye.copyTexSubImage2D(ye.TEXTURE_2D,n,0,0,o,s,i,a),ce.unbindTexture()};const tt=ye.createFramebuffer(),nt=ye.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,r=null,i=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==i?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=i,i=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-i);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==r?(f=r.x,p=r.y,m=r.z):(f=0,p=0,m=0);const _=Ue.convert(t.format),g=Ue.convert(t.type);let v;t.isData3DTexture?(pe.setTexture3D(t,0),v=ye.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(pe.setTexture2DArray(t,0),v=ye.TEXTURE_2D_ARRAY):(pe.setTexture2D(t,0),v=ye.TEXTURE_2D),ye.pixelStorei(ye.UNPACK_FLIP_Y_WEBGL,t.flipY),ye.pixelStorei(ye.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ye.pixelStorei(ye.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ye.getParameter(ye.UNPACK_ROW_LENGTH),S=ye.getParameter(ye.UNPACK_IMAGE_HEIGHT),T=ye.getParameter(ye.UNPACK_SKIP_PIXELS),M=ye.getParameter(ye.UNPACK_SKIP_ROWS),x=ye.getParameter(ye.UNPACK_SKIP_IMAGES);ye.pixelStorei(ye.UNPACK_ROW_LENGTH,h.width),ye.pixelStorei(ye.UNPACK_IMAGE_HEIGHT,h.height),ye.pixelStorei(ye.UNPACK_SKIP_PIXELS,c),ye.pixelStorei(ye.UNPACK_SKIP_ROWS,d),ye.pixelStorei(ye.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=ue.get(e),r=ue.get(t),h=ue.get(n.__renderTarget),_=ue.get(r.__renderTarget);ce.bindFramebuffer(ye.READ_FRAMEBUFFER,h.__webglFramebuffer),ce.bindFramebuffer(ye.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;ne.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\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 ) || defined( USE_BATCHING_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 ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.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; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\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}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.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\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\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\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_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 ), cubeUV_m0, CUBEUV_MAX_MIP );\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_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 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, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( 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 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\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 ) || defined( LAMBERT )\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 ) || defined( LAMBERT )\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:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\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}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\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 ], geometryNormal );\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, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\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\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\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, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - 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_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\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, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\n\t\t#ifdef USE_REVERSEDEPTHBUF\n\t\t\treturn step( depth, compare );\n\t\t#else\n\t\t\treturn step( compare, depth );\n\t\t#endif\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\t#ifdef USE_REVERSEDEPTHBUF\n\t\t\tfloat hard_shadow = step( distribution.x, compare );\n\t\t#else\n\t\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\t#endif\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 shadowIntensity, 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\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\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 shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#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 shadowIntensity;\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\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\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 shadowIntensity;\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:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\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.shadowIntensity, 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.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ 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.shadowIntensity, 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\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\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, vSpecularMapUv );\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 saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSEDEPTHBUF\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\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#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\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 \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Ln={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,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 n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Pn={basic:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.fog]),vertexShader:Cn.meshbasic_vert,fragmentShader:Cn.meshbasic_frag},lambert:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)}}]),vertexShader:Cn.meshlambert_vert,fragmentShader:Cn.meshlambert_frag},phong:{uniforms:r([Ln.common,Ln.specularmap,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Cn.meshphong_vert,fragmentShader:Cn.meshphong_frag},standard:{uniforms:r([Ln.common,Ln.envmap,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.roughnessmap,Ln.metalnessmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Cn.meshphysical_vert,fragmentShader:Cn.meshphysical_frag},toon:{uniforms:r([Ln.common,Ln.aomap,Ln.lightmap,Ln.emissivemap,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.gradientmap,Ln.fog,Ln.lights,{emissive:{value:new n(0)}}]),vertexShader:Cn.meshtoon_vert,fragmentShader:Cn.meshtoon_frag},matcap:{uniforms:r([Ln.common,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,Ln.fog,{matcap:{value:null}}]),vertexShader:Cn.meshmatcap_vert,fragmentShader:Cn.meshmatcap_frag},points:{uniforms:r([Ln.points,Ln.fog]),vertexShader:Cn.points_vert,fragmentShader:Cn.points_frag},dashed:{uniforms:r([Ln.common,Ln.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Cn.linedashed_vert,fragmentShader:Cn.linedashed_frag},depth:{uniforms:r([Ln.common,Ln.displacementmap]),vertexShader:Cn.depth_vert,fragmentShader:Cn.depth_frag},normal:{uniforms:r([Ln.common,Ln.bumpmap,Ln.normalmap,Ln.displacementmap,{opacity:{value:1}}]),vertexShader:Cn.meshnormal_vert,fragmentShader:Cn.meshnormal_frag},sprite:{uniforms:r([Ln.sprite,Ln.fog]),vertexShader:Cn.sprite_vert,fragmentShader:Cn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Cn.background_vert,fragmentShader:Cn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Cn.backgroundCube_vert,fragmentShader:Cn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Cn.cube_vert,fragmentShader:Cn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Cn.equirect_vert,fragmentShader:Cn.equirect_frag},distanceRGBA:{uniforms:r([Ln.common,Ln.displacementmap,{referencePosition:{value:new i},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Cn.distanceRGBA_vert,fragmentShader:Cn.distanceRGBA_frag},shadow:{uniforms:r([Ln.lights,Ln.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Cn.shadow_vert,fragmentShader:Cn.shadow_frag}};Pn.physical={uniforms:r([Pn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Cn.meshphysical_vert,fragmentShader:Cn.meshphysical_frag};const Un={r:0,b:0,g:0},Dn=new u,wn=new f;function yn(e,t,r,i,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,R=0,A=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?r:t).get(n)}return n}function C(t,n){t.getRGB(Un,g(e)),i.buffers.color.setClear(Un.r,Un.g,Un.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const r=b(t);null===r?C(E,M):r&&r.isColor&&(C(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const r=b(n);r&&(r.isCubeTexture||r.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Pn.backgroundCube.uniforms),vertexShader:Pn.backgroundCube.vertexShader,fragmentShader:Pn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),Dn.copy(n.backgroundRotation),Dn.x*=-1,Dn.y*=-1,Dn.z*=-1,r.isCubeTexture&&!1===r.isRenderTargetTexture&&(Dn.y*=-1,Dn.z*=-1),T.material.uniforms.envMap.value=r,T.material.uniforms.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(wn.makeRotationFromEuler(Dn)),T.material.toneMapped=p.getTransfer(r.colorSpace)!==m,x===r&&R===r.version&&A===e.toneMapping||(T.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):r&&r.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Pn.background.uniforms),vertexShader:Pn.background.vertexShader,fragmentShader:Pn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=r,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(r.colorSpace)!==m,!0===r.matrixAutoUpdate&&r.updateMatrix(),S.material.uniforms.uvTransform.value.copy(r.matrix),x===r&&R===r.version&&A===e.toneMapping||(S.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function In(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),r={},i=c(null);let a=i,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],r=[],i=[];for(let e=0;e=0){const n=i[t];let r=o[t];if(void 0===r&&("instanceMatrix"===t&&e.instanceMatrix&&(r=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(r=e.instanceColor)),void 0===n)return!0;if(n.attribute!==r)return!0;if(r&&n.data!==r.data)return!0;s++}}return a.attributesNum!==s||a.index!==r}(n,h,l,_),g&&function(e,t,n,r){const i={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const r={};r.attribute=n,n&&n.data&&(r.data=n.data),i[t]=r,s++}}a.attributes=i,a.attributesNum=s,a.index=r}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,r,i,a){d();const o=a.attributes,s=i.getAttributes(),l=r.defaultAttributeValues;for(const r in s){const i=s[r];if(i.location>=0){let s=o[r];if(void 0===s&&("instanceMatrix"===r&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===r&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const r=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");i=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:a,textureFormatReadable:function(t){return t===M||r.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const i=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&r.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!i)},precision:o,logarithmicDepthBuffer:l,reversedDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Fn(t){const n=this;let r=null,i=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,r,i){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==i||null===o){const n=r+4*a,i=t.matrixWorldInverse;l.getNormalMatrix(i),(null===o||o.length0);n.numPlanes=i,n.numIntersection=0}();else{const e=o?0:i,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=r[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Bn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=C:t===A&&(e.mapping=L),e}function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping;if(a===R||a===A){if(t.has(i)){return n(t.get(i).texture,i.mapping)}{const a=i.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,i),t.set(i,o),i.addEventListener("dispose",r),n(o.texture,i.mapping)}return null}}}return i},dispose:function(){t=new WeakMap}}}const Hn=[.125,.215,.35,.446,.526,.582],Gn=20,Vn=new P,zn=new n;let kn=null,Wn=0,Xn=0,Yn=!1;const Kn=(1+Math.sqrt(5))/2,qn=1/Kn,jn=[new i(-Kn,qn,0),new i(Kn,qn,0),new i(-qn,0,Kn),new i(qn,0,Kn),new i(0,Kn,-qn),new i(0,Kn,qn),new i(-1,1,-1),new i(1,1,-1),new i(-1,1,1),new i(1,1,1)],Zn=new i;class $n{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,r=100,i={}){const{size:a=256,position:o=Zn}=i;kn=this._renderer.getRenderTarget(),Wn=this._renderer.getActiveCubeFace(),Xn=this._renderer.getActiveMipmapLevel(),Yn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,r,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=tr(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=er(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=Hn[o-e+4-1]:0===o&&(s=0),r.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,r=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(r,m*p*e),v.set(u,h*p*e);const i=[e,e,e,e,e,e];E.set(i,_*p*e)}const S=new N;S.setAttribute("position",new O(g,m)),S.setAttribute("uv",new O(v,h)),S.setAttribute("faceIndex",new O(E,_)),t.push(S),i>4&&i--}return{lodPlanes:t,sizeLods:n,sigmas:r}}(r)),this._blurMaterial=function(e,t,n){const r=new Float32Array(Gn),a=new i(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Gn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:nr(),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#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1});return o}(r,e,t)}return r}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Vn)}_sceneToCubeUV(e,t,n,r,i){const a=new U(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(zn),u.toneMapping=D,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(r),u.clearDepth(),u.setRenderTarget(null));const m=new w({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(zn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x+d[t],i.y,i.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y+d[t],i.z)):(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y,i.z+d[t]));const o=this._cubeSize;Jn(r,n*o,t>2?o:0,o,o),u.setRenderTarget(r),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,r=e.mapping===C||e.mapping===L;r?(null===this._cubemapMaterial&&(this._cubemapMaterial=tr()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=er());const i=r?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],i);i.uniforms.envMap.value=e;const s=this._cubeSize;Jn(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Vn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const r=this._lodPlanes.length;for(let t=1;tGn&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?r-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Vn)}}function Qn(e,t,n){const r=new I(e,t,n);return r.texture.mapping=a,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function Jn(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function er(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:nr(),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\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function tr(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:nr(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function nr(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\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 rr(e){let t=new WeakMap,n=null;function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(i);const l=void 0!==a?a.texture.pmremVersion:0;if(i.isRenderTargetTexture&&i.pmremVersion!==l)return null===n&&(n=new $n(e)),a=o?n.fromEquirectangular(i,a):n.fromCubemap(i,a),a.texture.pmremVersion=i.pmremVersion,t.set(i,a),a.texture;if(void 0!==a)return a.texture;{const l=i.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let r=0;rn.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),R=new W(x,S,M,u);R.type=T,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const i=t*n;let a=hr[i];if(void 0===a&&(a=new Float32Array(i),hr[i]=a),0!==t){r.toArray(a,0);for(let r=1,i=0;r!==t;++r)i+=n,e[r].toArray(a,i)}return a}function Tr(e,t){if(e.length!==t.length)return!1;for(let n=0,r=e.length;n":" "} ${i}: ${n[e]}`)}return r.join("\n")}(e.getShaderSource(t),r)}return i}function Ei(e,t){const n=function(e){p._getMatrix(gi,p.workingColorSpace,e);const t=`mat3( ${gi.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Si(e,t){let n;switch(t){case oe:n="Linear";break;case ae:n="Reinhard";break;case ie:n="Cineon";break;case re:n="ACESFilmic";break;case ne:n="AgX";break;case te:n="Neutral";break;case ee:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ti=new i;function Mi(){p.getLuminanceCoefficients(Ti);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ti.x.toFixed(4)}, ${Ti.y.toFixed(4)}, ${Ti.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function xi(e){return""!==e}function Ri(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Ai(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const bi=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ci(e){return e.replace(bi,Pi)}const Li=new Map;function Pi(e,t){let n=Cn[t];if(void 0===n){const e=Li.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Cn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ci(n)}const Ui=/#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 Di(e){return e.replace(Ui,wi)}function wi(e,t,n,r){let i="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(xi).join("\n"),v.length>0&&(v+="\n")):(g=[yi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",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 "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reversedDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","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","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#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_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(xi).join("\n"),v=[yi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",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 "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reversedDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==D?"#define TONE_MAPPING":"",n.toneMapping!==D?Cn.tonemapping_pars_fragment:"",n.toneMapping!==D?Si("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Cn.colorspace_pars_fragment,Ei("linearToOutputTexel",n.outputColorSpace),Mi(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(xi).join("\n")),s=Ci(s),s=Ri(s,n),s=Ai(s,n),l=Ci(l),l=Ri(l,n),l=Ai(l,n),s=Di(s),l=Di(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#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"+v);const S=E+g+s,T=E+v+l,M=hi(i,i.VERTEX_SHADER,S),x=hi(i,i.FRAGMENT_SHADER,T);function R(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(_)||"",r=i.getShaderInfoLog(M)||"",a=i.getShaderInfoLog(x)||"",o=n.trim(),s=r.trim(),l=a.trim();let c=!0,d=!0;if(!1===i.getProgramParameter(_,i.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(i,_,M,x);else{const e=vi(i,M,"vertex"),n=vi(i,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(_,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?console.warn("THREE.WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:g},fragmentShader:{log:l,prefix:v}})}i.deleteShader(M),i.deleteShader(x),A=new mi(i,_),b=function(e,t){const n={},r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,re=o.transmission>0,ie=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,_e=!!o.specularMap,ge=!!o.specularColorMap,ve=!!o.specularIntensityMap,Ee=re&&!!o.transmissionMap,Se=re&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Re=!!o.alphaHash,Ae=!!o.extensions;let be=D;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:w,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:G,batchingColor:G&&null!==T._colorsTexture,instancing:H,instancingColor:H&&null!==T.instanceColor,instancingMorph:H&&null!==T.morphTexture,supportsVertexTextures:_,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:z,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:W,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:_&&q,emissiveMap:j,normalMapObjectSpace:K&&o.normalMapType===he,normalMapTangentSpace:K&&o.normalMapType===me,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:_e,specularColorMap:ge,specularIntensityMap:ve,transmission:re,transmissionMap:Ee,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Re,combine:o.combine,mapUv:V&&E(o.map.channel),aoMapUv:W&&E(o.aoMap.channel),lightMapUv:X&&E(o.lightMap.channel),bumpMapUv:Y&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:q&&E(o.displacementMap.channel),emissiveMapUv:j&&E(o.emissiveMap.channel),metalnessMapUv:Z&&E(o.metalnessMap.channel),roughnessMapUv:$&&E(o.roughnessMap.channel),anisotropyMapUv:ie&&E(o.anisotropyMap.channel),clearcoatMapUv:ae&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&E(o.sheenRoughnessMap.channel),specularMapUv:_e&&E(o.specularMap.channel),specularColorMapUv:ge&&E(o.specularColorMap.channel),specularIntensityMapUv:ve&&E(o.specularIntensityMap.channel),transmissionMapUv:Ee&&E(o.transmissionMap.channel),thicknessMapUv:Se&&E(o.thicknessMap.channel),alphaMapUv:Me&&E(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:B,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:P,morphTextureStride:N,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:j&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===fe,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Ae&&!0===o.extensions.clipCullDistance&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===o.extensions.multiDraw||G)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);t.gradientMap&&l.enable(22);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reversedDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Pn[t];n=ue.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let r;for(let e=0,t=f.length;e0?r.push(d):!0===o.transparent?i.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?r.unshift(d):!0===o.transparent?i.unshift(d):n.unshift(d)},finish:function(){for(let n=t,r=e.length;n1&&n.sort(e||Gi),r.length>1&&r.sort(t||Vi),i.length>1&&i.sort(t||Vi)}}}function ki(){let e=new WeakMap;return{get:function(t,n){const r=e.get(t);let i;return void 0===r?(i=new zi,e.set(t,[i])):n>=r.length?(i=new zi,r.push(i)):i=r[n],i},dispose:function(){e=new WeakMap}}}function Wi(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let r;switch(t.type){case"DirectionalLight":r={direction:new i,color:new n};break;case"SpotLight":r={position:new i,direction:new i,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":r={position:new i,color:new n,distance:0,decay:0};break;case"HemisphereLight":r={direction:new i,skyColor:new n,groundColor:new n};break;case"RectAreaLight":r={color:new n,position:new i,halfWidth:new i,halfHeight:new i}}return e[t.id]=r,r}}}let Xi=0;function Yi(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Ki(e){const n=new Wi,r=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let r;switch(n.type){case"DirectionalLight":case"SpotLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=r,r}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new i);const o=new i,s=new f,l=new f;return{setup:function(t){let i=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(Yi);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Ln.LTC_FLOAT_1,a.rectAreaLTC2=Ln.LTC_FLOAT_2):(a.rectAreaLTC1=Ln.LTC_HALF_1,a.rectAreaLTC2=Ln.LTC_HALF_2)),a.ambient[0]=i,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=Xi++)},setupView:function(e,t){let n=0,r=0,i=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=i.length?(a=new qi(e),i.push(a)):a=i[r],a},dispose:function(){t=new WeakMap}}}function Zi(e,n,r){let i=new ge;const a=new t,s=new t,d=new k,u=new ve({depthPacking:Ee}),f=new Se,p={},m=r.maxTextureSize,h={[_]:c,[c]:_,[fe]:fe},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},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 \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new N;E.setAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=$;let M=this.type;function x(t,r){const i=n.update(S);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(r,null,i,g,S,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(r,null,i,v,S,null)}function R(t,n,r,i){let a=null;const o=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===r.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let r=p[e];void 0===r&&(r={},p[e]=r);let i=r[t];void 0===i&&(i=a.clone(),r[t]=i,n.addEventListener("dispose",b)),a=i}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=i===J?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(t,r,a,o,s){if(!1===t.visible)return;if(t.layers.test(r.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===J)&&(!t.frustumCulled||i.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const i=n.update(t),l=t.material;if(Array.isArray(l)){const n=i.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==J?{minFilter:Te,magFilter:Te}:{};null!==c.map&&c.map.dispose(),c.map=new I(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),i=c.getFrustum(),A(n,r,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===J&&x(c,r),c.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const $i={[Ke]:Ye,[Xe]:ze,[We]:Ve,[Me]:ke,[Ye]:Ke,[ze]:Xe,[Ve]:We,[ke]:Me};function Qi(e,t){const r=new function(){let t=!1;const n=new k;let r=null;const i=new k(0,0,0,0);return{setMask:function(n){r===n||t||(e.colorMask(n,n,n,n),r=n)},setLocked:function(e){t=e},setClear:function(t,r,a,o,s){!0===s&&(t*=o,r*=o,a*=o),n.set(t,r,a,o),!1===i.equals(n)&&(e.clearColor(t,r,a,o),i.copy(n))},reset:function(){t=!1,r=null,i.set(-1,0,0,0)}}},i=new function(){let n=!1,r=!1,i=null,a=null,o=null;return{setReversed:function(e){if(r!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),r=e;const i=o;o=null,this.setClear(i)}},getReversed:function(){return r},setTest:function(t){t?W(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){i===t||n||(e.depthMask(t),i=t)},setFunc:function(t){if(r&&(t=$i[t]),a!==t){switch(t){case Ke:e.depthFunc(e.NEVER);break;case Ye:e.depthFunc(e.ALWAYS);break;case Xe:e.depthFunc(e.LESS);break;case Me:e.depthFunc(e.LEQUAL);break;case We:e.depthFunc(e.EQUAL);break;case ke:e.depthFunc(e.GEQUAL);break;case ze:e.depthFunc(e.GREATER);break;case Ve:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(r&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,i=null,a=null,o=null,r=!1}}},a=new function(){let t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?W(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(r){n===r||t||(e.stencilMask(r),n=r)},setFunc:function(t,n,o){r===t&&i===n&&a===o||(e.stencilFunc(t,n,o),r=t,i=n,a=o)},setOp:function(t,n,r){o===t&&s===n&&l===r||(e.stencilOp(t,n,r),o=t,s=n,l=r)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,P=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(I)[1]),D=w>=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,O={};const F=e.getParameter(e.SCISSOR_BOX),B=e.getParameter(e.VIEWPORT),H=(new k).fromArray(F),G=(new k).fromArray(B);function V(t,n,r,i){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||i.height>n)&&(r=n/Math.max(i.width,i.height)),r<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(r*i.width),a=Math.floor(r*i.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+")."),e}return e}function E(e){return e.generateMipmaps}function x(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function A(t,r,i,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=r;if(r===e.RED&&(i===e.FLOAT&&(s=e.R32F),i===e.HALF_FLOAT&&(s=e.R16F),i===e.UNSIGNED_BYTE&&(s=e.R8)),r===e.RED_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.R8UI),i===e.UNSIGNED_SHORT&&(s=e.R16UI),i===e.UNSIGNED_INT&&(s=e.R32UI),i===e.BYTE&&(s=e.R8I),i===e.SHORT&&(s=e.R16I),i===e.INT&&(s=e.R32I)),r===e.RG&&(i===e.FLOAT&&(s=e.RG32F),i===e.HALF_FLOAT&&(s=e.RG16F),i===e.UNSIGNED_BYTE&&(s=e.RG8)),r===e.RG_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RG8UI),i===e.UNSIGNED_SHORT&&(s=e.RG16UI),i===e.UNSIGNED_INT&&(s=e.RG32UI),i===e.BYTE&&(s=e.RG8I),i===e.SHORT&&(s=e.RG16I),i===e.INT&&(s=e.RG32I)),r===e.RGB_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGB8UI),i===e.UNSIGNED_SHORT&&(s=e.RGB16UI),i===e.UNSIGNED_INT&&(s=e.RGB32UI),i===e.BYTE&&(s=e.RGB8I),i===e.SHORT&&(s=e.RGB16I),i===e.INT&&(s=e.RGB32I)),r===e.RGBA_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),i===e.UNSIGNED_INT&&(s=e.RGBA32UI),i===e.BYTE&&(s=e.RGBA8I),i===e.SHORT&&(s=e.RGBA16I),i===e.INT&&(s=e.RGBA32I)),r===e.RGB&&i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.RGBA){const t=o?se:p.getTransfer(a);i===e.FLOAT&&(s=e.RGBA32F),i===e.HALF_FLOAT&&(s=e.RGBA16F),i===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),i===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function b(t,n){let r;return t?null===n||n===Tt||n===Mt?r=e.DEPTH24_STENCIL8:n===T?r=e.DEPTH32F_STENCIL8:n===xt&&(r=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Tt||n===Mt?r=e.DEPTH_COMPONENT24:n===T?r=e.DEPTH_COMPONENT32F:n===xt&&(r=e.DEPTH_COMPONENT16),r}function C(e,t){return!0===E(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==B?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=h.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&U(e),0===Object.keys(r).length&&h.delete(n)}i.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=i.get(t);t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let r=0;r0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void V(a,t,n);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);r.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[at]:e.REPEAT,[it]:e.CLAMP_TO_EDGE,[rt]:e.MIRRORED_REPEAT},I={[Te]:e.NEAREST,[ct]:e.NEAREST_MIPMAP_NEAREST,[lt]:e.NEAREST_MIPMAP_LINEAR,[B]:e.LINEAR,[st]:e.LINEAR_MIPMAP_NEAREST,[ot]:e.LINEAR_MIPMAP_LINEAR},N={[_t]:e.NEVER,[ht]:e.ALWAYS,[mt]:e.LESS,[K]:e.LEQUAL,[pt]:e.EQUAL,[ft]:e.GEQUAL,[ut]:e.GREATER,[dt]:e.NOTEQUAL};function O(t,r){if(r.type!==T||!1!==n.has("OES_texture_float_linear")||r.magFilter!==B&&r.magFilter!==st&&r.magFilter!==lt&&r.magFilter!==ot&&r.minFilter!==B&&r.minFilter!==st&&r.minFilter!==lt&&r.minFilter!==ot||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,y[r.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,y[r.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,y[r.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,I[r.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,I[r.minFilter]),r.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,N[r.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(r.magFilter===Te)return;if(r.minFilter!==lt&&r.minFilter!==ot)return;if(r.type===T&&!1===n.has("OES_texture_float_linear"))return;if(r.anisotropy>1||i.get(r).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(r.anisotropy,a.getMaxAnisotropy())),i.get(r).__currentAnisotropy=r.anisotropy}}}function H(t,n){let r=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const i=n.source;let a=h.get(i);void 0===a&&(a={},h.set(i,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,r=!0),a[o].usedTimes++;const i=a[t.__cacheKey];void 0!==i&&(a[t.__cacheKey].usedTimes--,0===i.usedTimes&&U(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return r}function G(e,t,n){return Math.floor(Math.floor(e/n)/t)}function V(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=H(t,n),d=n.source;r.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=i.get(d);if(d.version!==u.__version||!0===c){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=$(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,S=A(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);O(l,n);const T=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,P=d.dataReady,U=C(n,m);if(n.isDepthTexture)S=b(n.format===vt,n.type),L&&(R?r.texStorage2D(e.TEXTURE_2D,1,S,m.width,m.height):r.texImage2D(e.TEXTURE_2D,0,S,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(T.length>0){R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,n=T.length;te.start-t.start);let s=0;for(let e=1;e0){const i=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*i/g.data.BYTES_PER_ELEMENT,(a+1)*i/g.data.BYTES_PER_ELEMENT);r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else r.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?P&&r.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):r.texImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,i=T.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const i of n.layerUpdates){const n=m.data.subarray(i*t/m.data.BYTES_PER_ELEMENT,(i+1)*t/m.data.BYTES_PER_ELEMENT);r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else r.texImage3D(e.TEXTURE_2D_ARRAY,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&r.texStorage3D(e.TEXTURE_3D,U,S,m.width,m.height,m.depth),P&&r.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):r.texImage3D(e.TEXTURE_3D,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)r.texStorage2D(e.TEXTURE_2D,U,S,m.width,m.height);else{let t=m.width,n=m.height;for(let i=0;i>=1,n>>=1}}else if(T.length>0){if(R&&L){const t=Q(T[0]);r.texStorage2D(e.TEXTURE_2D,U,S,t.width,t.height)}for(let t=0,n=T.length;t>d),i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?r.texImage3D(c,d,p,t,i,n.depth,0,u,f,null):r.texImage2D(c,d,p,t,i,0,u,f,null)}r.bindFramebuffer(e.FRAMEBUFFER,t),Z(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,j(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),r.bindFramebuffer(e.FRAMEBUFFER,null)}function k(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const i=n.depthTexture,a=i&&i.isDepthTexture?i.type:null,o=b(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=j(n);Z(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let i=0;i{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer){if(a)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?W(n.__webglFramebuffer[0],t):W(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]),void 0===n.__webglDepthbuffer[i])n.__webglDepthbuffer[i]=e.createRenderbuffer(),k(n.__webglDepthbuffer[i],t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,a)}}else{const i=t.texture.mipmaps;if(i&&i.length>0?r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),k(n.__webglDepthbuffer,t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,i)}}r.bindFramebuffer(e.FRAMEBUFFER,null)}const Y=[],q=[];function j(e){return Math.min(a.maxSamples,e.samples)}function Z(e){const t=i.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function $(e,t){const n=e.colorSpace,r=e.format,i=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==gt&&(p.getTransfer(n)===m?r===M&&i===S||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Q(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=D;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),D+=1,e},this.resetTextureUnits=function(){D=0},this.setTexture2D=w,this.setTexture2DArray=function(t,n){const a=i.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?V(a,t,n):r.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=i.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?V(a,t,n):r.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=i.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=H(t,n),c=n.source;r.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=i.get(c);if(c.version!==d.__version||!0===l){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=$(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),S=o.convert(n.type),T=A(n.internalFormat,g,S,n.colorSpace),R=!0!==n.isVideoTexture,b=void 0===d.__version||!0===l,L=c.dataReady;let P,U=C(n,_);if(O(e.TEXTURE_CUBE_MAP,n),f){R&&b&&r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,_.width,_.height);for(let t=0;t<6;t++){P=h[t].mipmaps;for(let i=0;i0&&U++;const t=Q(h[0]);r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&r.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,S,h[t].data):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,T,h[t].width,h[t].height,0,g,S,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let r=0;r0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===Z(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],r.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let r=0;r0)if(!1===Z(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=i.get(t),u=n.length>1;if(u)for(let t=0;t0?r.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):r.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let r=0;r= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class ra extends _n{constructor(e,n){super();const r=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _=new na,g={},v=n.getContextAttributes();let E=null,T=null;const x=[],R=[],A=new t;let b=null;const C=new U;C.viewport=new k;const L=new U;L.viewport=new k;const P=[C,L],D=new gn;let w=null,y=null;function N(e){const t=R.indexOf(e.inputSource);if(-1===t)return;const n=x[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function O(){a.removeEventListener("select",N),a.removeEventListener("selectstart",N),a.removeEventListener("selectend",N),a.removeEventListener("squeeze",N),a.removeEventListener("squeezestart",N),a.removeEventListener("squeezeend",N),a.removeEventListener("end",O),a.removeEventListener("inputsourceschange",F);for(let e=0;e=0&&(R[r]=null,x[r].disconnect(n))}for(let t=0;t=R.length){R.push(n),r=e;break}if(null===R[e]){R[e]=n,r=e;break}}if(-1===r)break}const i=x[r];i&&i.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getGripSpace()},this.getHand=function(e){let t=x[e];return void 0===t&&(t=new vn,x[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){E=e.getRenderTarget(),a.addEventListener("select",N),a.addEventListener("selectstart",N),a.addEventListener("selectend",N),a.addEventListener("squeeze",N),a.addEventListener("squeezestart",N),a.addEventListener("squeezeend",N),a.addEventListener("end",O),a.addEventListener("inputsourceschange",F),!0!==v.xrCompatible&&await n.makeXRCompatible(),b=e.getPixelRatio(),e.getSize(A),"undefined"!=typeof XRWebGLBinding&&(f=new XRWebGLBinding(a,n));if(null!==f&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,r=null,i=null;v.depth&&(i=v.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=v.stencil?vt:St,r=v.stencil?Mt:Tt);const s={colorFormat:n.RGBA8,depthFormat:i,scaleFactor:o};p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),T=new I(p.textureWidth,p.textureHeight,{format:M,type:S,depthTexture:new q(p.textureWidth,p.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:v.stencil,colorSpace:e.outputColorSpace,samples:v.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:v.antialias,alpha:!0,depth:v.depth,stencil:v.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),T=new I(m.framebufferWidth,m.framebufferHeight,{format:M,type:S,colorSpace:e.outputColorSpace,stencilBuffer:v.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}T.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return _.getDepthTexture()};const B=new i,H=new i;function G(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==_.texture&&(_.depthNear>0&&(t=_.depthNear),_.depthFar>0&&(n=_.depthFar)),D.near=L.near=C.near=t,D.far=L.far=C.far=n,w===D.near&&y===D.far||(a.updateRenderState({depthNear:D.near,depthFar:D.far}),w=D.near,y=D.far),D.layers.mask=6|e.layers.mask,C.layers.mask=3&D.layers.mask,L.layers.mask=5&D.layers.mask;const r=e.parent,i=D.cameras;G(D,r);for(let e=0;e0&&(e.alphaTest.value=r.alphaTest);const i=t.get(r),a=i.envMap,o=i.envMapRotation;a&&(e.envMap.value=a,ia.copy(o),ia.x*=-1,ia.y*=-1,ia.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(ia.y*=-1,ia.z*=-1),e.envMapRotation.value.setFromMatrix4(aa.makeRotationFromEuler(ia)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=r.reflectivity,e.ior.value=r.ior,e.refractionRatio.value=r.refractionRatio),r.lightMap&&(e.lightMap.value=r.lightMap,e.lightMapIntensity.value=r.lightMapIntensity,n(r.lightMap,e.lightMapTransform)),r.aoMap&&(e.aoMap.value=r.aoMap,e.aoMapIntensity.value=r.aoMapIntensity,n(r.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,i,a,o,s){i.isMeshBasicMaterial||i.isMeshLambertMaterial?r(e,i):i.isMeshToonMaterial?(r(e,i),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,i)):i.isMeshPhongMaterial?(r(e,i),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,i)):i.isMeshStandardMaterial?(r(e,i),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,i),i.isMeshPhysicalMaterial&&function(e,t,r){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=r.texture,e.transmissionSamplerSize.value.set(r.width,r.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,i,s)):i.isMeshMatcapMaterial?(r(e,i),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,i)):i.isMeshDepthMaterial?r(e,i):i.isMeshDistanceMaterial?(r(e,i),function(e,n){const r=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(r.matrixWorld),e.nearDistance.value=r.shadow.camera.near,e.farDistance.value=r.shadow.camera.far}(e,i)):i.isMeshNormalMaterial?r(e,i):i.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,i),i.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,i)):i.isPointsMaterial?function(e,t,r,i){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*r,e.scale.value=.5*i,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i,a,o):i.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i):i.isShadowMaterial?(e.color.value.copy(i.color),e.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function sa(e,t,n,r){let i={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,r){const i=e.value,a=t+"_"+n;if(void 0===r[a])return r[a]="number"==typeof i||"boolean"==typeof i?i:i.clone(),!0;{const e=r[a];if("number"==typeof i||"boolean"==typeof i){if(e!==i)return r[a]=i,!0}else if(!1===e.equals(i))return e.copy(i),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const r=o.indexOf(n.__bindingPointIndex);o.splice(r,1),e.deleteBuffer(i[n.id]),delete i[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;r.uniformBlockBinding(e,n)},update:function(n,u){let f=i[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const r=16;for(let e=0,i=t.length;e0&&(n+=r-i);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=D;r.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(m=C.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=ue.get(r),v=R.state.lights;if(!0===J&&(!0===ee||e!==N)){const t=e===N&&r.id===y;Re.setState(r,e,t)}let E=!1;r.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||i.isBatchedMesh&&!1===g.batching?E=!0:i.isBatchedMesh||!0!==g.batching?i.isBatchedMesh&&!0===g.batchingColor&&null===i.colorTexture||i.isBatchedMesh&&!1===g.batchingColor&&null!==i.colorTexture||i.isInstancedMesh&&!1===g.instancing?E=!0:i.isInstancedMesh||!0!==g.instancing?i.isSkinnedMesh&&!1===g.skinning?E=!0:i.isSkinnedMesh||!0!==g.skinning?i.isInstancedMesh&&!0===g.instancingColor&&null===i.instanceColor||i.isInstancedMesh&&!1===g.instancingColor&&null!==i.instanceColor||i.isInstancedMesh&&!0===g.instancingMorph&&null===i.morphTexture||i.isInstancedMesh&&!1===g.instancingMorph&&null!==i.morphTexture||g.envMap!==l||!0===r.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Re.numPlanes&&g.numIntersection===Re.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=r.version);let S=g.currentProgram;!0===E&&(S=$e(r,t,i));let T=!1,M=!1,x=!1;const A=S.getUniforms(),b=g.uniforms;ce.useProgram(S.program)&&(T=!0,M=!0,x=!0);r.id!==y&&(y=r.id,M=!0);if(T||N!==e){ce.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),A.setValue(ye,"projectionMatrix",e.projectionMatrix),A.setValue(ye,"viewMatrix",e.matrixWorldInverse);const t=A.map.cameraPosition;void 0!==t&&t.setValue(ye,ne.setFromMatrixPosition(e.matrixWorld)),le.logarithmicDepthBuffer&&A.setValue(ye,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(r.isMeshPhongMaterial||r.isMeshToonMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial)&&A.setValue(ye,"isOrthographic",!0===e.isOrthographicCamera),N!==e&&(N=e,M=!0,x=!0)}if(i.isSkinnedMesh){A.setOptional(ye,i,"bindMatrix"),A.setOptional(ye,i,"bindMatrixInverse");const e=i.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(ye,"boneTexture",e.boneTexture,pe))}i.isBatchedMesh&&(A.setOptional(ye,i,"batchingTexture"),A.setValue(ye,"batchingTexture",i._matricesTexture,pe),A.setOptional(ye,i,"batchingIdTexture"),A.setValue(ye,"batchingIdTexture",i._indirectTexture,pe),A.setOptional(ye,i,"batchingColorTexture"),null!==i._colorsTexture&&A.setValue(ye,"batchingColorTexture",i._colorsTexture,pe));const L=n.morphAttributes;void 0===L.position&&void 0===L.normal&&void 0===L.color||Ce.update(i,n,S);(M||g.receiveShadow!==i.receiveShadow)&&(g.receiveShadow=i.receiveShadow,A.setValue(ye,"receiveShadow",i.receiveShadow));r.isMeshGouraudMaterial&&null!==r.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);r.isMeshStandardMaterial&&null===r.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);M&&(A.setValue(ye,"toneMappingExposure",C.toneMappingExposure),g.needsLights&&(U=x,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===r.fog&&Te.refreshFogUniforms(b,a),Te.refreshMaterialUniforms(b,r,Y,X,R.state.transmissionRenderTarget[e.id]),mi.upload(ye,Qe(g),b,pe));var P,U;r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(mi.upload(ye,Qe(g),b,pe),r.uniformsNeedUpdate=!1);r.isSpriteMaterial&&A.setValue(ye,"center",i.center);if(A.setValue(ye,"modelViewMatrix",i.modelViewMatrix),A.setValue(ye,"normalMatrix",i.normalMatrix),A.setValue(ye,"modelMatrix",i.matrixWorld),r.isShaderMaterial||r.isRawShaderMaterial){const e=r.uniformsGroups;for(let t=0,n=e.length;t{function n(){r.forEach(function(e){ue.get(e).currentProgram.isReady()&&r.delete(e)}),0!==r.size?setTimeout(n,10):t(e)}null!==se.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let ze=null;function ke(){Xe.stop()}function We(){Xe.start()}const Xe=new An;function Ye(e,t,n,r){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){r&&re.setFromMatrixPosition(e.matrixWorld).applyMatrix4(te);const t=Ee.update(e),i=e.material;i.visible&&x.push(e,t,i,n,re.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=Ee.update(e),i=e.material;if(r&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),re.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),re.copy(t.boundingSphere.center)),re.applyMatrix4(e.matrixWorld).applyMatrix4(te)),Array.isArray(i)){const r=t.groups;for(let a=0,o=r.length;a0&&je(i,t,n),a.length>0&&je(a,t,n),o.length>0&&je(o,t,n),ce.buffers.depth.setTest(!0),ce.buffers.depth.setMask(!0),ce.buffers.color.setMask(!0),ce.setPolygonOffset(!1)}function qe(e,t,n,r){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[r.id]&&(R.state.transmissionRenderTarget[r.id]=new I(1,1,{generateMipmaps:!0,type:se.has("EXT_color_buffer_half_float")||se.has("EXT_color_buffer_float")?E:S,minFilter:ot,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const i=R.state.transmissionRenderTarget[r.id],a=r.viewport||O;i.setSize(a.z*C.transmissionResolutionScale,a.w*C.transmissionResolutionScale);const s=C.getRenderTarget(),l=C.getActiveCubeFace(),d=C.getActiveMipmapLevel();C.setRenderTarget(i),C.getClearColor(V),z=C.getClearAlpha(),z<1&&C.setClearColor(16777215,.5),C.clear(),ae&&be.render(n);const u=C.toneMapping;C.toneMapping=D;const f=r.viewport;if(void 0!==r.viewport&&(r.viewport=void 0),R.setupLightsView(r),!0===J&&Re.setGlobalState(C.clippingPlanes,r),je(e,n,r),pe.updateMultisampleRenderTarget(i),pe.updateRenderTargetMipmap(i),!1===se.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let i=0,a=t.length;i0)for(let t=0,a=n.length;t0&&qe(r,i,e,t),ae&&be.render(e),Ke(x,e,t);null!==w&&0===U&&(pe.updateMultisampleRenderTarget(w),pe.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(C,e,t),De.resetDefaultState(),y=-1,N=null,b.pop(),b.length>0?(R=b[b.length-1],!0===J&&Re.setGlobalState(C.clippingPlanes,R.state.camera)):R=null,A.pop(),x=A.length>0?A[A.length-1]:null},this.getActiveCubeFace=function(){return P},this.getActiveMipmapLevel=function(){return U},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){const r=ue.get(e);r.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===r.__autoAllocateDepthBuffer&&(r.__useRenderToTexture=!1),ue.get(e.texture).__webglTexture=t,ue.get(e.depthTexture).__webglTexture=r.__autoAllocateDepthBuffer?void 0:n,r.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=ue.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const et=ye.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){w=e,P=t,U=n;let r=!0,i=null,a=!1,o=!1;if(e){const s=ue.get(e);if(void 0!==s.__useDefaultFramebuffer)ce.bindFramebuffer(ye.FRAMEBUFFER,null),r=!1;else if(void 0===s.__webglFramebuffer)pe.setupRenderTarget(e);else if(s.__hasExternalTextures)pe.rebindTextures(e,ue.get(e.texture).__webglTexture,ue.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&ue.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");pe.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=ue.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(c[t])?c[t][n]:c[t],a=!0):i=e.samples>0&&!1===pe.useMultisampledRTT(e)?ue.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,O.copy(e.viewport),B.copy(e.scissor),G=e.scissorTest}else O.copy(j).multiplyScalar(Y).floor(),B.copy(Z).multiplyScalar(Y).floor(),G=$;0!==n&&(i=et);if(ce.bindFramebuffer(ye.FRAMEBUFFER,i)&&r&&ce.drawBuffers(e,i),ce.viewport(O),ce.scissor(B),ce.setScissorTest(G),a){const r=ue.get(e.texture);ye.framebufferTexture2D(ye.FRAMEBUFFER,ye.COLOR_ATTACHMENT0,ye.TEXTURE_CUBE_MAP_POSITIVE_X+t,r.__webglTexture,n)}else if(o){const r=t;for(let t=0;t=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&(e.textures.length>1&&ye.readBuffer(ye.COLOR_ATTACHMENT0+s),ye.readPixels(t,n,r,i,Ue.convert(l),Ue.convert(c),a))}finally{const e=null!==w?ue.get(w).__webglFramebuffer:null;ce.bindFramebuffer(ye.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,r,i,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=ue.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i){ce.bindFramebuffer(ye.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!le.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!le.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ye.createBuffer();ye.bindBuffer(ye.PIXEL_PACK_BUFFER,u),ye.bufferData(ye.PIXEL_PACK_BUFFER,a.byteLength,ye.STREAM_READ),e.textures.length>1&&ye.readBuffer(ye.COLOR_ATTACHMENT0+s),ye.readPixels(t,n,r,i,Ue.convert(c),Ue.convert(d),0);const f=null!==w?ue.get(w).__webglFramebuffer:null;ce.bindFramebuffer(ye.FRAMEBUFFER,f);const p=ye.fenceSync(ye.SYNC_GPU_COMMANDS_COMPLETE,0);return ye.flush(),await Rn(ye,p,4),ye.bindBuffer(ye.PIXEL_PACK_BUFFER,u),ye.getBufferSubData(ye.PIXEL_PACK_BUFFER,0,a),ye.deleteBuffer(u),ye.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=null!==t?t.x:0,s=null!==t?t.y:0;pe.setTexture2D(e,0),ye.copyTexSubImage2D(ye.TEXTURE_2D,n,0,0,o,s,i,a),ce.unbindTexture()};const tt=ye.createFramebuffer(),nt=ye.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,r=null,i=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==i?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=i,i=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-i);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==r?(f=r.x,p=r.y,m=r.z):(f=0,p=0,m=0);const _=Ue.convert(t.format),g=Ue.convert(t.type);let v;t.isData3DTexture?(pe.setTexture3D(t,0),v=ye.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(pe.setTexture2DArray(t,0),v=ye.TEXTURE_2D_ARRAY):(pe.setTexture2D(t,0),v=ye.TEXTURE_2D),ye.pixelStorei(ye.UNPACK_FLIP_Y_WEBGL,t.flipY),ye.pixelStorei(ye.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ye.pixelStorei(ye.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ye.getParameter(ye.UNPACK_ROW_LENGTH),S=ye.getParameter(ye.UNPACK_IMAGE_HEIGHT),T=ye.getParameter(ye.UNPACK_SKIP_PIXELS),M=ye.getParameter(ye.UNPACK_SKIP_ROWS),x=ye.getParameter(ye.UNPACK_SKIP_IMAGES);ye.pixelStorei(ye.UNPACK_ROW_LENGTH,h.width),ye.pixelStorei(ye.UNPACK_IMAGE_HEIGHT,h.height),ye.pixelStorei(ye.UNPACK_SKIP_PIXELS,c),ye.pixelStorei(ye.UNPACK_SKIP_ROWS,d),ye.pixelStorei(ye.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=ue.get(e),r=ue.get(t),h=ue.get(n.__renderTarget),_=ue.get(r.__renderTarget);ce.bindFramebuffer(ye.READ_FRAMEBUFFER,h.__webglFramebuffer),ce.bindFramebuffer(ye.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n { + let value; + if ( target[ property ] === undefined ) { - return target[ index ++ ]; + value = target[ index ++ ]; } else { - return Reflect.get( target, property, receiver ); + value = Reflect.get( target, property, receiver ); } + return value; + } + } ); } + const secureNodeBuilder = new Proxy( builder, { + + get: ( target, property, receiver ) => { + + let value; + + if ( Symbol.iterator === property ) { + + value = function* () { + + yield undefined; + + }; + + } else { + + value = Reflect.get( target, property, receiver ); + + } + + return value; + + } + + } ); + const jsFunc = shaderNode.jsFunc; - const outputNode = inputs !== null || jsFunc.length > 1 ? jsFunc( inputs || [], builder ) : jsFunc( builder ); + const outputNode = inputs !== null || jsFunc.length > 1 ? jsFunc( inputs || [], secureNodeBuilder ) : jsFunc( secureNodeBuilder ); result = nodeObject( outputNode ); @@ -3732,6 +3774,18 @@ const ConvertType = function ( type, cacheMap = null ) { return ( ...params ) => { + for ( const param of params ) { + + if ( param === undefined ) { + + console.error( `THREE.TSL: Invalid parameter for the type "${ type }".` ); + + return nodeObject( new ConstNode( 0, type ) ); + + } + + } + if ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => { const paramType = typeof param; @@ -3913,7 +3967,7 @@ class FnNode extends Node { const type = this.getNodeType( builder ); - console.warn( 'THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' ); + console.error( 'THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' ); return builder.generateConst( type ); @@ -4780,16 +4834,24 @@ class UniformNode extends InputNode { * * @tsl * @function - * @param {any} arg1 - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color, texture). - * @param {string} [arg2] - The node type. If no explicit type is defined, the node tries to derive the type from its value. + * @param {any|string} value - The value of this uniform or your type. Usually a JS primitive or three.js object (vector, matrix, color, texture). + * @param {string} [type] - The node type. If no explicit type is defined, the node tries to derive the type from its value. * @returns {UniformNode} */ -const uniform = ( arg1, arg2 ) => { +const uniform = ( value, type ) => { + + const nodeType = getConstNodeType( type || value ); + + if ( nodeType === value ) { + + // if the value is a type but no having a value - const nodeType = getConstNodeType( arg2 || arg1 ); + value = getValueFromType( nodeType ); + + } // @TODO: get ConstNode from .traverse() in the future - const value = ( arg1 && arg1.isNode === true ) ? ( arg1.node && arg1.node.value ) || arg1.value : arg1; + value = ( value && value.isNode === true ) ? ( value.node && value.node.value ) || value.value : value; return nodeObject( new UniformNode( value, nodeType ) ); @@ -5055,11 +5117,10 @@ class AssignNode extends TempNode { const needsSplitAssign = this.needsSplitAssign( builder ); + const target = targetNode.build( builder ); const targetType = targetNode.getNodeType( builder ); - const target = targetNode.build( builder ); const source = sourceNode.build( builder, targetType ); - const sourceType = sourceNode.getNodeType( builder ); const nodeData = builder.getDataFromNode( this ); @@ -7309,10 +7370,12 @@ class ConditionalNode extends Node { // + const isUniformFlow = builder.context.uniformFlow; + const properties = builder.getNodeProperties( this ); properties.condNode = condNode; - properties.ifNode = ifNode.context( { nodeBlock: ifNode } ); - properties.elseNode = elseNode ? elseNode.context( { nodeBlock: elseNode } ) : null; + properties.ifNode = isUniformFlow ? ifNode : ifNode.context( { nodeBlock: ifNode } ); + properties.elseNode = elseNode ? ( isUniformFlow ? elseNode : elseNode.context( { nodeBlock: elseNode } ) ) : null; } @@ -7337,6 +7400,20 @@ class ConditionalNode extends Node { nodeData.nodeProperty = nodeProperty; const nodeSnippet = condNode.build( builder, 'bool' ); + const isUniformFlow = builder.context.uniformFlow; + + if ( isUniformFlow && elseNode !== null ) { + + const ifSnippet = ifNode.build( builder, type ); + const elseSnippet = elseNode.build( builder, type ); + + const mathSnippet = builder.getTernary( nodeSnippet, ifSnippet, elseSnippet ); + + // TODO: If node property already exists return something else + + return builder.format( mathSnippet, type, output ); + + } builder.addFlowCode( `\n${ builder.tab }if ( ${ nodeSnippet } ) {\n\n` ).addFlowTab(); @@ -7550,6 +7627,16 @@ class ContextNode extends Node { */ const context = /*@__PURE__*/ nodeProxy( ContextNode ).setParameterLength( 1, 2 ); +/** + * TSL function for defining a uniformFlow context value for a given node. + * + * @tsl + * @function + * @param {Node} node - The node whose dependencies should all execute within a uniform control-flow path. + * @returns {ContextNode} + */ +const uniformFlow = ( node ) => context( node, { uniformFlow: true } ); + /** * TSL function for defining a name for the context value for a given node. * @@ -7581,6 +7668,7 @@ function label( node, name ) { addMethodChaining( 'context', context ); addMethodChaining( 'label', label ); +addMethodChaining( 'uniformFlow', uniformFlow ); addMethodChaining( 'setName', setName ); /** @@ -30936,13 +31024,13 @@ class StackNode extends Node { getNodeType( builder ) { - return this.outputNode ? this.outputNode.getNodeType( builder ) : 'void'; + return this.hasOutput ? this.outputNode.getNodeType( builder ) : 'void'; } getMemberType( builder, name ) { - return this.outputNode ? this.outputNode.getMemberType( builder, name ) : 'void'; + return this.hasOutput ? this.outputNode.getMemberType( builder, name ) : 'void'; } @@ -30954,6 +31042,13 @@ class StackNode extends Node { */ add( node ) { + if ( node.isNode !== true ) { + + console.error( 'THREE.TSL: Invalid node added to stack.' ); + return this; + + } + this.nodes.push( node ); return this; @@ -31047,7 +31142,7 @@ class StackNode extends Node { } else { - throw new Error( 'TSL: Invalid parameter length. Case() requires at least two parameters.' ); + console.error( 'THREE.TSL: Invalid parameter length. Case() requires at least two parameters.' ); } @@ -31131,6 +31226,12 @@ class StackNode extends Node { } + get hasOutput() { + + return this.outputNode && this.outputNode.isNode; + + } + build( builder, ...params ) { const previousBuildStack = builder.currentStack; @@ -31181,7 +31282,19 @@ class StackNode extends Node { } - const result = this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params ); + // + + let result; + + if ( this.hasOutput ) { + + result = this.outputNode.build( builder, ...params ); + + } else { + + result = super.build( builder, ...params ); + + } setCurrentStack( previousStack ); @@ -43380,6 +43493,7 @@ var TSL = /*#__PURE__*/Object.freeze({ uniform: uniform, uniformArray: uniformArray, uniformCubeTexture: uniformCubeTexture, + uniformFlow: uniformFlow, uniformGroup: uniformGroup, uniformTexture: uniformTexture, unpremultiplyAlpha: unpremultiplyAlpha, @@ -45781,6 +45895,22 @@ class NodeBuilder { } + /** + * Returns the native snippet for a ternary operation. E.g. GLSL would output + * a ternary op as `cond ? x : y` whereas WGSL would output it as `select(y, x, cond)` + * + * @abstract + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( /* condSnippet, ifSnippet, elseSnippet*/ ) { + + return null; + + } + /** * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}. * @@ -46097,7 +46227,6 @@ class NodeBuilder { } - /** * Generates the shader string for the given type and value. * @@ -47876,11 +48005,6 @@ class NodeBuilder { } - /** - * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors. - */ - *[ Symbol.iterator ]() { } - } /** @@ -56502,6 +56626,20 @@ class GLSLNodeBuilder extends NodeBuilder { } + /** + * Returns the native snippet for a ternary operation. + * + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( condSnippet, ifSnippet, elseSnippet ) { + + return `${condSnippet} ? ${ifSnippet} : ${elseSnippet}`; + + } + /** * Returns the output struct name. Not relevant for GLSL. * @@ -69029,6 +69167,21 @@ ${ flowData.code } } + /** + * Returns the native snippet for a ternary operation. + * + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( condSnippet, ifSnippet, elseSnippet ) { + + return `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`; + + } + + /** * Returns the WGSL type of the given node data type. * diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index d031e3979982ed..3d222ab3cbaead 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,EventDispatcher as o,MathUtils as u,WebGLCoordinateSystem as l,WebGPUCoordinateSystem as d,ColorManagement as c,SRGBTransfer as h,NoToneMapping as p,StaticDrawUsage as g,InterleavedBuffer as m,InterleavedBufferAttribute as f,DynamicDrawUsage as y,NoColorSpace as b,Texture as x,UnsignedIntType as T,IntType as _,NearestFilter as v,Sphere as N,BackSide as S,DoubleSide as E,Euler as w,CubeTexture as A,CubeReflectionMapping as R,CubeRefractionMapping as C,TangentSpaceNormalMap as M,ObjectSpaceNormalMap as P,InstancedInterleavedBuffer as B,InstancedBufferAttribute as L,DataArrayTexture as F,FloatType as I,FramebufferTexture as D,LinearMipmapLinearFilter as V,DepthTexture as U,Material as O,NormalBlending as k,LineBasicMaterial as G,LineDashedMaterial as z,NoBlending as H,MeshNormalMaterial as $,SRGBColorSpace as W,WebGLCubeRenderTarget as q,BoxGeometry as j,Mesh as X,Scene as K,LinearFilter as Y,CubeCamera as Q,EquirectangularReflectionMapping as Z,EquirectangularRefractionMapping as J,AddOperation as ee,MixOperation as te,MultiplyOperation as re,MeshBasicMaterial as se,MeshLambertMaterial as ie,MeshPhongMaterial as ne,OrthographicCamera as ae,PerspectiveCamera as oe,RenderTarget as ue,LinearSRGBColorSpace as le,RGBAFormat as de,HalfFloatType as ce,CubeUVReflectionMapping as he,BufferGeometry as pe,BufferAttribute as ge,MeshStandardMaterial as me,MeshPhysicalMaterial as fe,MeshToonMaterial as ye,MeshMatcapMaterial as be,SpriteMaterial as xe,PointsMaterial as Te,ShadowMaterial as _e,Uint32BufferAttribute as ve,Uint16BufferAttribute as Ne,arrayNeedsUint32 as Se,Camera as Ee,DepthStencilFormat as we,DepthFormat as Ae,UnsignedInt248Type as Re,UnsignedByteType as Ce,Plane as Me,Object3D as Pe,LinearMipMapLinearFilter as Be,Float32BufferAttribute as Le,UVMapping as Fe,VSMShadowMap as Ie,LessCompare as De,RGFormat as Ve,BasicShadowMap as Ue,SphereGeometry as Oe,LinearMipmapNearestFilter as ke,NearestMipmapLinearFilter as Ge,Float16BufferAttribute as ze,REVISION as He,ArrayCamera as $e,PlaneGeometry as We,FrontSide as qe,CustomBlending as je,AddEquation as Xe,ZeroFactor as Ke,CylinderGeometry as Ye,Quaternion as Qe,WebXRController as Ze,RAD2DEG as Je,PCFShadowMap as et,FrustumArray as tt,Frustum as rt,DataTexture as st,RedIntegerFormat as it,RedFormat as nt,ShortType as at,ByteType as ot,UnsignedShortType as ut,RGIntegerFormat as lt,RGBIntegerFormat as dt,RGBFormat as ct,RGBAIntegerFormat as ht,warnOnce as pt,createCanvasElement as gt,ReverseSubtractEquation as mt,SubtractEquation as ft,OneMinusDstAlphaFactor as yt,OneMinusDstColorFactor as bt,OneMinusSrcAlphaFactor as xt,OneMinusSrcColorFactor as Tt,DstAlphaFactor as _t,DstColorFactor as vt,SrcAlphaSaturateFactor as Nt,SrcAlphaFactor as St,SrcColorFactor as Et,OneFactor as wt,CullFaceNone as At,CullFaceBack as Rt,CullFaceFront as Ct,MultiplyBlending as Mt,SubtractiveBlending as Pt,AdditiveBlending as Bt,NotEqualDepth as Lt,GreaterDepth as Ft,GreaterEqualDepth as It,EqualDepth as Dt,LessEqualDepth as Vt,LessDepth as Ut,AlwaysDepth as Ot,NeverDepth as kt,UnsignedShort4444Type as Gt,UnsignedShort5551Type as zt,UnsignedInt5999Type as Ht,AlphaFormat as $t,RGB_S3TC_DXT1_Format as Wt,RGBA_S3TC_DXT1_Format as qt,RGBA_S3TC_DXT3_Format as jt,RGBA_S3TC_DXT5_Format as Xt,RGB_PVRTC_4BPPV1_Format as Kt,RGB_PVRTC_2BPPV1_Format as Yt,RGBA_PVRTC_4BPPV1_Format as Qt,RGBA_PVRTC_2BPPV1_Format as Zt,RGB_ETC1_Format as Jt,RGB_ETC2_Format as er,RGBA_ETC2_EAC_Format as tr,RGBA_ASTC_4x4_Format as rr,RGBA_ASTC_5x4_Format as sr,RGBA_ASTC_5x5_Format as ir,RGBA_ASTC_6x5_Format as nr,RGBA_ASTC_6x6_Format as ar,RGBA_ASTC_8x5_Format as or,RGBA_ASTC_8x6_Format as ur,RGBA_ASTC_8x8_Format as lr,RGBA_ASTC_10x5_Format as dr,RGBA_ASTC_10x6_Format as cr,RGBA_ASTC_10x8_Format as hr,RGBA_ASTC_10x10_Format as pr,RGBA_ASTC_12x10_Format as gr,RGBA_ASTC_12x12_Format as mr,RGBA_BPTC_Format as fr,RED_RGTC1_Format as yr,SIGNED_RED_RGTC1_Format as br,RED_GREEN_RGTC2_Format as xr,SIGNED_RED_GREEN_RGTC2_Format as Tr,MirroredRepeatWrapping as _r,ClampToEdgeWrapping as vr,RepeatWrapping as Nr,NearestMipmapNearestFilter as Sr,NotEqualCompare as Er,GreaterCompare as wr,GreaterEqualCompare as Ar,EqualCompare as Rr,LessEqualCompare as Cr,AlwaysCompare as Mr,NeverCompare as Pr,LinearTransfer as Br,NotEqualStencilFunc as Lr,GreaterStencilFunc as Fr,GreaterEqualStencilFunc as Ir,EqualStencilFunc as Dr,LessEqualStencilFunc as Vr,LessStencilFunc as Ur,AlwaysStencilFunc as Or,NeverStencilFunc as kr,DecrementWrapStencilOp as Gr,IncrementWrapStencilOp as zr,DecrementStencilOp as Hr,IncrementStencilOp as $r,InvertStencilOp as Wr,ReplaceStencilOp as qr,ZeroStencilOp as jr,KeepStencilOp as Xr,MaxEquation as Kr,MinEquation as Yr,SpotLight as Qr,PointLight as Zr,DirectionalLight as Jr,RectAreaLight as es,AmbientLight as ts,HemisphereLight as rs,LightProbe as ss,LinearToneMapping as is,ReinhardToneMapping as ns,CineonToneMapping as as,ACESFilmicToneMapping as os,AgXToneMapping as us,NeutralToneMapping as ls,Group as ds,Loader as cs,FileLoader as hs,MaterialLoader as ps,ObjectLoader as gs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],fs=new WeakMap;class ys{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>bs(e),Ts=e=>bs(e),_s=(...e)=>bs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(bs(s.slice(0,-4)),i.getCacheKey(t));return bs(r)}function*Ns(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0)).buffer}var Ds=Object.freeze({__proto__:null,arrayBufferToBase64:Fs,base64ToArrayBuffer:Is,getByteBoundaryFromType:Ms,getCacheKey:vs,getDataFromObject:Ls,getLengthFromType:Rs,getMemoryLengthFromType:Cs,getNodeChildren:Ns,getTypeFromLength:ws,getTypedArrayFromType:As,getValueFromType:Bs,getValueType:Ps,hash:_s,hashArray:Ts,hashString:xs});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],Hs=[...Gs,"compute"],$s=["x","y","z","w"],Ws={analyze:"setup",generate:"analyze"};let qs=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:qs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of Ns(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=_s(vs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}getArrayCount(){return null}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e,t=null){const r=e.increaseUsage(this);if(!0===this.parents){const r=e.getDataFromNode(this,"any");r.stages=r.stages||{},r.stages[e.shaderStage]=r.stages[e.shaderStage]||[],r.stages[e.shaderStage].push(t)}if(1===r){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e,this)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);const s=e.getDataFromNode(this);s.buildStages=s.buildStages||{},s.buildStages[e.buildStage]=!0;const i=Ws[e.buildStage];if(i&&!0!==s.buildStages[i]){const t=e.getBuildStage();e.setBuildStage(i),this.build(e),e.setBuildStage(t)}e.addNode(this),e.addChain(this);let n=null;const a=e.getBuildStage();if("setup"===a){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0,t.outputNode=this.setup(e)||t.outputNode||null;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}}n=t.outputNode}else if("analyze"===a)this.analyze(e,t);else if("generate"===a){if(1===this.generate.length){const r=this.getNodeType(e),s=e.getDataFromNode(this);n=s.snippet,void 0===n?void 0===s.generated?(s.generated=!0,n=this.generate(e)||"",s.snippet=n):(console.warn("THREE.Node: Recursion detected.",this),n="/* Recursion detected. */"):void 0!==s.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),n=e.format(n,r,t)}else n=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),n}getSerializeChildren(){return Ns(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Xs extends js{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ks extends js{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Ys extends js{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Qs extends Ys{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Zs=$s.join("");class Js extends js{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max($s.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Zs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class ei extends Ys{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),di=e=>li(e).split("").sort().join(""),ci={setup(e,t){const r=t.shift();return e(Vi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ai.assign(r,...e),r);if(oi.has(t)){const s=oi.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("toVarIntent"===t)return()=>r;if("self"===t)return e;if(t.endsWith("Assign")&&oi.has(t.slice(0,t.length-6))){const s=oi.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=li(t),Ii(new Js(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(3).toLowerCase()),r=>Ii(new ei(e,t,Ii(r)));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(4).toLowerCase()),()=>Ii(new ti(Ii(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ii(new Js(e,t));if(!0===/^\d+$/.test(t))return Ii(new Xs(r,new ii(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Ii(new ni(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},hi=new WeakMap,pi=new WeakMap,gi=function(e,t=null){for(const r in e)e[r]=Ii(e[r],t);return e},mi=function(e,t=null){const r=e.length;for(let s=0;so?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ui(l(t)))):null!==r?(r=Ii(r),n=(...s)=>i(new e(t,...Ui(l(s)),r))):n=(...r)=>i(new e(t,...Ui(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},yi=function(e,...t){return Ii(new e(...Ui(t)))};class bi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn;e.subBuildFn=i;let o=null;if(t.layout){let s=pi.get(e.constructor);void 0===s&&(s=new WeakMap,pi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Ii(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i),o=Ii(i.call(r))}else{let s=r;if(Array.isArray(s)){let e=0;s=new Proxy(s,{get:(t,r,s)=>void 0===t[r]?t[e++]:Reflect.get(t,r,s)})}const i=t.jsFunc,n=null!==s||i.length>1?i(s||[],e):i(e);o=Ii(n)}return e.subBuildFn=a,t.once&&(s[n]=o),o}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e);if("setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return r}}class xi extends js{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Vi(e),Ii(new bi(this,e))}setup(){return this.call()}}const Ti=[!1,!0],_i=[0,1,2,3],vi=[-1,-2],Ni=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Si=new Map;for(const e of Ti)Si.set(e,new ii(e));const Ei=new Map;for(const e of _i)Ei.set(e,new ii(e,"uint"));const wi=new Map([...Ei].map(e=>new ii(e.value,"int")));for(const e of vi)wi.set(e,new ii(e,"int"));const Ai=new Map([...wi].map(e=>new ii(e.value)));for(const e of Ni)Ai.set(e,new ii(e));for(const e of Ni)Ai.set(-e,new ii(-e));const Ri={bool:Si,uint:Ei,ints:wi,float:Ai},Ci=new Map([...Si,...Ai]),Mi=(e,t)=>Ci.has(e)?Ci.get(e):!0===e.isNode?e:new ii(e,t),Pi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Bs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Di(t.get(r[0]));if(1===r.length){const t=Mi(r[0],e);return t.nodeType===e?Di(t):Di(new Ks(t,e))}const s=r.map(e=>Mi(e));return Di(new Qs(s,e))}},Bi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),ci)}const Ii=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=hi.get(e);return void 0===t&&(t=new Proxy(e,ci),hi.set(e,t),hi.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ii(Mi(e,t)):"shader"===r?e.isFn?e:$i(e):e}(e,t),Di=(e,t=null)=>Ii(e,t).toVarIntent(),Vi=(e,t=null)=>new gi(e,t),Ui=(e,t=null)=>new mi(e,t),Oi=(e,t=null,r=null,s=null)=>new fi(e,t,r,s),ki=(e,...t)=>new yi(e,...t),Gi=(e,t=null,r=null,s={})=>new fi(e,t,r,{intent:!0,...s});let zi=0;class Hi extends js{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null)),this.shaderNode=new Fi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+zi++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){let t;Vi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];const r=this.shaderNode.call(t);return"void"===this.shaderNode.nodeType&&r.toStack(),r.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return console.warn('THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function $i(e,t=null){const r=new Hi(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const Wi=e=>{ai=e},qi=()=>ai,ji=(...e)=>ai.If(...e);function Xi(e){return ai&&ai.add(e),e}ui("toStack",Xi);const Ki=new Pi("color"),Yi=new Pi("float",Ri.float),Qi=new Pi("int",Ri.ints),Zi=new Pi("uint",Ri.uint),Ji=new Pi("bool",Ri.bool),en=new Pi("vec2"),tn=new Pi("ivec2"),rn=new Pi("uvec2"),sn=new Pi("bvec2"),nn=new Pi("vec3"),an=new Pi("ivec3"),on=new Pi("uvec3"),un=new Pi("bvec3"),ln=new Pi("vec4"),dn=new Pi("ivec4"),cn=new Pi("uvec4"),hn=new Pi("bvec4"),pn=new Pi("mat2"),gn=new Pi("mat3"),mn=new Pi("mat4");ui("toColor",Ki),ui("toFloat",Yi),ui("toInt",Qi),ui("toUint",Zi),ui("toBool",Ji),ui("toVec2",en),ui("toIVec2",tn),ui("toUVec2",rn),ui("toBVec2",sn),ui("toVec3",nn),ui("toIVec3",an),ui("toUVec3",on),ui("toBVec3",un),ui("toVec4",ln),ui("toIVec4",dn),ui("toUVec4",cn),ui("toBVec4",hn),ui("toMat2",pn),ui("toMat3",gn),ui("toMat4",mn);const fn=Oi(Xs).setParameterLength(2),yn=(e,t)=>Ii(new Ks(Ii(e),t));ui("element",fn),ui("convert",yn);ui("append",e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),Xi(e)));class bn extends js{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const xn=(e,t)=>Ii(new bn(e,t)),Tn=(e,t)=>Ii(new bn(e,t,!0)),_n=ki(bn,"vec4","DiffuseColor"),vn=ki(bn,"vec3","EmissiveColor"),Nn=ki(bn,"float","Roughness"),Sn=ki(bn,"float","Metalness"),En=ki(bn,"float","Clearcoat"),wn=ki(bn,"float","ClearcoatRoughness"),An=ki(bn,"vec3","Sheen"),Rn=ki(bn,"float","SheenRoughness"),Cn=ki(bn,"float","Iridescence"),Mn=ki(bn,"float","IridescenceIOR"),Pn=ki(bn,"float","IridescenceThickness"),Bn=ki(bn,"float","AlphaT"),Ln=ki(bn,"float","Anisotropy"),Fn=ki(bn,"vec3","AnisotropyT"),In=ki(bn,"vec3","AnisotropyB"),Dn=ki(bn,"color","SpecularColor"),Vn=ki(bn,"float","SpecularF90"),Un=ki(bn,"float","Shininess"),On=ki(bn,"vec4","Output"),kn=ki(bn,"float","dashSize"),Gn=ki(bn,"float","gapSize"),zn=ki(bn,"float","pointWidth"),Hn=ki(bn,"float","IOR"),$n=ki(bn,"float","Transmission"),Wn=ki(bn,"float","Thickness"),qn=ki(bn,"float","AttenuationDistance"),jn=ki(bn,"color","AttenuationColor"),Xn=ki(bn,"float","Dispersion");class Kn extends js{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Yn=e=>new Kn(e),Qn=(e,t=0)=>new Kn(e,!0,t),Zn=Qn("frame"),Jn=Qn("render"),ea=Yn("object");class ta extends ri{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ea}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate(t=>{const s=e(t,r);void 0!==s&&(this.value=s)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const ra=(e,t)=>{const r=Li(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Ii(new ta(s,r))};class sa extends Ys{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ia=(...e)=>{let t;if(1===e.length){const r=e[0];t=new sa(null,r.length,r)}else{const r=e[0],s=e[1];t=new sa(r,s)}return Ii(t)};ui("toArray",(e,t)=>ia(Array(t).fill(e)));class na extends Ys{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return $s.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this;e.getNodeProperties(t).assign=!0;const s=e.getNodeProperties(this);s.sourceNode=r,s.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ui(t):Vi(t[0]),Ii(new oa(Ii(e),t)));ui("call",ua);const la={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class da extends Ys{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new da(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const ca=Gi(da,"+").setParameterLength(2,1/0).setName("add"),ha=Gi(da,"-").setParameterLength(2,1/0).setName("sub"),pa=Gi(da,"*").setParameterLength(2,1/0).setName("mul"),ga=Gi(da,"/").setParameterLength(2,1/0).setName("div"),ma=Gi(da,"%").setParameterLength(2).setName("mod"),fa=Gi(da,"==").setParameterLength(2).setName("equal"),ya=Gi(da,"!=").setParameterLength(2).setName("notEqual"),ba=Gi(da,"<").setParameterLength(2).setName("lessThan"),xa=Gi(da,">").setParameterLength(2).setName("greaterThan"),Ta=Gi(da,"<=").setParameterLength(2).setName("lessThanEqual"),_a=Gi(da,">=").setParameterLength(2).setName("greaterThanEqual"),va=Gi(da,"&&").setParameterLength(2,1/0).setName("and"),Na=Gi(da,"||").setParameterLength(2,1/0).setName("or"),Sa=Gi(da,"!").setParameterLength(1).setName("not"),Ea=Gi(da,"^^").setParameterLength(2).setName("xor"),wa=Gi(da,"&").setParameterLength(2).setName("bitAnd"),Aa=Gi(da,"~").setParameterLength(2).setName("bitNot"),Ra=Gi(da,"|").setParameterLength(2).setName("bitOr"),Ca=Gi(da,"^").setParameterLength(2).setName("bitXor"),Ma=Gi(da,"<<").setParameterLength(2).setName("shiftLeft"),Pa=Gi(da,">>").setParameterLength(2).setName("shiftRight"),Ba=$i(([e])=>(e.addAssign(1),e)),La=$i(([e])=>(e.subAssign(1),e)),Fa=$i(([e])=>{const t=Qi(e).toConst();return e.addAssign(1),t}),Ia=$i(([e])=>{const t=Qi(e).toConst();return e.subAssign(1),t});ui("add",ca),ui("sub",ha),ui("mul",pa),ui("div",ga),ui("mod",ma),ui("equal",fa),ui("notEqual",ya),ui("lessThan",ba),ui("greaterThan",xa),ui("lessThanEqual",Ta),ui("greaterThanEqual",_a),ui("and",va),ui("or",Na),ui("not",Sa),ui("xor",Ea),ui("bitAnd",wa),ui("bitNot",Aa),ui("bitOr",Ra),ui("bitXor",Ca),ui("shiftLeft",Ma),ui("shiftRight",Pa),ui("incrementBefore",Ba),ui("decrementBefore",La),ui("increment",Fa),ui("decrement",Ia);const Da=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ma(Qi(e),Qi(t)));ui("modInt",Da);class Va extends Ys{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Va.MAX||e===Va.MIN)&&arguments.length>3){let i=new Va(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Va.LENGTH||t===Va.DISTANCE||t===Va.DOT?"float":t===Va.CROSS?"vec3":t===Va.ALL||t===Va.ANY?"bool":t===Va.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===Va.ONE_MINUS)i=ha(1,t);else if(s===Va.RECIPROCAL)i=ga(1,t);else if(s===Va.DIFFERENCE)i=uo(ha(t,r));else if(s===Va.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=ln(nn(n),0):s=ln(nn(s),0);const a=pa(s,n).xyz;i=eo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Va.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const c=[];return r===Va.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Va.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Va.MIN&&r!==Va.MAX?r===Va.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Va.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Va.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Va.DFDX&&r!==Va.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Va.ALL="all",Va.ANY="any",Va.RADIANS="radians",Va.DEGREES="degrees",Va.EXP="exp",Va.EXP2="exp2",Va.LOG="log",Va.LOG2="log2",Va.SQRT="sqrt",Va.INVERSE_SQRT="inversesqrt",Va.FLOOR="floor",Va.CEIL="ceil",Va.NORMALIZE="normalize",Va.FRACT="fract",Va.SIN="sin",Va.COS="cos",Va.TAN="tan",Va.ASIN="asin",Va.ACOS="acos",Va.ATAN="atan",Va.ABS="abs",Va.SIGN="sign",Va.LENGTH="length",Va.NEGATE="negate",Va.ONE_MINUS="oneMinus",Va.DFDX="dFdx",Va.DFDY="dFdy",Va.ROUND="round",Va.RECIPROCAL="reciprocal",Va.TRUNC="trunc",Va.FWIDTH="fwidth",Va.TRANSPOSE="transpose",Va.DETERMINANT="determinant",Va.INVERSE="inverse",Va.BITCAST="bitcast",Va.EQUALS="equals",Va.MIN="min",Va.MAX="max",Va.STEP="step",Va.REFLECT="reflect",Va.DISTANCE="distance",Va.DIFFERENCE="difference",Va.DOT="dot",Va.CROSS="cross",Va.POW="pow",Va.TRANSFORM_DIRECTION="transformDirection",Va.MIX="mix",Va.CLAMP="clamp",Va.REFRACT="refract",Va.SMOOTHSTEP="smoothstep",Va.FACEFORWARD="faceforward";const Ua=Yi(1e-6),Oa=Yi(1e6),ka=Yi(Math.PI),Ga=Yi(2*Math.PI),za=Gi(Va,Va.ALL).setParameterLength(1),Ha=Gi(Va,Va.ANY).setParameterLength(1),$a=Gi(Va,Va.RADIANS).setParameterLength(1),Wa=Gi(Va,Va.DEGREES).setParameterLength(1),qa=Gi(Va,Va.EXP).setParameterLength(1),ja=Gi(Va,Va.EXP2).setParameterLength(1),Xa=Gi(Va,Va.LOG).setParameterLength(1),Ka=Gi(Va,Va.LOG2).setParameterLength(1),Ya=Gi(Va,Va.SQRT).setParameterLength(1),Qa=Gi(Va,Va.INVERSE_SQRT).setParameterLength(1),Za=Gi(Va,Va.FLOOR).setParameterLength(1),Ja=Gi(Va,Va.CEIL).setParameterLength(1),eo=Gi(Va,Va.NORMALIZE).setParameterLength(1),to=Gi(Va,Va.FRACT).setParameterLength(1),ro=Gi(Va,Va.SIN).setParameterLength(1),so=Gi(Va,Va.COS).setParameterLength(1),io=Gi(Va,Va.TAN).setParameterLength(1),no=Gi(Va,Va.ASIN).setParameterLength(1),ao=Gi(Va,Va.ACOS).setParameterLength(1),oo=Gi(Va,Va.ATAN).setParameterLength(1,2),uo=Gi(Va,Va.ABS).setParameterLength(1),lo=Gi(Va,Va.SIGN).setParameterLength(1),co=Gi(Va,Va.LENGTH).setParameterLength(1),ho=Gi(Va,Va.NEGATE).setParameterLength(1),po=Gi(Va,Va.ONE_MINUS).setParameterLength(1),go=Gi(Va,Va.DFDX).setParameterLength(1),mo=Gi(Va,Va.DFDY).setParameterLength(1),fo=Gi(Va,Va.ROUND).setParameterLength(1),yo=Gi(Va,Va.RECIPROCAL).setParameterLength(1),bo=Gi(Va,Va.TRUNC).setParameterLength(1),xo=Gi(Va,Va.FWIDTH).setParameterLength(1),To=Gi(Va,Va.TRANSPOSE).setParameterLength(1),_o=Gi(Va,Va.DETERMINANT).setParameterLength(1),vo=Gi(Va,Va.INVERSE).setParameterLength(1),No=Gi(Va,Va.BITCAST).setParameterLength(2),So=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),fa(e,t)),Eo=Gi(Va,Va.MIN).setParameterLength(2,1/0),wo=Gi(Va,Va.MAX).setParameterLength(2,1/0),Ao=Gi(Va,Va.STEP).setParameterLength(2),Ro=Gi(Va,Va.REFLECT).setParameterLength(2),Co=Gi(Va,Va.DISTANCE).setParameterLength(2),Mo=Gi(Va,Va.DIFFERENCE).setParameterLength(2),Po=Gi(Va,Va.DOT).setParameterLength(2),Bo=Gi(Va,Va.CROSS).setParameterLength(2),Lo=Gi(Va,Va.POW).setParameterLength(2),Fo=Gi(Va,Va.POW,2).setParameterLength(1),Io=Gi(Va,Va.POW,3).setParameterLength(1),Do=Gi(Va,Va.POW,4).setParameterLength(1),Vo=Gi(Va,Va.TRANSFORM_DIRECTION).setParameterLength(2),Uo=e=>pa(lo(e),Lo(uo(e),1/3)),Oo=e=>Po(e,e),ko=Gi(Va,Va.MIX).setParameterLength(3),Go=(e,t=0,r=1)=>Ii(new Va(Va.CLAMP,Ii(e),Ii(t),Ii(r))),zo=e=>Go(e),Ho=Gi(Va,Va.REFRACT).setParameterLength(3),$o=Gi(Va,Va.SMOOTHSTEP).setParameterLength(3),Wo=Gi(Va,Va.FACEFORWARD).setParameterLength(3),qo=$i(([e])=>{const t=Po(e.xy,en(12.9898,78.233)),r=ma(t,ka);return to(ro(r).mul(43758.5453))}),jo=(e,t,r)=>ko(t,r,e),Xo=(e,t,r)=>$o(t,r,e),Ko=(e,t)=>Ao(t,e),Yo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),oo(e,t)),Qo=Wo,Zo=Qa;ui("all",za),ui("any",Ha),ui("equals",So),ui("radians",$a),ui("degrees",Wa),ui("exp",qa),ui("exp2",ja),ui("log",Xa),ui("log2",Ka),ui("sqrt",Ya),ui("inverseSqrt",Qa),ui("floor",Za),ui("ceil",Ja),ui("normalize",eo),ui("fract",to),ui("sin",ro),ui("cos",so),ui("tan",io),ui("asin",no),ui("acos",ao),ui("atan",oo),ui("abs",uo),ui("sign",lo),ui("length",co),ui("lengthSq",Oo),ui("negate",ho),ui("oneMinus",po),ui("dFdx",go),ui("dFdy",mo),ui("round",fo),ui("reciprocal",yo),ui("trunc",bo),ui("fwidth",xo),ui("atan2",Yo),ui("min",Eo),ui("max",wo),ui("step",Ko),ui("reflect",Ro),ui("distance",Co),ui("dot",Po),ui("cross",Bo),ui("pow",Lo),ui("pow2",Fo),ui("pow3",Io),ui("pow4",Do),ui("transformDirection",Vo),ui("mix",jo),ui("clamp",Go),ui("refract",Ho),ui("smoothstep",Xo),ui("faceForward",Wo),ui("difference",Mo),ui("saturate",zo),ui("cbrt",Uo),ui("transpose",To),ui("determinant",_o),ui("inverse",vo),ui("rand",qo);class Jo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?xn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const eu=Oi(Jo).setParameterLength(2,3);ui("select",eu);class tu extends js{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const ru=Oi(tu).setParameterLength(1,2),su=(e,t)=>ru(e,{nodeName:t});function iu(e,t){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),su(e,t)}ui("context",ru),ui("label",iu),ui("setName",su);class nu extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}build(...e){if(!0===this.intent){if(!0!==e[0].getNodeProperties(this).assign)return this.node.build(...e)}return super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=t.getArrayCount(e);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const au=Oi(nu),ou=(e,t=null)=>au(e,t).toStack(),uu=(e,t=null)=>au(e,t,!0).toStack(),lu=e=>null===qi()?e:au(e).setIntent(!0).toStack();ui("toVar",ou),ui("toConst",uu),ui("toVarIntent",lu);class du extends js{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const cu=(e,t,r=null)=>Ii(new du(Ii(e),t,r));class hu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=cu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const pu=Oi(hu).setParameterLength(1,2),gu=e=>pu(e);ui("toVarying",pu),ui("toVertexStage",gu),ui("varying",(...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),pu(...e))),ui("vertexStage",(...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),pu(...e)));const mu=$i(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ko(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),fu=$i(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ko(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),yu="WorkingColorSpace";class bu extends Ys{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===yu?c.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=ln(mu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=ln(gn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=ln(fu(i.rgb),i.a)),i):i}}const xu=(e,t)=>Ii(new bu(Ii(e),yu,t)),Tu=(e,t)=>Ii(new bu(Ii(e),t,yu));ui("workingToColorSpace",xu),ui("colorSpaceToWorking",Tu);let _u=class extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class vu extends js{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ii(new _u(this,Ii(e)))}setNodeType(e){const t=ra(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Nu(e,t,r));class Eu extends Ys{static get type(){return"ToneMappingNode"}constructor(e,t=Au,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ln(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const wu=(e,t,r)=>Ii(new Eu(e,Ii(t),Ii(r))),Au=Su("toneMappingExposure","float");ui("toneMapping",(e,t,r)=>wu(t,r,e));class Ru extends ri{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const Cu=(e,t=null,r=0,s=0)=>Ii(new Ru(e,t,r,s)),Mu=(e,t=null,r=0,s=0)=>Cu(e,t,r,s).setUsage(y),Pu=(e,t=null,r=0,s=0)=>Cu(e,t,r,s).setInstanced(!0),Bu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setInstanced(!0);ui("toAttribute",e=>Cu(e.value));class Lu extends js{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const Fu=(e,t=[64])=>{(0===t.length||t.length>3)&&console.error("THREE.TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;eFu(e,r).setCount(t);ui("compute",Iu),ui("computeKernel",Fu);class Du extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Vu=(e,t)=>Ii(new Du(Ii(e),t));ui("cache",Vu);class Uu extends js{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Ou=Oi(Uu).setParameterLength(2);ui("bypass",Ou);class ku extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=Yi(0),i=Yi(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Gu=Oi(ku,null,null,{doClamp:!1}).setParameterLength(3,5),zu=Oi(ku).setParameterLength(3,5);ui("remap",Gu),ui("remapClamp",zu);class Hu extends js{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const $u=Oi(Hu).setParameterLength(1,2),Wu=e=>(e?eu(e,$u("discard")):$u("discard")).toStack();ui("discard",Wu);class qu extends Ys{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||b;return r!==p&&(t=t.toneMapping(r)),s!==b&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ju=(e,t=null,r=null)=>Ii(new qu(Ii(e),t,r));ui("renderOutput",ju);class Xu extends Ys{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Ku=(e,t=null)=>Ii(new Xu(Ii(e),t)).toStack();ui("debug",Ku);class Yu extends js{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return pu(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Qu=(e,t=null)=>Ii(new Yu(e,t)),Zu=(e=0)=>Qu("uv"+(e>0?e:""),"vec2");class Ju extends js{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const el=Oi(Ju).setParameterLength(1,2);class tl extends ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const rl=Oi(tl).setParameterLength(1),sl=new x;class il extends ta{static get type(){return"TextureNode"}constructor(e=sl,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Us.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===T?"uvec4":this.value.type===_?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Zu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ra(this.value.matrix)),this._matrixUniform.mul(nn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Qi(el(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${b}`,this),n.snippet=b,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=Tu($u(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Ii(e).mul(rl(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===v||r.magFilter===v)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Ii(t)}level(e){const t=this.clone();return t.levelNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}size(e){return el(this,e)}bias(e){const t=this.clone();return t.biasNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}compare(e){const t=this.clone();return t.compareNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ii(e),Ii(t)],r.referenceNode=this.getSelf(),Ii(r)}depth(e){const t=this.clone();return t.depthNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const nl=Oi(il).setParameterLength(1,4).setName("texture"),al=(e=sl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=nl(e,t,r,s),i},ol=(...e)=>al(...e).setSampler(!1);class ul extends ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const ll=(e,t,r)=>Ii(new ul(e,t,r));class dl extends Xs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class cl extends ul{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rIi(new cl(e,t));const pl=Oi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),gl=ra(0,"uint").setName("u_cameraIndex").setGroup(Qn("cameraIndex")).toVarying("v_cameraIndex"),ml=ra("float").setName("cameraNear").setGroup(Jn).onRenderUpdate(({camera:e})=>e.near),fl=ra("float").setName("cameraFar").setGroup(Jn).onRenderUpdate(({camera:e})=>e.far),yl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=hl(r).setGroup(Jn).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraProjectionMatrix")}else t=ra("mat4").setName("cameraProjectionMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),bl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=hl(r).setGroup(Jn).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraProjectionMatrixInverse")}else t=ra("mat4").setName("cameraProjectionMatrixInverse").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),xl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=hl(r).setGroup(Jn).setName("cameraViewMatrices").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraViewMatrix")}else t=ra("mat4").setName("cameraViewMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),Tl=ra("mat4").setName("cameraWorldMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorld),_l=ra("mat3").setName("cameraNormalMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.normalMatrix),vl=ra(new r).setName("cameraPosition").setGroup(Jn).onRenderUpdate(({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)),Nl=new N;class Sl extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this.uniformNode=new ta(null)}getNodeType(){const e=this.scope;return e===Sl.WORLD_MATRIX?"mat4":e===Sl.POSITION||e===Sl.VIEW_POSITION||e===Sl.DIRECTION||e===Sl.SCALE?"vec3":e===Sl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Sl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Sl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Sl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Sl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Sl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===Sl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Nl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Nl.radius}}generate(e){const t=this.scope;return t===Sl.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Sl.POSITION||t===Sl.VIEW_POSITION||t===Sl.DIRECTION||t===Sl.SCALE?this.uniformNode.nodeType="vec3":t===Sl.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}Sl.WORLD_MATRIX="worldMatrix",Sl.POSITION="position",Sl.SCALE="scale",Sl.VIEW_POSITION="viewPosition",Sl.DIRECTION="direction",Sl.RADIUS="radius";const El=Oi(Sl,Sl.DIRECTION).setParameterLength(1),wl=Oi(Sl,Sl.WORLD_MATRIX).setParameterLength(1),Al=Oi(Sl,Sl.POSITION).setParameterLength(1),Rl=Oi(Sl,Sl.SCALE).setParameterLength(1),Cl=Oi(Sl,Sl.VIEW_POSITION).setParameterLength(1),Ml=Oi(Sl,Sl.RADIUS).setParameterLength(1);class Pl extends Sl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Bl=ki(Pl,Pl.DIRECTION),Ll=ki(Pl,Pl.WORLD_MATRIX),Fl=ki(Pl,Pl.POSITION),Il=ki(Pl,Pl.SCALE),Dl=ki(Pl,Pl.VIEW_POSITION),Vl=ki(Pl,Pl.RADIUS),Ul=ra(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Ol=ra(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),kl=$i(e=>e.renderer.overrideNodes.modelViewMatrix||Gl).once()().toVar("modelViewMatrix"),Gl=xl.mul(Ll),zl=$i(e=>(e.context.isHighPrecisionModelViewMatrix=!0,ra("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Hl=$i(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ra("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),$l=Qu("position","vec3"),Wl=$l.toVarying("positionLocal"),ql=$l.toVarying("positionPrevious"),jl=$i(e=>Ll.mul(Wl).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Xl=$i(()=>Wl.transformDirection(Ll).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Kl=$i(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Yl=Kl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ql extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===S?"false":e.getFrontFacing()}}const Zl=ki(Ql),Jl=Yi(Zl).mul(2).sub(1),ed=$i(([e],{material:t})=>{const r=t.side;return r===S?e=e.mul(-1):r===E&&(e=e.mul(Jl)),e}),td=Qu("normal","vec3"),rd=$i(e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),nn(0,1,0)):td,"vec3").once()().toVar("normalLocal"),sd=Kl.dFdx().cross(Kl.dFdy()).normalize().toVar("normalFlat"),id=$i(e=>{let t;return t=!0===e.material.flatShading?sd:dd(rd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),nd=$i(e=>{let t=id.transformDirection(xl);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),ad=$i(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=id,!0!==t.flatShading&&(s=ed(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),od=ad.transformDirection(xl).toVar("normalWorld"),ud=$i(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?ad:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),ld=$i(([e,t=Ll])=>{const r=gn(t),s=e.div(nn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),dd=$i(([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ul.mul(e);return xl.transformDirection(s)}),cd=$i(()=>(console.warn('THREE.TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),ad)).once(["NORMAL","VERTEX"])(),hd=$i(()=>(console.warn('THREE.TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),od)).once(["NORMAL","VERTEX"])(),pd=$i(()=>(console.warn('THREE.TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),ud)).once(["NORMAL","VERTEX"])(),gd=new w,md=new a,fd=ra(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),yd=ra(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),bd=ra(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(gd.copy(r),md.makeRotationFromEuler(gd)):md.identity(),md}),xd=Yl.negate().reflect(ad),Td=Yl.negate().refract(ad,fd),_d=xd.transformDirection(xl).toVar("reflectVector"),vd=Td.transformDirection(xl).toVar("reflectVector"),Nd=new A;class Sd extends il{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===R?_d:e.mapping===C?vd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),nn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=nn(t.x.negate(),t.yz)),bd.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const Ed=Oi(Sd).setParameterLength(1,4).setName("cubeTexture"),wd=(e=Nd,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=Ed(e,t,r,s),i};class Ad extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Rd extends js{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Us.OBJECT}element(e){return Ii(new Ad(this,Ii(e)))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?ll(null,e,this.count):Array.isArray(this.getValueFromReference())?hl(null,e):"texture"===e?al(null):"cubeTexture"===e?wd(null):ra(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Rd(e,t,r)),Md=(e,t,r,s)=>Ii(new Rd(e,t,s,r));class Pd extends Rd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Bd=(e,t,r=null)=>Ii(new Pd(e,t,r)),Ld=Zu(),Fd=Kl.dFdx(),Id=Kl.dFdy(),Dd=Ld.dFdx(),Vd=Ld.dFdy(),Ud=ad,Od=Id.cross(Ud),kd=Ud.cross(Fd),Gd=Od.mul(Dd.x).add(kd.mul(Vd.x)),zd=Od.mul(Dd.y).add(kd.mul(Vd.y)),Hd=Gd.dot(Gd).max(zd.dot(zd)),$d=Hd.equal(0).select(0,Hd.inverseSqrt()),Wd=Gd.mul($d).toVar("tangentViewFrame"),qd=zd.mul($d).toVar("bitangentViewFrame"),jd=$i(e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Qu("tangent","vec4")))(),Xd=jd.xyz.toVar("tangentLocal"),Kd=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?kl.mul(ln(Xd,0)).xyz.toVarying("v_tangentView").normalize():Wd,!0!==r.flatShading&&(s=ed(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Yd=Kd.transformDirection(xl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Qd=$i(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(jd.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Zd=Qd(td.cross(jd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Jd=Qd(rd.cross(Xd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),ec=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Qd(ad.cross(Kd),"v_bitangentView").normalize():qd,!0!==r.flatShading&&(s=ed(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),tc=Qd(od.cross(Yd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),rc=gn(Kd,ec,ad).toVar("TBNViewMatrix"),sc=Yl.mul(rc),ic=$i(()=>{let e=In.cross(Yl);return e=e.cross(In).normalize(),e=ko(e,ad,Ln.mul(Nn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()();class nc extends Ys{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=M}setup({material:e}){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);if(null!==r){let t=r;!0===e.flatShading&&(t=ed(t)),s=nn(s.xy.mul(t),s.z)}let i=null;return t===P?i=dd(s):t===M?i=rc.mul(s).normalize():(console.error(`THREE.NodeMaterial: Unsupported normal map type: ${t}`),i=ad),i}}const ac=Oi(nc).setParameterLength(1,2),oc=$i(({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Zu()),forceUVContext:!0}),s=Yi(r(e=>e));return en(Yi(r(e=>e.add(e.dFdx()))).sub(s),Yi(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),uc=$i(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Jl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class lc extends Ys{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=oc({textureNode:this.textureNode,bumpScale:e});return uc({surf_pos:Kl,surf_norm:ad,dHdxy:t})}}const dc=Oi(lc).setParameterLength(1,2),cc=new Map;class hc extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=cc.get(e);return void 0===r&&(r=Bd(e,t),cc.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===hc.COLOR){const e=void 0!==t.color?this.getColor(r):nn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===hc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===hc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Yi(1);else if(r===hc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===hc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===hc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===hc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===hc.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===hc.NORMAL)t.normalMap?(s=ac(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?dc(this.getTexture("bump").r,this.getFloat("bumpScale")):ad;else if(r===hc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===hc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===hc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ac(this.getTexture(r),this.getCache(r+"Scale","vec2")):ad;else if(r===hc.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===hc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===hc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=pn(Yc.x,Yc.y,Yc.y.negate(),Yc.x).mul(e.rg.mul(2).sub(en(1)).normalize().mul(e.b))}else s=Yc;else if(r===hc.IRIDESCENCE_THICKNESS){const e=Cd("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Cd("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===hc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===hc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===hc.IOR)s=this.getFloat(r);else if(r===hc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===hc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===hc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):Yi(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}hc.ALPHA_TEST="alphaTest",hc.COLOR="color",hc.OPACITY="opacity",hc.SHININESS="shininess",hc.SPECULAR="specular",hc.SPECULAR_STRENGTH="specularStrength",hc.SPECULAR_INTENSITY="specularIntensity",hc.SPECULAR_COLOR="specularColor",hc.REFLECTIVITY="reflectivity",hc.ROUGHNESS="roughness",hc.METALNESS="metalness",hc.NORMAL="normal",hc.CLEARCOAT="clearcoat",hc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",hc.CLEARCOAT_NORMAL="clearcoatNormal",hc.EMISSIVE="emissive",hc.ROTATION="rotation",hc.SHEEN="sheen",hc.SHEEN_ROUGHNESS="sheenRoughness",hc.ANISOTROPY="anisotropy",hc.IRIDESCENCE="iridescence",hc.IRIDESCENCE_IOR="iridescenceIOR",hc.IRIDESCENCE_THICKNESS="iridescenceThickness",hc.IOR="ior",hc.TRANSMISSION="transmission",hc.THICKNESS="thickness",hc.ATTENUATION_DISTANCE="attenuationDistance",hc.ATTENUATION_COLOR="attenuationColor",hc.LINE_SCALE="scale",hc.LINE_DASH_SIZE="dashSize",hc.LINE_GAP_SIZE="gapSize",hc.LINE_WIDTH="linewidth",hc.LINE_DASH_OFFSET="dashOffset",hc.POINT_SIZE="size",hc.DISPERSION="dispersion",hc.LIGHT_MAP="light",hc.AO="ao";const pc=ki(hc,hc.ALPHA_TEST),gc=ki(hc,hc.COLOR),mc=ki(hc,hc.SHININESS),fc=ki(hc,hc.EMISSIVE),yc=ki(hc,hc.OPACITY),bc=ki(hc,hc.SPECULAR),xc=ki(hc,hc.SPECULAR_INTENSITY),Tc=ki(hc,hc.SPECULAR_COLOR),_c=ki(hc,hc.SPECULAR_STRENGTH),vc=ki(hc,hc.REFLECTIVITY),Nc=ki(hc,hc.ROUGHNESS),Sc=ki(hc,hc.METALNESS),Ec=ki(hc,hc.NORMAL),wc=ki(hc,hc.CLEARCOAT),Ac=ki(hc,hc.CLEARCOAT_ROUGHNESS),Rc=ki(hc,hc.CLEARCOAT_NORMAL),Cc=ki(hc,hc.ROTATION),Mc=ki(hc,hc.SHEEN),Pc=ki(hc,hc.SHEEN_ROUGHNESS),Bc=ki(hc,hc.ANISOTROPY),Lc=ki(hc,hc.IRIDESCENCE),Fc=ki(hc,hc.IRIDESCENCE_IOR),Ic=ki(hc,hc.IRIDESCENCE_THICKNESS),Dc=ki(hc,hc.TRANSMISSION),Vc=ki(hc,hc.THICKNESS),Uc=ki(hc,hc.IOR),Oc=ki(hc,hc.ATTENUATION_DISTANCE),kc=ki(hc,hc.ATTENUATION_COLOR),Gc=ki(hc,hc.LINE_SCALE),zc=ki(hc,hc.LINE_DASH_SIZE),Hc=ki(hc,hc.LINE_GAP_SIZE),$c=ki(hc,hc.LINE_WIDTH),Wc=ki(hc,hc.LINE_DASH_OFFSET),qc=ki(hc,hc.POINT_SIZE),jc=ki(hc,hc.DISPERSION),Xc=ki(hc,hc.LIGHT_MAP),Kc=ki(hc,hc.AO),Yc=ra(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Qc=$i(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Zc extends js{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Zc.VERTEX)s=e.getVertexIndex();else if(r===Zc.INSTANCE)s=e.getInstanceIndex();else if(r===Zc.DRAW)s=e.getDrawIndex();else if(r===Zc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Zc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Zc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=pu(this).build(e,t)}return i}}Zc.VERTEX="vertex",Zc.INSTANCE="instance",Zc.SUBGROUP="subgroup",Zc.INVOCATION_LOCAL="invocationLocal",Zc.INVOCATION_SUBGROUP="invocationSubgroup",Zc.DRAW="draw";const Jc=ki(Zc,Zc.VERTEX),eh=ki(Zc,Zc.INSTANCE),th=ki(Zc,Zc.SUBGROUP),rh=ki(Zc,Zc.INVOCATION_SUBGROUP),sh=ki(Zc,Zc.INVOCATION_LOCAL),ih=ki(Zc,Zc.DRAW);class nh extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=ll(r.array,"mat4",Math.max(t,1)).element(eh);else{const e=new B(r.array,16,1);this.buffer=e;const t=r.usage===y?Bu:Pu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=mn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new L(s.array,3),t=s.usage===y?Bu:Pu;this.bufferColor=e,n=nn(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Wl).xyz;if(Wl.assign(a),e.hasGeometryAttribute("normal")){const e=ld(rd,i);rd.assign(e)}null!==this.instanceColorNode&&Tn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const ah=Oi(nh).setParameterLength(2,3);class oh extends nh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const uh=Oi(oh).setParameterLength(1);class lh extends js{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=eh:this.batchingIdNode=ih);const t=$i(([e])=>{const t=Qi(el(ol(this.batchMesh._indirectTexture),0).x),r=Qi(e).mod(t),s=Qi(e).div(t);return ol(this.batchMesh._indirectTexture,tn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Qi(el(ol(s),0).x),n=Yi(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=mn(ol(s,tn(a,o)),ol(s,tn(a.add(1),o)),ol(s,tn(a.add(2),o)),ol(s,tn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=$i(([e])=>{const t=Qi(el(ol(l),0).x),r=e,s=r.mod(t),i=r.div(t);return ol(l,tn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Tn("vec3","vBatchColor").assign(t)}const d=gn(u);Wl.assign(u.mul(Wl));const c=rd.div(nn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;rd.assign(h),e.hasGeometryAttribute("tangent")&&Xd.mulAssign(d)}}const dh=Oi(lh).setParameterLength(1);class ch extends Xs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const hh=Oi(ch).setParameterLength(2);class ph extends ul{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=ws(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return hh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Cu(this.value),this._varying=pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const gh=(e,t=null,r=0)=>Ii(new ph(e,t,r)),mh=new WeakMap;class fh extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Qu("skinIndex","uvec4"),this.skinWeightNode=Qu("skinWeight","vec4"),this.bindMatrixNode=Cd("bindMatrix","mat4"),this.bindMatrixInverseNode=Cd("bindMatrixInverse","mat4"),this.boneMatricesNode=Md("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Wl,this.toPositionNode=Wl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=ca(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=rd){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Md("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,ql)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ls(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&ql.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();rd.assign(t),e.hasGeometryAttribute("tangent")&&Xd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;mh.get(t)!==e.frameId&&(mh.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const yh=e=>Ii(new fh(e));class bh extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tIi(new bh(Ui(e,"int"))).toStack(),Th=()=>$u("break").toStack(),_h=new WeakMap,vh=new s,Nh=$i(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Qi(Jc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return ol(e,tn(u,o)).depth(i).xyz.mul(t)});class Sh extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ra(1),this.updateType=Us.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=_h.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new F(m,h,p,a);f.type=I,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Yi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(ol(this.mesh.morphTexture,tn(Qi(e).add(1),Qi(eh))).r):t.assign(Cd("morphTargetInfluences","float").element(e).toVar()),ji(t.notEqual(0),()=>{!0===s&&Wl.addAssign(Nh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(0)})),!0===i&&rd.addAssign(Nh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const Eh=Oi(Sh).setParameterLength(1);class wh extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ah extends wh{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Rh extends tu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:nn().toVar("directDiffuse"),directSpecular:nn().toVar("directSpecular"),indirectDiffuse:nn().toVar("indirectDiffuse"),indirectSpecular:nn().toVar("indirectSpecular")};return{radiance:nn().toVar("radiance"),irradiance:nn().toVar("irradiance"),iblIrradiance:nn().toVar("iblIrradiance"),ambientOcclusion:Yi(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Ch=Oi(Rh);class Mh extends wh{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Ph,Bh;class Lh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Lh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==Lh.SIZE&&this.scope!==Lh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Lh.VIEWPORT?null!==t?Bh.copy(t.viewport):(e.getViewport(Bh),Bh.multiplyScalar(e.getPixelRatio())):null!==t?(Ph.width=t.width,Ph.height=t.height):e.getDrawingBufferSize(Ph)}setup(){const e=this.scope;let r=null;return r=e===Lh.SIZE?ra(Ph||(Ph=new t)):e===Lh.VIEWPORT?ra(Bh||(Bh=new s)):en(Dh.div(Ih)),r}generate(e){if(this.scope===Lh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Ih).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Lh.COORDINATE="coordinate",Lh.VIEWPORT="viewport",Lh.SIZE="size",Lh.UV="uv";const Fh=ki(Lh,Lh.UV),Ih=ki(Lh,Lh.SIZE),Dh=ki(Lh,Lh.COORDINATE),Vh=ki(Lh,Lh.VIEWPORT),Uh=Vh.zw,Oh=Dh.sub(Vh.xy),kh=Oh.div(Uh),Gh=$i(()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Ih),"vec2").once()(),zh=new t;class Hh extends il{static get type(){return"ViewportTextureNode"}constructor(e=Fh,t=null,r=null){let s=null;null===r?(s=new D,s.minFilter=V,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Us.RENDER,this._textures=new WeakMap}getFrameBufferTexture(e=null){const t=this.referenceNode?this.referenceNode.defaultFramebuffer:this.defaultFramebuffer;if(null===e)return t;if(!1===this._textures.has(e)){const r=t.clone();this._textures.set(e,r)}return this._textures.get(e)}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(zh):zh.set(r.width,r.height);const s=this.getFrameBufferTexture(r);s.image.width===zh.width&&s.image.height===zh.height||(s.image.width=zh.width,s.image.height=zh.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i,this.value=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const $h=Oi(Hh).setParameterLength(0,3),Wh=Oi(Hh,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let qh=null;class jh extends Hh{static get type(){return"ViewportDepthTextureNode"}constructor(e=Fh,t=null){null===qh&&(qh=new U),super(e,t,qh)}}const Xh=Oi(jh).setParameterLength(0,2);class Kh extends js{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Kh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Kh.DEPTH_BASE)null!==r&&(s=ep().assign(r));else if(t===Kh.DEPTH)s=e.isPerspectiveCamera?Qh(Kl.z,ml,fl):Yh(Kl.z,ml,fl);else if(t===Kh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Zh(r,ml,fl);s=Yh(e,ml,fl)}else s=r;else s=Yh(Kl.z,ml,fl);return s}}Kh.DEPTH_BASE="depthBase",Kh.DEPTH="depth",Kh.LINEAR_DEPTH="linearDepth";const Yh=(e,t,r)=>e.add(t).div(t.sub(r)),Qh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Zh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Jh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ka(e.negate().div(t)),i=Ka(r.div(t));return s.div(i)},ep=Oi(Kh,Kh.DEPTH_BASE),tp=ki(Kh,Kh.DEPTH),rp=Oi(Kh,Kh.LINEAR_DEPTH).setParameterLength(0,1),sp=rp(Xh());tp.assign=e=>ep(e);class ip extends js{static get type(){return"ClippingNode"}constructor(e=ip.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===ip.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===ip.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return $i(()=>{const r=Yi().toVar("distanceToPlane"),s=Yi().toVar("distanceToGradient"),i=Yi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=hl(t);xh(n,({i:t})=>{const n=e.element(t);r.assign(Kl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign($o(s.negate(),s,r))})}const a=e.length;if(a>0){const t=hl(e),n=Yi(1).toVar("intersectionClipOpacity");xh(a,({i:e})=>{const i=t.element(e);r.assign(Kl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign($o(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}_n.a.mulAssign(i),_n.a.equal(0).discard()})()}setupDefault(e,t){return $i(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=hl(t);xh(r,({i:t})=>{const r=e.element(t);Kl.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=hl(e),r=Ji(!0).toVar("clipped");xh(s,({i:e})=>{const s=t.element(e);r.assign(Kl.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),$i(()=>{const s=hl(e),i=pl(t.getClipDistance());xh(r,({i:e})=>{const t=s.element(e),r=Kl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}ip.ALPHA_TO_COVERAGE="alphaToCoverage",ip.DEFAULT="default",ip.HARDWARE="hardware";const np=$i(([e])=>to(pa(1e4,ro(pa(17,e.x).add(pa(.1,e.y)))).mul(ca(.1,uo(ro(pa(13,e.y).add(e.x))))))),ap=$i(([e])=>np(en(np(e.xy),e.z))),op=$i(([e])=>{const t=wo(co(go(e.xyz)),co(mo(e.xyz))),r=Yi(1).div(Yi(.05).mul(t)).toVar("pixScale"),s=en(ja(Za(Ka(r))),ja(Ja(Ka(r)))),i=en(ap(Za(s.x.mul(e.xyz))),ap(Za(s.y.mul(e.xyz)))),n=to(Ka(r)),a=ca(pa(n.oneMinus(),i.x),pa(n,i.y)),o=Eo(n,n.oneMinus()),u=nn(a.mul(a).div(pa(2,o).mul(ha(1,o))),a.sub(pa(.5,o)).div(ha(1,o)),ha(1,ha(1,a).mul(ha(1,a)).div(pa(2,o).mul(ha(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Go(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class up extends Yu{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const lp=(e=0)=>Ii(new up(e)),dp=$i(([e,t])=>Eo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cp=$i(([e,t])=>Eo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hp=$i(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pp=$i(([e,t])=>ko(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ao(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),gp=$i(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ln(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),mp=$i(([e])=>ln(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),fp=$i(([e])=>(ji(e.a.equal(0),()=>ln(0)),ln(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class yp extends O{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>cu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=cu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.add(a);const i=ln(s,_n.a).max(0);n=this.setupOutput(e,i),On.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&On.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ln(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Ii(new ip(ip.ALPHA_TO_COVERAGE)):e.stack.add(Ii(new ip))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Ii(new ip(ip.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Jh(Kl.z,ml,fl):Yh(Kl.z,ml,fl))}null!==s&&tp.assign(s).toStack()}setupPositionView(){return kl.mul(Wl).xyz}setupModelViewProjection(){return yl.mul(Kl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Qc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Eh(t).toStack(),!0===t.isSkinnedMesh&&yh(t).toStack(),this.displacementMap){const e=Bd("displacementMap","texture"),t=Bd("displacementScale","float"),r=Bd("displacementBias","float");Wl.addAssign(rd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&dh(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&uh(t).toStack(),null!==this.positionNode&&Wl.assign(cu(this.positionNode,"POSITION","vec3")),Wl}setupDiffuseColor({object:e,geometry:t}){null!==this.maskNode&&Ji(this.maskNode).not().discard();let r=this.colorNode?ln(this.colorNode):gc;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(lp())),e.instanceColor){r=Tn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Tn("vec3","vBatchColor").mul(r)}_n.assign(r);const s=this.opacityNode?Yi(this.opacityNode):yc;_n.a.assign(_n.a.mul(s));let i=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(i=null!==this.alphaTestNode?Yi(this.alphaTestNode):pc,_n.a.lessThanEqual(i).discard()),!0===this.alphaHash&&_n.a.lessThan(op(Wl)).discard();!1===this.transparent&&this.blending===k&&!1===this.alphaToCoverage?_n.a.assign(1):null===i&&_n.a.lessThanEqual(0).discard()}setupVariants(){}setupOutgoingLight(){return!0===this.lights?nn(0):_n.rgb}setupNormal(){return this.normalNode?nn(this.normalNode):Ec}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Bd("envMap","cubeTexture"):Bd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Mh(Xc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Kc;t.push(new Ah(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Ch(n,t,r,s)}else null!==r&&(a=nn(null!==s?ko(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(vn.assign(nn(i||fc)),a=a.add(vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(On.assign(t),t=ln(r.toVar())),t}setupPremultipliedAlpha(e,t){return mp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=O.prototype.toJSON.call(this,e),s=Ns(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const bp=new G;class xp extends yp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(bp),this.setValues(e)}}const Tp=new z;class _p extends yp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Tp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Yi(this.offsetNode):Wc,t=this.dashScaleNode?Yi(this.dashScaleNode):Gc,r=this.dashSizeNode?Yi(this.dashSizeNode):zc,s=this.gapSizeNode?Yi(this.gapSizeNode):Hc;kn.assign(r),Gn.assign(s);const i=pu(Qu("lineDistance").mul(t));(e?i.add(e):i).mod(kn.add(Gn)).greaterThan(kn).discard()}}let vp=null;class Np extends Hh{static get type(){return"ViewportSharedTextureNode"}constructor(e=Fh,t=null){null===vp&&(vp=new D),super(e,t,vp)}updateReference(){return this}}const Sp=Oi(Np).setParameterLength(0,2),Ep=new z;class wp extends yp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Ep),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=H,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=$i(({start:e,end:t})=>{const r=yl.element(2).element(2),s=yl.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ln(ko(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=$i(()=>{const e=Qu("instanceStart"),t=Qu("instanceEnd"),r=ln(kl.mul(ln(e,1))).toVar("start"),s=ln(kl.mul(ln(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Yi(this.dashScaleNode):Gc,t=this.offsetNode?Yi(this.offsetNode):Wc,r=Qu("instanceDistanceStart"),s=Qu("instanceDistanceEnd");let i=$l.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Tn("float","lineDistance").assign(i)}n&&(Tn("vec3","worldStart").assign(r.xyz),Tn("vec3","worldEnd").assign(s.xyz));const o=Vh.z.div(Vh.w),u=yl.element(2).element(3).equal(-1);ji(u,()=>{ji(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=yl.mul(r),d=yl.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=ln().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ko(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Tn("vec4","worldPos");o.assign($l.y.lessThan(.5).select(r,s));const u=$c.mul(.5);o.addAssign(ln($l.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(ln($l.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(ln(a.mul(u),0)),ji($l.y.greaterThan(1).or($l.y.lessThan(0)),()=>{o.subAssign(ln(a.mul(2).mul(u),0))})),g.assign(yl.mul(o));const l=nn().toVar();l.assign($l.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=en(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign($l.x.lessThan(0).select(e.negate(),e)),ji($l.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf($l.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul($c)),e.assign(e.div(Vh.w)),g.assign($l.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ln(e,0,0)))}return g})();const o=$i(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return en(h,p)});if(this.colorNode=$i(()=>{const e=Zu();if(i){const t=this.dashSizeNode?Yi(this.dashSizeNode):zc,r=this.gapSizeNode?Yi(this.gapSizeNode):Hc;kn.assign(t),Gn.assign(r);const s=Tn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(kn.add(Gn)).greaterThan(kn).discard()}const a=Yi(1).toVar("alpha");if(n){const e=Tn("vec3","worldStart"),s=Tn("vec3","worldEnd"),n=Tn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:nn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div($c);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign($o(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=Yi(s.fwidth()).toVar("dlen");ji(e.y.abs().greaterThan(1),()=>{a.assign($o(i.oneMinus(),i.add(1),s).oneMinus())})}else ji(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Qu("instanceColorStart"),t=Qu("instanceColorEnd");u=$l.y.lessThan(.5).select(e,t).mul(gc)}else u=gc;return ln(u,a)})(),this.transparent){const e=this.opacityNode?Yi(this.opacityNode):yc;this.outputNode=ln(this.colorNode.rgb.mul(e).add(Sp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Ap=e=>Ii(e).mul(.5).add(.5),Rp=new $;class Cp extends yp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Rp),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Yi(this.opacityNode):yc;_n.assign(Tu(ln(Ap(ad),e),W))}}const Mp=$i(([e=Xl])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return en(t,r)});class Pp extends q{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new j(5,5,5),n=Mp(Xl),a=new yp;a.colorNode=al(t,n,0),a.side=S,a.blending=H;const o=new X(i,a),u=new K;u.add(o),t.minFilter===V&&(t.minFilter=Y);const l=new Q(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Bp=new WeakMap;class Lp extends Ys{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=wd(null);const t=new A;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Z||r===J){if(Bp.has(e)){const t=Bp.get(e);Ip(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Pp(r.height);s.fromEquirectangularTexture(t,e),Ip(s.texture,e.mapping),this._cubeTexture=s.texture,Bp.set(e,s.texture),e.addEventListener("dispose",Fp)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Fp(e){const t=e.target;t.removeEventListener("dispose",Fp);const r=Bp.get(t);void 0!==r&&(Bp.delete(t),r.dispose())}function Ip(e,t){t===Z?e.mapping=R:t===J&&(e.mapping=C)}const Dp=Oi(Lp).setParameterLength(1);class Vp extends wh{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Dp(this.envNode)}}class Up extends wh{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Yi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Op{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class kp extends Op{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(ln(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(ln(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(_n.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case re:s.rgb.assign(ko(s.rgb,s.rgb.mul(i.rgb),_c.mul(vc)));break;case te:s.rgb.assign(ko(s.rgb,i.rgb,_c.mul(vc)));break;case ee:s.rgb.addAssign(i.rgb.mul(_c.mul(vc)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Gp=new se;class zp extends yp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Gp),this.setValues(e)}setupNormal(){return ed(id)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Up(Xc)),t}setupOutgoingLight(){return _n.rgb}setupLightingModel(){return new kp}}const Hp=$i(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),$p=$i(e=>e.diffuseColor.mul(1/Math.PI)),Wp=$i(({dotNH:e})=>Un.mul(Yi(.5)).add(1).mul(Yi(1/Math.PI)).mul(e.pow(Un))),qp=$i(({lightDirection:e})=>{const t=e.add(Yl).normalize(),r=ad.dot(t).clamp(),s=Yl.dot(t).clamp(),i=Hp({f0:Dn,f90:1,dotVH:s}),n=Yi(.25),a=Wp({dotNH:r});return i.mul(n).mul(a)});class jp extends kp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=ad.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul($p({diffuseColor:_n.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(qp({lightDirection:e})).mul(_c))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul($p({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Xp=new ie;class Kp extends yp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Xp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightingModel(){return new jp(!1)}}const Yp=new ne;class Qp extends yp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Yp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightingModel(){return new jp}setupVariants(){const e=(this.shininessNode?Yi(this.shininessNode):mc).max(1e-4);Un.assign(e);const t=this.specularNode||bc;Dn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Zp=$i(e=>{if(!1===e.geometry.hasAttribute("normal"))return Yi(0);const t=id.dFdx().abs().max(id.dFdy().abs());return t.x.max(t.y).max(t.z)}),Jp=$i(e=>{const{roughness:t}=e,r=Zp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),eg=$i(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return ga(.5,i.add(n).max(Ua))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),tg=$i(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(nn(e.mul(r),t.mul(s),a).length()),l=a.mul(nn(e.mul(i),t.mul(n),o).length());return ga(.5,u.add(l)).saturate()}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),rg=$i(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),sg=Yi(1/Math.PI),ig=$i(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=nn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return sg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),ng=$i(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=ad,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Yl).normalize(),d=n.dot(e).clamp(),c=n.dot(Yl).clamp(),h=n.dot(l).clamp(),p=Yl.dot(l).clamp();let g,m,f=Hp({f0:t,f90:r,dotVH:p});if(Bi(a)&&(f=Cn.mix(f,i)),Bi(o)){const t=Fn.dot(e),r=Fn.dot(Yl),s=Fn.dot(l),i=In.dot(e),n=In.dot(Yl),a=In.dot(l);g=tg({alphaT:Bn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=ig({alphaT:Bn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=eg({alpha:u,dotNL:d,dotNV:c}),m=rg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),ag=$i(({roughness:e,dotNV:t})=>{const r=ln(-1,-.0275,-.572,.022),s=ln(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return en(-1.04,1.04).mul(n).add(i.zw)}).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),og=$i(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=ag({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),ug=$i(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(nn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),lg=$i(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Yi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Yi(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),dg=$i(({dotNV:e,dotNL:t})=>Yi(1).div(Yi(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),cg=$i(({lightDirection:e})=>{const t=e.add(Yl).normalize(),r=ad.dot(e).clamp(),s=ad.dot(Yl).clamp(),i=ad.dot(t).clamp(),n=lg({roughness:Rn,dotNH:i}),a=dg({dotNV:s,dotNL:r});return An.mul(n).mul(a)}),hg=$i(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=en(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),pg=$i(({f:e})=>{const t=e.length();return wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),gg=$i(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,wo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),mg=$i(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=nn().toVar();return ji(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(gn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=nn(0).toVar();f.addAssign(gg({v1:h,v2:p})),f.addAssign(gg({v1:p,v2:g})),f.addAssign(gg({v1:g,v2:m})),f.addAssign(gg({v1:m,v2:h})),c.assign(nn(pg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),fg=$i(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=nn().toVar();return ji(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=nn(0).toVar();d.addAssign(gg({v1:n,v2:a})),d.addAssign(gg({v1:a,v2:o})),d.addAssign(gg({v1:o,v2:l})),d.addAssign(gg({v1:l,v2:n})),u.assign(nn(pg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),yg=1/6,bg=e=>pa(yg,pa(e,pa(e,e.negate().add(3)).sub(3)).add(1)),xg=e=>pa(yg,pa(e,pa(e,pa(3,e).sub(6))).add(4)),Tg=e=>pa(yg,pa(e,pa(e,pa(-3,e).add(3)).add(3)).add(1)),_g=e=>pa(yg,Lo(e,3)),vg=e=>bg(e).add(xg(e)),Ng=e=>Tg(e).add(_g(e)),Sg=e=>ca(-1,xg(e).div(bg(e).add(xg(e)))),Eg=e=>ca(1,_g(e).div(Tg(e).add(_g(e)))),wg=(e,t,r)=>{const s=e.uvNode,i=pa(s,t.zw).add(.5),n=Za(i),a=to(i),o=vg(a.x),u=Ng(a.x),l=Sg(a.x),d=Eg(a.x),c=Sg(a.y),h=Eg(a.y),p=en(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=en(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=en(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=en(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=vg(a.y).mul(ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Ng(a.y).mul(ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Ag=$i(([e,t])=>{const r=en(e.size(Qi(t))),s=en(e.size(Qi(t.add(1)))),i=ga(1,r),n=ga(1,s),a=wg(e,ln(i,r),Za(t)),o=wg(e,ln(n,s),Ja(t));return to(t).mix(a,o)}),Rg=$i(([e,t])=>{const r=t.mul(rl(e));return Ag(e,r)}),Cg=$i(([e,t,r,s,i])=>{const n=nn(Ho(t.negate(),eo(e),ga(1,s))),a=nn(co(i[0].xyz),co(i[1].xyz),co(i[2].xyz));return eo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),Mg=$i(([e,t])=>e.mul(Go(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Pg=Wh(),Bg=Wh(),Lg=$i(([e,t,r],{material:s})=>{const i=(s.side===S?Pg:Bg).sample(e),n=Ka(Ih.x).mul(Mg(t,r));return Ag(i,n)}),Fg=$i(([e,t,r])=>(ji(r.notEqual(0),()=>{const s=Xa(t).negate().div(r);return qa(s.negate().mul(e))}),nn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Ig=$i(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ln().toVar(),f=nn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=nn(d.sub(i),d,d.add(i));xh({start:0,end:3},({i:i})=>{const d=n.element(i),g=Cg(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(ln(y,1))),x=en(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(en(x.x,x.y.oneMinus()));const T=Lg(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Fg(co(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Cg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(ln(n,1))),y=en(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(en(y.x,y.y.oneMinus())),m=Lg(y,r,d),f=s.mul(Fg(co(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=nn(og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ln(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Dg=gn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Vg=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Ug=$i(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ko(e,t,$o(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ji(a.lessThan(0),()=>nn(1));const o=a.sqrt(),u=Vg(n,e),l=Hp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Yi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return nn(1).add(t).div(nn(1).sub(t))})(i.clamp(0,.9999)),g=Vg(p,n.toVec3()),m=Hp({f0:g,f90:1,dotVH:o}),f=nn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=nn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(nn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return xh({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=nn(54856e-17,44201e-17,52481e-17),i=nn(1681e3,1795300,2208400),n=nn(43278e5,93046e5,66121e5),a=Yi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=nn(o.x.add(a),o.y,o.z).div(1.0685e-7),Dg.mul(o)})(Yi(e).mul(y),Yi(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(nn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),Og=$i(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=eu(r.lessThan(.25),Yi(-339.2).mul(i).add(Yi(161.4).mul(r)).sub(25.9),Yi(-8.48).mul(i).add(Yi(14.3).mul(r)).sub(9.95)),a=eu(r.lessThan(.25),Yi(44).mul(i).sub(Yi(23.7).mul(r)).add(3.26),Yi(1.97).mul(i).sub(Yi(3.27).mul(r)).add(.72));return eu(r.lessThan(.25),0,Yi(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()}),kg=nn(.04),Gg=Yi(1);class zg extends Op{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=nn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=nn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=nn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=nn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=nn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=ad.dot(Yl).clamp();this.iridescenceFresnel=Ug({outsideIOR:Yi(1),eta2:Mn,cosTheta1:e,thinFilmThickness:Pn,baseF0:Dn}),this.iridescenceF0=ug({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=jl,r=vl.sub(jl).normalize(),s=od,i=e.context;i.backdrop=Ig(s,r,Nn,_n,Dn,Vn,t,Ll,xl,yl,Hn,Wn,jn,qn,this.dispersion?Xn:null),i.backdropAlpha=$n,_n.a.mulAssign(ko(1,i.backdrop.a,$n))}super.start(e)}computeMultiscattering(e,t,r){const s=ad.dot(Yl).clamp(),i=ag({roughness:Nn,dotNV:s}),n=(this.iridescenceF0?Cn.mix(Dn,this.iridescenceF0):Dn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Dn.add(Dn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=ad.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(cg({lightDirection:e}))),!0===this.clearcoat){const r=ud.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(ng({lightDirection:e,f0:kg,f90:Gg,roughness:wn,normalView:ud})))}r.directDiffuse.addAssign(s.mul($p({diffuseColor:_n.rgb}))),r.directSpecular.addAssign(s.mul(ng({lightDirection:e,f0:Dn,f90:1,roughness:Nn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=ad,h=Yl,p=Kl.toVar(),g=hg({N:c,V:h,roughness:Nn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=gn(nn(m.x,0,m.y),nn(0,1,0),nn(m.z,0,m.w)).toVar(),b=Dn.mul(f.x).add(Dn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(mg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(_n).mul(mg({N:c,V:h,P:p,mInv:gn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul($p({diffuseColor:_n})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(An,Og({normal:ad,viewDir:Yl,roughness:Rn}))),!0===this.clearcoat){const e=ud.dot(Yl).clamp(),t=og({dotNV:e,specularColor:kg,specularF90:Gg,roughness:wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=nn().toVar("singleScattering"),n=nn().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Vn);const o=i.add(n),u=_n.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=ad.dot(Yl).clamp().add(t),i=Nn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ud.dot(Yl).clamp(),r=Hp({dotVH:e,f0:kg,f90:Gg}),s=t.mul(En.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(En));t.assign(s)}if(!0===this.sheen){const e=An.r.max(An.g).max(An.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Hg=Yi(1),$g=Yi(-2),Wg=Yi(.8),qg=Yi(-1),jg=Yi(.4),Xg=Yi(2),Kg=Yi(.305),Yg=Yi(3),Qg=Yi(.21),Zg=Yi(4),Jg=Yi(4),em=Yi(16),tm=$i(([e])=>{const t=nn(uo(e)).toVar(),r=Yi(-1).toVar();return ji(t.x.greaterThan(t.z),()=>{ji(t.x.greaterThan(t.y),()=>{r.assign(eu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}).Else(()=>{ji(t.z.greaterThan(t.y),()=>{r.assign(eu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),rm=$i(([e,t])=>{const r=en().toVar();return ji(t.equal(0),()=>{r.assign(en(e.z,e.y).div(uo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(en(e.x.negate(),e.z.negate()).div(uo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(en(e.x.negate(),e.y).div(uo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(en(e.z.negate(),e.y).div(uo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(en(e.x.negate(),e.z).div(uo(e.y)))}).Else(()=>{r.assign(en(e.x,e.y).div(uo(e.z)))}),pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),sm=$i(([e])=>{const t=Yi(0).toVar();return ji(e.greaterThanEqual(Wg),()=>{t.assign(Hg.sub(e).mul(qg.sub($g)).div(Hg.sub(Wg)).add($g))}).ElseIf(e.greaterThanEqual(jg),()=>{t.assign(Wg.sub(e).mul(Xg.sub(qg)).div(Wg.sub(jg)).add(qg))}).ElseIf(e.greaterThanEqual(Kg),()=>{t.assign(jg.sub(e).mul(Yg.sub(Xg)).div(jg.sub(Kg)).add(Xg))}).ElseIf(e.greaterThanEqual(Qg),()=>{t.assign(Kg.sub(e).mul(Zg.sub(Yg)).div(Kg.sub(Qg)).add(Yg))}).Else(()=>{t.assign(Yi(-2).mul(Ka(pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),im=$i(([e,t])=>{const r=e.toVar();r.assign(pa(2,r).sub(1));const s=nn(r,1).toVar();return ji(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),nm=$i(([e,t,r,s,i,n])=>{const a=Yi(r),o=nn(t),u=Go(sm(a),$g,n),l=to(u),d=Za(u),c=nn(am(e,o,d,s,i,n)).toVar();return ji(l.notEqual(0),()=>{const t=nn(am(e,o,d.add(1),s,i,n)).toVar();c.assign(ko(c,t,l))}),c}),am=$i(([e,t,r,s,i,n])=>{const a=Yi(r).toVar(),o=nn(t),u=Yi(tm(o)).toVar(),l=Yi(wo(Jg.sub(a),0)).toVar();a.assign(wo(a,Jg));const d=Yi(ja(a)).toVar(),c=en(rm(o,u).mul(d.sub(2)).add(1)).toVar();return ji(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(pa(3,em))),c.y.addAssign(pa(4,ja(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(en(),en())}),om=$i(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=so(s),l=r.mul(u).add(i.cross(r).mul(ro(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return am(e,l,t,n,a,o)}),um=$i(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=nn(eu(t,r,Bo(r,s))).toVar();ji(h.equal(nn(0)),()=>{h.assign(nn(s.z,0,s.x.negate()))}),h.assign(eo(h));const p=nn().toVar();return p.addAssign(i.element(0).mul(om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),xh({start:Qi(1),end:e},({i:e})=>{ji(e.greaterThanEqual(n),()=>{Th()});const t=Yi(a.mul(Yi(e))).toVar();p.addAssign(i.element(e).mul(om({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),ln(p,1)}),lm=[.125,.215,.35,.446,.526,.582],dm=20,cm=new ae(-1,1,1,-1,0,1),hm=new oe(90,1),pm=new e;let gm=null,mm=0,fm=0;const ym=(1+Math.sqrt(5))/2,bm=1/ym,xm=[new r(-ym,bm,0),new r(ym,bm,0),new r(-bm,0,ym),new r(bm,0,ym),new r(0,ym,-bm),new r(0,ym,bm),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Tm=new r,_m=new WeakMap,vm=[3,1,5,0,4,2],Nm=im(Zu(),Qu("faceIndex")).normalize(),Sm=nn(Nm.x,Nm.y,Nm.z);class Em{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Tm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}gm=this._renderer.getRenderTarget(),mm=this._renderer.getActiveCubeFace(),fm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Cm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Mm(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===R||e.mapping===C?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=lm[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=vm[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new pe;_.setAttribute("position",new ge(b,m)),_.setAttribute("uv",new ge(x,f)),_.setAttribute("faceIndex",new ge(T,y)),t.push(_),i.push(new X(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(t)),this._blurMaterial=function(e,t,s){const i=hl(new Array(dm).fill(0)),n=ra(new r(0,1,0)),a=ra(0),o=Yi(dm),u=ra(0),l=ra(1),d=al(null),c=ra(0),h=Yi(1/t),p=Yi(1/s),g=Yi(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Sm,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Rm("blur");return f.fragmentNode=um({...m,latitudinal:u.equal(1)}),_m.set(f,m),f}(t,e.width,e.height)}}async _compileMaterial(e){const t=new X(this._lodPlanes[0],e);await this._renderer.compile(t,cm)}_sceneToCubeUV(e,t,r,s,i){const n=hm;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(pm),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new se({name:"PMREM.Background",side:S,depthWrite:!1,depthTest:!1});d=new X(new j,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(pm),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Am(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===R||e.mapping===C;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Cm(e)):null===this._equirectMaterial&&(this._equirectMaterial=Mm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Am(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,cm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tdm&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),o.setRenderTarget(t),o.render(l,cm)}}function wm(e,t){const r=new ue(e,t,{magFilter:Y,minFilter:Y,generateMipmaps:!1,type:ce,format:de,colorSpace:le});return r.texture.mapping=he,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Am(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Rm(e){const t=new yp;return t.depthTest=!1,t.depthWrite=!1,t.blending=H,t.name=`PMREM_${e}`,t}function Cm(e){const t=Rm("cubemap");return t.fragmentNode=wd(e,Sm),t}function Mm(e){const t=Rm("equirect");return t.fragmentNode=al(e,Mp(Sm),0),t}const Pm=new WeakMap;function Bm(e,t,r){const s=function(e){let t=Pm.get(e);void 0===t&&(t=new WeakMap,Pm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Lm extends Ys{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new x;s.isRenderTargetTexture=!0,this._texture=al(s),this._width=ra(0),this._height=ra(0),this._maxMip=ra(0),this.updateBeforeType=Us.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Bm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Em(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=bd.mul(nn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),nm(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Fm=Oi(Lm).setParameterLength(1,3),Im=new WeakMap;class Dm extends wh{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Im.get(e);void 0===s&&(s=Fm(e),Im.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?ic:ad,i=r.context(Vm(Nn,s)).mul(yd),n=r.context(Um(od)).mul(Math.PI).mul(yd),a=Vu(i),o=Vu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Vm(wn,ud)).mul(yd),t=Vu(e);u.addAssign(t)}}}const Vm=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Yl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(xl)),r),getTextureLevel:()=>e}},Um=e=>({getUV:()=>e,getTextureLevel:()=>Yi(1)}),Om=new me;class km extends yp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Om),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Dm(t):null}setupLightingModel(){return new zg}setupSpecular(){const e=ko(nn(.04),_n.rgb,Sn);Dn.assign(e),Vn.assign(1)}setupVariants(){const e=this.metalnessNode?Yi(this.metalnessNode):Sc;Sn.assign(e);let t=this.roughnessNode?Yi(this.roughnessNode):Nc;t=Jp({roughness:t}),Nn.assign(t),this.setupSpecular(),_n.assign(ln(_n.rgb.mul(e.oneMinus()),_n.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Gm=new fe;class zm extends km{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(Gm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Yi(this.iorNode):Uc;Hn.assign(e),Dn.assign(ko(Eo(Fo(Hn.sub(1).div(Hn.add(1))).mul(Tc),nn(1)).mul(xc),_n.rgb,Sn)),Vn.assign(ko(xc,1,Sn))}setupLightingModel(){return new zg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Yi(this.clearcoatNode):wc,t=this.clearcoatRoughnessNode?Yi(this.clearcoatRoughnessNode):Ac;En.assign(e),wn.assign(Jp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?nn(this.sheenNode):Mc,t=this.sheenRoughnessNode?Yi(this.sheenRoughnessNode):Pc;An.assign(e),Rn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Yi(this.iridescenceNode):Lc,t=this.iridescenceIORNode?Yi(this.iridescenceIORNode):Fc,r=this.iridescenceThicknessNode?Yi(this.iridescenceThicknessNode):Ic;Cn.assign(e),Mn.assign(t),Pn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?en(this.anisotropyNode):Bc).toVar();Ln.assign(e.length()),ji(Ln.equal(0),()=>{e.assign(en(1,0))}).Else(()=>{e.divAssign(en(Ln)),Ln.assign(Ln.saturate())}),Bn.assign(Ln.pow2().mix(Nn.pow2(),1)),Fn.assign(rc[0].mul(e.x).add(rc[1].mul(e.y))),In.assign(rc[1].mul(e.x).sub(rc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Yi(this.transmissionNode):Dc,t=this.thicknessNode?Yi(this.thicknessNode):Vc,r=this.attenuationDistanceNode?Yi(this.attenuationDistanceNode):Oc,s=this.attenuationColorNode?nn(this.attenuationColorNode):kc;if($n.assign(e),Wn.assign(t),qn.assign(r),jn.assign(s),this.useDispersion){const e=this.dispersionNode?Yi(this.dispersionNode):jc;Xn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?nn(this.clearcoatNormalNode):Rc}setup(e){e.context.setupClearcoatNormal=()=>cu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Hm extends zg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(ad.mul(a)).normalize(),h=Yi(Yl.dot(c.negate()).saturate().pow(l).mul(d)),p=nn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $m extends zm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Yi(.1),this.thicknessAmbientNode=Yi(0),this.thicknessAttenuationNode=Yi(.1),this.thicknessPowerNode=Yi(2),this.thicknessScaleNode=Yi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Hm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Wm=$i(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=en(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Bd("gradientMap","texture").context({getUV:()=>i});return nn(e.r)}{const e=i.fwidth().mul(.5);return ko(nn(.7),nn(1),$o(Yi(.7).sub(e.x),Yi(.7).add(e.x),i.x))}});class qm extends Op{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wm({normal:td,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul($p({diffuseColor:_n.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul($p({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const jm=new ye;class Xm extends yp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(jm),this.setValues(e)}setupLightingModel(){return new qm}}const Km=$i(()=>{const e=nn(Yl.z,0,Yl.x.negate()).normalize(),t=Yl.cross(e);return en(e.dot(ad),t.dot(ad)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Ym=new be;class Qm extends yp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Ym),this.setValues(e)}setupVariants(e){const t=Km;let r;r=e.material.matcap?Bd("matcap","texture").context({getUV:()=>t}):nn(ko(.2,.8,t.y)),_n.rgb.mulAssign(r.rgb)}}class Zm extends Ys{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return pn(e,s,s.negate(),e).mul(r)}{const e=t,s=mn(ln(1,0,0,0),ln(0,so(e.x),ro(e.x).negate(),0),ln(0,ro(e.x),so(e.x),0),ln(0,0,0,1)),i=mn(ln(so(e.y),0,ro(e.y),0),ln(0,1,0,0),ln(ro(e.y).negate(),0,so(e.y),0),ln(0,0,0,1)),n=mn(ln(so(e.z),ro(e.z).negate(),0,0),ln(ro(e.z),so(e.z),0,0),ln(0,0,1,0),ln(0,0,0,1));return s.mul(i).mul(n).mul(ln(r,1)).xyz}}}const Jm=Oi(Zm).setParameterLength(2),ef=new xe;class tf extends yp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ef),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=kl.mul(nn(i||0));let u=en(Ll[0].xyz.length(),Ll[1].xyz.length());if(null!==a&&(u=u.mul(en(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=Yi(2).div(yl.element(1).element(1));u=u.mul(e.mul(2))}let l=$l.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ii(new vu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Yi(n||Cc),c=Jm(l,d);return ln(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const rf=new Te;class sf extends tf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(rf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return kl.mul(nn(e||Wl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=$l.xy.toVar(),a=Vh.z.div(Vh.w);if(r&&r.isNode){const e=Yi(r);n.assign(Jm(n,e))}let o=null!==i?en(i):qc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Kl.z.negate()))),s&&s.isNode&&(o=o.mul(en(s))),n.mulAssign(o.mul(2)),n.assign(n.div(Vh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(ln(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class nf extends Op{constructor(){super(),this.shadowNode=Yi(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){_n.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(_n.rgb)}}const af=new _e;class of extends yp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(af),this.setValues(e)}setupLightingModel(){return new nf}}const uf=xn("vec3"),lf=xn("vec3"),df=xn("vec3");class cf extends Op{constructor(){super()}start(e){const{material:t,context:r}=e,s=xn("vec3"),i=xn("vec3");ji(vl.sub(jl).length().greaterThan(Vl.mul(2)),()=>{s.assign(vl),i.assign(jl)}).Else(()=>{s.assign(jl),i.assign(vl)});const n=i.sub(s),a=ra("int").onRenderUpdate(({material:e})=>e.steps),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=Yi(0).toVar(),d=nn(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),xh(a,()=>{const i=s.add(u.mul(l)),n=xl.mul(ln(i,1)).xyz;let a;null!==t.depthNode&&(lf.assign(rp(Qh(n.z,ml,fl))),r.sceneDepthNode=rp(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,uf.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&uf.mulAssign(a);const c=uf.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)}),df.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ji(r.greaterThanEqual(lf),()=>{uf.addAssign(e)}):uf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(fg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(df)}}class hf extends yp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=S,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cf}}class pf{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class gf{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yf=[];class bf{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);yf[0]=e,yf[1]=t,yf[2]=n,yf[3]=i;let l=u.get(yf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yf,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),yf.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new ff(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xf{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Tf=1,_f=2,vf=3,Nf=4,Sf=16;class Ef extends xf{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Tf?this.backend.createAttribute(e):t===_f?this.backend.createIndexAttribute(e):t===vf?this.backend.createStorageAttribute(e):t===Nf&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vf):this.updateAttribute(e,Tf);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_f);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Nf)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Af(t),e.set(t,r)):r.version!==wf(t)&&(this.attributes.delete(r),r=Af(t),e.set(t,r)),s=r}return s}}class Cf{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class Mf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Pf extends Mf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Bf extends Mf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Lf=0;class Ff{constructor(e,t,r,s=null,i=null){this.id=Lf++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class If extends xf{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ff(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ff(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ff(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Bf(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new Pf(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Df extends xf{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Nf:vf;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Nf:vf;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else t.isSampler&&t.update()}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Vf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Of(e){return(e.transmission>0||e.transmissionNode)&&e.side===E&&!1===e.forceSinglePass}class kf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Of(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(Of(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Vf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Uf),this.transparent.length>1&&this.transparent.sort(t||Uf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new U,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:T,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Yf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Zf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class Jf extends bn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class ey extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Fi(t);return this._currentCond=eu(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=eu(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Ii(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=0;for(const r of this.membersLayout){const s=r.type,i=Cs(s)*e,n=t%8,a=n%Ms(s),o=n+a;t+=a,0!==o&&8-oe.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class sy extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class iy extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),dy=(e,t)=>Lo(pa(4,e.mul(ha(1,e))),t),cy=$i(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),hy=$i(([e])=>nn(cy(e.z.add(cy(e.y.mul(1)))),cy(e.z.add(cy(e.x.mul(1)))),cy(e.y.add(cy(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),py=$i(([e,t,r])=>{const s=nn(e).toVar(),i=Yi(1.4).toVar(),n=Yi(0).toVar(),a=nn(s).toVar();return xh({start:Yi(0),end:Yi(3),type:"float",condition:"<="},()=>{const e=nn(hy(a.mul(2))).toVar();s.addAssign(e.add(r.mul(Yi(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=Yi(cy(s.z.add(cy(s.x.add(cy(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class gy extends js{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const my=Oi(gy),fy=e=>(...t)=>my(e,...t),yy=ra(0).setGroup(Jn).onRenderUpdate(e=>e.time),by=ra(0).setGroup(Jn).onRenderUpdate(e=>e.deltaTime),xy=ra(0,"uint").setGroup(Jn).onRenderUpdate(e=>e.frameId),Ty=$i(([e,t,r=en(.5)])=>Jm(e.sub(r),t).add(r)),_y=$i(([e,t,r=en(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),vy=$i(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Ll.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Ll;const i=xl.mul(s);return Bi(t)&&(i[0][0]=Ll[0].length(),i[0][1]=0,i[0][2]=0),Bi(r)&&(i[1][0]=0,i[1][1]=Ll[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,yl.mul(i).mul(Wl)}),Ny=$i(([e=null])=>{const t=rp();return rp(Xh(e)).sub(t).lessThan(0).select(Fh,e)});class Sy extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Zu(),r=Yi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=en(a,o);return t.add(l).mul(u)}}const Ey=Oi(Sy).setParameterLength(3),wy=$i(([e,t=null,r=null,s=Yi(1),i=Wl,n=rd])=>{let a=n.abs().normalize();a=a.div(a.dot(nn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=al(d,o).mul(a.x),g=al(c,u).mul(a.y),m=al(h,l).mul(a.z);return ca(p,g,m)}),Ay=new Me,Ry=new r,Cy=new r,My=new r,Py=new a,By=new r(0,0,-1),Ly=new s,Fy=new r,Iy=new r,Dy=new s,Vy=new t,Uy=new ue,Oy=Fh.flipX();Uy.depthTexture=new U(1,1);let ky=!1;class Gy extends il{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Uy.texture,Oy),this._reflectorBaseNode=e.reflector||new zy(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Ii(new Gy({defaultTexture:Uy.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class zy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Vy),e.setSize(Math.round(Vy.width*r),Math.round(Vy.height*r))}setup(e){return this._updateResolution(Uy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ue(0,0,{type:ce,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new U),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&ky)return!1;ky=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Vy),this._updateResolution(o,s),Cy.setFromMatrixPosition(n.matrixWorld),My.setFromMatrixPosition(r.matrixWorld),Py.extractRotation(n.matrixWorld),Ry.set(0,0,1),Ry.applyMatrix4(Py),Fy.subVectors(Cy,My);let u=!1;if(!0===Fy.dot(Ry)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(ky=!1);u=!0}Fy.reflect(Ry).negate(),Fy.add(Cy),Py.extractRotation(r.matrixWorld),By.set(0,0,-1),By.applyMatrix4(Py),By.add(My),Iy.subVectors(Cy,By),Iy.reflect(Ry).negate(),Iy.add(Cy),a.coordinateSystem=r.coordinateSystem,a.position.copy(Fy),a.up.set(0,1,0),a.up.applyMatrix4(Py),a.up.reflect(Ry),a.lookAt(Iy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Ay.setFromNormalAndCoplanarPoint(Ry,Cy),Ay.applyMatrix4(a.matrixWorldInverse),Ly.set(Ay.normal.x,Ay.normal.y,Ay.normal.z,Ay.constant);const l=a.projectionMatrix;Dy.x=(Math.sign(Ly.x)+l.elements[8])/l.elements[0],Dy.y=(Math.sign(Ly.y)+l.elements[9])/l.elements[5],Dy.z=-1,Dy.w=(1+l.elements[10])/l.elements[14],Ly.multiplyScalar(1/Ly.dot(Dy));l.elements[2]=Ly.x,l.elements[6]=Ly.y,l.elements[10]=s.coordinateSystem===d?Ly.z-0:Ly.z+1-0,l.elements[14]=Ly.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const c=s.getRenderTarget(),h=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),s.setMRT(h),s.setRenderTarget(c),s.autoClear=p,i.visible=!0,ky=!1,this.forceUpdate=!1}}const Hy=new ae(-1,1,1,-1,0,1);class $y extends pe{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Le([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Le(t,2))}}const Wy=new $y;class qy extends X{constructor(e=null){super(Wy,e),this.camera=Hy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,Hy)}render(e){e.render(this,Hy)}}const jy=new t;class Xy extends il{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ce}){const i=new ue(t,r,s);super(i.texture,Zu()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new qy(new yp),this.updateBeforeType=Us.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(jy),s=r.width*t,i=r.height*t;s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new il(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Ky=(e,...t)=>Ii(new Xy(Ii(e),...t)),Yy=$i(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=en(e.x,e.y.oneMinus()).mul(2).sub(1),i=ln(nn(e,t),1)):i=ln(nn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ln(r.mul(i));return n.xyz.div(n.w)}),Qy=$i(([e,t])=>{const r=t.mul(ln(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return en(s.x,s.y.oneMinus())}),Zy=$i(([e,t,r])=>{const s=el(ol(t)),i=tn(e.mul(s)).toVar(),n=ol(t,i).toVar(),a=ol(t,i.sub(tn(2,0))).toVar(),o=ol(t,i.sub(tn(1,0))).toVar(),u=ol(t,i.add(tn(1,0))).toVar(),l=ol(t,i.add(tn(2,0))).toVar(),d=ol(t,i.add(tn(0,2))).toVar(),c=ol(t,i.add(tn(0,1))).toVar(),h=ol(t,i.sub(tn(0,1))).toVar(),p=ol(t,i.sub(tn(0,2))).toVar(),g=uo(ha(Yi(2).mul(o).sub(a),n)).toVar(),m=uo(ha(Yi(2).mul(u).sub(l),n)).toVar(),f=uo(ha(Yi(2).mul(c).sub(d),n)).toVar(),y=uo(ha(Yi(2).mul(h).sub(p),n)).toVar(),b=Yy(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Yy(e.sub(en(Yi(1).div(s.x),0)),o,r)),b.negate().add(Yy(e.add(en(Yi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Yy(e.add(en(0,Yi(1).div(s.y))),c,r)),b.negate().add(Yy(e.sub(en(0,Yi(1).div(s.y))),h,r)));return eo(Bo(x,T))});class Jy extends js{static get type(){return"SampleNode"}constructor(e){super(),this.callback=e,this.isSampleNode=!0}setup(){return this.sample(Zu())}sample(e){return this.callback(e)}}class eb extends js{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===eb.OBJECT?this.updateType=Us.OBJECT:e===eb.MATERIAL&&(this.updateType=Us.RENDER)}update(e){this.callback(e)}}eb.OBJECT="object",eb.MATERIAL="material";const tb=(e,t)=>Ii(new eb(e,t)).toStack();class rb extends L{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class sb extends ge{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class ib extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const nb=ki(ib),ab=new w,ob=new a;class ub extends js{static get type(){return"SceneNode"}constructor(e=ub.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ub.BACKGROUND_BLURRINESS?s=Cd("backgroundBlurriness","float",r):t===ub.BACKGROUND_INTENSITY?s=Cd("backgroundIntensity","float",r):t===ub.BACKGROUND_ROTATION?s=ra("mat4").setName("backgroundRotation").setGroup(Jn).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Fe?(ab.copy(r.backgroundRotation),ab.x*=-1,ab.y*=-1,ab.z*=-1,ob.makeRotationFromEuler(ab)):ob.identity(),ob}):console.error("THREE.SceneNode: Unknown scope:",t),s}}ub.BACKGROUND_BLURRINESS="backgroundBlurriness",ub.BACKGROUND_INTENSITY="backgroundIntensity",ub.BACKGROUND_ROTATION="backgroundRotation";const lb=ki(ub,ub.BACKGROUND_BLURRINESS),db=ki(ub,ub.BACKGROUND_INTENSITY),cb=ki(ub,ub.BACKGROUND_ROTATION);class hb extends il{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e}}const pb=Oi(hb).setParameterLength(1,3),gb=$i(({texture:e,uv:t})=>{const r=1e-4,s=nn().toVar();return ji(t.x.lessThan(r),()=>{s.assign(nn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(nn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(nn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(nn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(nn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(nn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(nn(-.01,0,0))).r.sub(e.sample(t.add(nn(r,0,0))).r),n=e.sample(t.add(nn(0,-.01,0))).r.sub(e.sample(t.add(nn(0,r,0))).r),a=e.sample(t.add(nn(0,0,-.01))).r.sub(e.sample(t.add(nn(0,0,r))).r);s.assign(nn(i,n,a))}),s.normalize()});class mb extends il{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return nn(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Qi(el(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return gb({texture:this,uv:e})}}const fb=Oi(mb).setParameterLength(1,3);class yb extends Rd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const bb=new WeakMap;class xb extends Ys{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=ra(new a),this.previousProjectionMatrix=ra(new a).setGroup(Jn),this.previousCameraViewMatrix=ra(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=_b(r);this.previousModelWorldMatrix.value.copy(s);const i=Tb(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){_b(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?yl:ra(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(kl).mul(Wl),s=this.previousProjectionMatrix.mul(t).mul(ql),i=r.xy.div(r.w),n=s.xy.div(s.w);return ha(i,n)}}function Tb(e){let t=bb.get(e);return void 0===t&&(t={},bb.set(e,t)),t}function _b(e,t=0){const r=Tb(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const vb=ki(xb),Nb=$i(([e])=>Ab(e.rgb)),Sb=$i(([e,t=Yi(1)])=>t.mix(Ab(e.rgb),e.rgb)),Eb=$i(([e,t=Yi(1)])=>{const r=ca(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return ko(e.rgb,s,i)}),wb=$i(([e,t=Yi(1)])=>{const r=nn(.57735,.57735,.57735),s=t.cos();return nn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Po(r,e.rgb).mul(s.oneMinus())))))}),Ab=(e,t=nn(c.getLuminanceCoefficients(new r)))=>Po(e,t),Rb=$i(([e,t=nn(1),s=nn(0),i=nn(1),n=Yi(1),a=nn(c.getLuminanceCoefficients(new r,le))])=>{const o=e.rgb.dot(nn(a)),u=wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ji(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ji(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ji(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),ln(u.rgb,e.a)});class Cb extends Ys{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Mb=Oi(Cb).setParameterLength(2),Pb=new t;class Bb extends il{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Lb extends Bb{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}class Fb extends Ys{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new U;i.isRenderTargetTexture=!0,i.name="depth";const n=new ue(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ce,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ra(0),this._cameraFar=ra(0),this._mrt=null,this._layers=null,this._resolution=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Us.FRAME,this.global=!0}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Ii(new Lb(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Ii(new Lb(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Zh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Yh(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getColorBufferType(),this.scope===Fb.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Pb.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Pb)),this._pixelRatio=i,this.setSize(Pb.width,Pb.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolution).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolution).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Fb.COLOR="color",Fb.DEPTH="depth";class Ib extends Fb{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Fb.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new yp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=S;const t=rd.negate(),r=yl.mul(kl),s=Yi(1),i=r.mul(ln(Wl,1)),n=r.mul(ln(Wl.add(t),1)),a=eo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ln(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Db=$i(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vb=$i(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ub=$i(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ob=$i(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),kb=$i(([e,t])=>{const r=gn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=gn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Ob(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gb=gn(nn(1.6605,-.1246,-.0182),nn(-.5876,1.1329,-.1006),nn(-.0728,-.0083,1.1187)),zb=gn(nn(.6274,.0691,.0164),nn(.3293,.9195,.088),nn(.0433,.0113,.8956)),Hb=$i(([e])=>{const t=nn(e).toVar(),r=nn(t.mul(t)).toVar(),s=nn(r.mul(r)).toVar();return Yi(15.5).mul(s.mul(r)).sub(pa(40.14,s.mul(t))).add(pa(31.96,s).sub(pa(6.868,r.mul(t))).add(pa(.4298,r).add(pa(.1191,t).sub(.00232))))}),$b=$i(([e,t])=>{const r=nn(e).toVar(),s=gn(nn(.856627153315983,.137318972929847,.11189821299995),nn(.0951212405381588,.761241990602591,.0767994186031903),nn(.0482516061458583,.101439036467562,.811302368396859)),i=gn(nn(1.1271005818144368,-.1413297634984383,-.14132976349843826),nn(-.11060664309660323,1.157823702216272,-.11060664309660294),nn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Yi(-12.47393),a=Yi(4.026069);return r.mulAssign(t),r.assign(zb.mul(r)),r.assign(s.mul(r)),r.assign(wo(r,1e-10)),r.assign(Ka(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Go(r,0,1)),r.assign(Hb(r)),r.assign(i.mul(r)),r.assign(Lo(wo(nn(0),r),nn(2.2))),r.assign(Gb.mul(r)),r.assign(Go(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Wb=$i(([e,t])=>{const r=Yi(.76),s=Yi(.15);e=e.mul(t);const i=Eo(e.r,Eo(e.g,e.b)),n=eu(i.lessThan(.08),i.sub(pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=wo(e.r,wo(e.g,e.b));ji(a.lessThan(r),()=>e);const o=ha(1,r),u=ha(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ha(1,ga(1,s.mul(a.sub(u)).add(1)));return ko(e,nn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class qb extends js{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const jb=Oi(qb).setParameterLength(1,3);class Xb extends qb{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Kb=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Yb extends js{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Yi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Fs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Is(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Qb=Oi(Yb).setParameterLength(1);class Zb extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Jb{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const ex=new Zb;class tx extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Zb,this._output=Qb(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Qb(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Qb(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Jb(this),t=ex.get("THREE"),r=ex.get("TSL"),s=this.getMethod(),i=[e,this._local,ex,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Yi()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const rx=Oi(tx).setParameterLength(1,2);function sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Kl.z).negate()}const ix=$i(([e,t],r)=>{const s=sx(r);return $o(e,t,s)}),nx=$i(([e],t)=>{const r=sx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),ax=$i(([e,t])=>ln(t.toFloat().mix(On.rgb,e.toVec3()),On.a));let ox=null,ux=null;class lx extends js{static get type(){return"RangeNode"}constructor(e=Yi(),t=Yi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));ox=ox||new s,ux=ux||new s,ox.setScalar(0),ux.setScalar(0),1===a?ox.setScalar(i):i.isColor?ox.set(i.r,i.g,i.b,1):ox.set(i.x,i.y,i.z||0,i.w||0),1===o?ux.setScalar(n):n.isColor?ux.set(n.r,n.g,n.b,1):ux.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eIi(new cx(e,t)),px=hx("numWorkgroups","uvec3"),gx=hx("workgroupId","uvec3"),mx=hx("globalId","uvec3"),fx=hx("localId","uvec3"),yx=hx("subgroupSize","uint");const bx=Oi(class extends js{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class xx extends Xs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Tx extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ii(new xx(this,e))}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class _x extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=$u(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}_x.ATOMIC_LOAD="atomicLoad",_x.ATOMIC_STORE="atomicStore",_x.ATOMIC_ADD="atomicAdd",_x.ATOMIC_SUB="atomicSub",_x.ATOMIC_MAX="atomicMax",_x.ATOMIC_MIN="atomicMin",_x.ATOMIC_AND="atomicAnd",_x.ATOMIC_OR="atomicOr",_x.ATOMIC_XOR="atomicXor";const vx=Oi(_x),Nx=(e,t,r)=>vx(e,t,r).toStack();let Sx;function Ex(e){Sx=Sx||new WeakMap;let t=Sx.get(e);return void 0===t&&Sx.set(e,t={}),t}function wx(e){const t=Ex(e);return t.shadowMatrix||(t.shadowMatrix=ra("mat4").setGroup(Jn).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||e.shadow.updateMatrices(e),e.shadow.matrix)))}function Ax(e,t=jl){const r=wx(e).mul(t);return r.xyz.div(r.w)}function Rx(e){const t=Ex(e);return t.position||(t.position=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function Cx(e){const t=Ex(e);return t.targetPosition||(t.targetPosition=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function Mx(e){const t=Ex(e);return t.viewPosition||(t.viewPosition=ra(new r).setGroup(Jn).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const Px=e=>xl.transformDirection(Rx(e).sub(Cx(e))),Bx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},Lx=new WeakMap,Fx=[];class Ix extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=xn("vec3","totalDiffuse"),this.totalSpecularNode=xn("vec3","totalSpecular"),this.outgoingLightNode=xn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ii(e));else{let s=null;if(null!==r&&(s=Bx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;Lx.has(e)?s=Lx.get(e):(s=Ii(new r(e)),Lx.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=nn(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class Dx extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){Vx.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||jl)}}const Vx=xn("vec3","shadowPositionWorld");function Ux(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function Ox(e,t){return t=Ux(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function kx(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function Gx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function zx(e,t){return t=Gx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function Hx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function $x(e,t,r){return r=zx(t,r=Ox(e,r))}function Wx(e,t,r){kx(e,r),Hx(t,r)}var qx=Object.freeze({__proto__:null,resetRendererAndSceneState:$x,resetRendererState:Ox,resetSceneState:zx,restoreRendererAndSceneState:Wx,restoreRendererState:kx,restoreSceneState:Hx,saveRendererAndSceneState:function(e,t,r={}){return r=Gx(t,r=Ux(e,r))},saveRendererState:Ux,saveSceneState:Gx});const jx=new WeakMap,Xx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=al(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),Kx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=al(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Cd("mapSize","vec2",r).setGroup(Jn),a=Cd("radius","float",r).setGroup(Jn),o=en(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return ca(i(t.xy.add(en(u,l)),t.z),i(t.xy.add(en(0,l)),t.z),i(t.xy.add(en(d,l)),t.z),i(t.xy.add(en(h,p)),t.z),i(t.xy.add(en(0,p)),t.z),i(t.xy.add(en(g,p)),t.z),i(t.xy.add(en(u,0)),t.z),i(t.xy.add(en(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(en(g,0)),t.z),i(t.xy.add(en(d,0)),t.z),i(t.xy.add(en(h,m)),t.z),i(t.xy.add(en(0,m)),t.z),i(t.xy.add(en(g,m)),t.z),i(t.xy.add(en(u,c)),t.z),i(t.xy.add(en(0,c)),t.z),i(t.xy.add(en(d,c)),t.z)).mul(1/17)}),Yx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=al(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Cd("mapSize","vec2",r).setGroup(Jn),a=en(1).div(n),o=a.x,u=a.y,l=t.xy,d=to(l.mul(n).add(.5));return l.subAssign(d.mul(a)),ca(i(l,t.z),i(l.add(en(o,0)),t.z),i(l.add(en(0,u)),t.z),i(l.add(a),t.z),ko(i(l.add(en(o.negate(),0)),t.z),i(l.add(en(o.mul(2),0)),t.z),d.x),ko(i(l.add(en(o.negate(),u)),t.z),i(l.add(en(o.mul(2),u)),t.z),d.x),ko(i(l.add(en(0,u.negate())),t.z),i(l.add(en(0,u.mul(2))),t.z),d.y),ko(i(l.add(en(o,u.negate())),t.z),i(l.add(en(o,u.mul(2))),t.z),d.y),ko(ko(i(l.add(en(o.negate(),u.negate())),t.z),i(l.add(en(o.mul(2),u.negate())),t.z),d.x),ko(i(l.add(en(o.negate(),u.mul(2))),t.z),i(l.add(en(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),Qx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=Yi(1).toVar();let i=al(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=Ao(t.z,i.x);return ji(n.notEqual(Yi(1)),()=>{const e=t.z.sub(i.x),r=wo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Go(ha(a,.3).div(.95-.3)),s.assign(Go(wo(n,a)))}),s}),Zx=$i(([e,t,r])=>{let s=jl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),Jx=e=>{let t=jx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Cd("near","float",t).setGroup(Jn),s=Cd("far","float",t).setGroup(Jn),i=Al(e);return Zx(i,r,s)})(e):null;t=new yp,t.colorNode=ln(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,jx.set(e,t)}return t},eT=new gf,tT=[],rT=(e,t,r,s)=>{tT[0]=e,tT[1]=t;let i=eT.get(tT);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ls(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,eT.set(tT,i)),tT[0]=null,tT[1]=null,i},sT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanVertical"),a=Yi(0).toVar("squareMeanVertical"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));xh({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Dh.xy,en(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),iT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanHorizontal"),a=Yi(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));xh({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Dh.xy,en(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),nT=[Xx,Kx,Yx,Qx];let aT;const oT=new qy;class uT extends Dx{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,Yi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Cd("bias","float",r).setGroup(Jn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=Cd("near","float",r.camera).setGroup(Jn),s=Cd("far","float",r.camera).setGroup(Jn);n=Jh(e.negate(),t,s)}return a=nn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return nT[e]}setupRenderTarget(e,t){const r=new U(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=De;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie&&!0!==s.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}));let t=al(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=al(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const i=Cd("blurSamples","float",s).setGroup(Jn),o=Cd("radius","float",s).setGroup(Jn),u=Cd("mapSize","vec2",s).setGroup(Jn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new yp);l.fragmentNode=sT({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new yp),l.fragmentNode=iT({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=Cd("intensity","float",s).setGroup(Jn),u=Cd("normalBias","float",s).setGroup(Jn),l=wx(r).mul(Vx.add(od.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ie&&!0!==s.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=al(a.texture,d);n.isArrayTexture&&(g=g.depth(this.depthLayer));const m=ko(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return $i(()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");aT=$x(i,n,aT),n.overrideMaterial=Jx(r),i.setRenderObjectFunction(rT(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ie&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,Wx(i,n,aT)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),oT.material=this.vsmMaterialVertical,oT.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),oT.material=this.vsmMaterialHorizontal,oT.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const lT=(e,t)=>Ii(new uT(e,t)),dT=new e,cT=$i(([e,t])=>{const r=e.toVar(),s=uo(r),i=ga(1,wo(s.x,wo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=en(r.xy).toVar(),a=t.mul(1.5).oneMinus();return ji(s.z.greaterThanEqual(a),()=>{ji(r.z.greaterThan(0),()=>{n.x.assign(ha(4,r.x))})}).ElseIf(s.x.greaterThanEqual(a),()=>{const e=lo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))}).ElseIf(s.y.greaterThanEqual(a),()=>{const e=lo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))}),en(.125,.25).mul(n).add(en(.375,.75)).flipY()}).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),hT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>al(e,cT(t,s.y)).compare(r)),pT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Cd("radius","float",i).setGroup(Jn),a=en(-1,1).mul(n).mul(s.y);return al(e,cT(t.add(a.xyy),s.y)).compare(r).add(al(e,cT(t.add(a.yyy),s.y)).compare(r)).add(al(e,cT(t.add(a.xyx),s.y)).compare(r)).add(al(e,cT(t.add(a.yyx),s.y)).compare(r)).add(al(e,cT(t,s.y)).compare(r)).add(al(e,cT(t.add(a.xxy),s.y)).compare(r)).add(al(e,cT(t.add(a.yxy),s.y)).compare(r)).add(al(e,cT(t.add(a.xxx),s.y)).compare(r)).add(al(e,cT(t.add(a.yxx),s.y)).compare(r)).mul(1/9)}),gT=$i(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.near),o=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.far),u=Cd("bias","float",s).setGroup(Jn),l=ra(s.mapSize).setGroup(Jn),d=Yi(1).toVar();return ji(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=en(1).div(l.mul(en(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))}),d}),mT=new s,fT=new t,yT=new t;class bT extends uT{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?hT:pT}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return gT({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();yT.copy(t.mapSize),yT.multiply(a),r.setSize(yT.width,yT.height),fT.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(dT),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eIi(new bT(e,t));class TT extends wh{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ra(this.color).setGroup(Jn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}getHash(){return this.light.uuid}getLightVector(e){return Mx(this.light).sub(e.context.positionView||Kl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return lT(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Ii(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const _T=$i(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),vT=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=_T({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class NT extends TT{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(2).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return xT(this.light)}setupDirect(e){return vT({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const ST=$i(([e=Zu()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),ET=$i(([e=Zu()],{renderer:t,material:r})=>{const s=Oo(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.samples>1){const e=Yi(s.fwidth()).toVar();i=$o(e.oneMinus(),e.add(1),s).oneMinus()}else i=eu(s.greaterThan(1),0,1);return i}),wT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Ji(e).toVar();return eu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),AT=$i(([e,t])=>{const r=Ji(t).toVar(),s=Yi(e).toVar();return eu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),RT=$i(([e])=>{const t=Yi(e).toVar();return Qi(Za(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),CT=$i(([e,t])=>{const r=Yi(e).toVar();return t.assign(RT(r)),r.sub(Yi(t))}),MT=fy([$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=Yi(s).toVar(),l=Yi(r).toVar(),d=Yi(t).toVar(),c=Yi(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=nn(s).toVar(),l=nn(r).toVar(),d=nn(t).toVar(),c=nn(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),PT=fy([$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=Yi(o).toVar(),m=Yi(a).toVar(),f=Yi(n).toVar(),y=Yi(i).toVar(),b=Yi(s).toVar(),x=Yi(r).toVar(),T=Yi(t).toVar(),_=Yi(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=nn(o).toVar(),m=nn(a).toVar(),f=nn(n).toVar(),y=nn(i).toVar(),b=nn(s).toVar(),x=nn(r).toVar(),T=nn(t).toVar(),_=nn(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),BT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Zi(e).toVar(),a=Zi(n.bitAnd(Zi(7))).toVar(),o=Yi(wT(a.lessThan(Zi(4)),i,s)).toVar(),u=Yi(pa(2,wT(a.lessThan(Zi(4)),s,i))).toVar();return AT(o,Ji(a.bitAnd(Zi(1)))).add(AT(u,Ji(a.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),LT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=Zi(e).toVar(),u=Zi(o.bitAnd(Zi(15))).toVar(),l=Yi(wT(u.lessThan(Zi(8)),a,n)).toVar(),d=Yi(wT(u.lessThan(Zi(4)),n,wT(u.equal(Zi(12)).or(u.equal(Zi(14))),a,i))).toVar();return AT(l,Ji(u.bitAnd(Zi(1)))).add(AT(d,Ji(u.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),FT=fy([BT,LT]),IT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=on(e).toVar();return nn(FT(n.x,i,s),FT(n.y,i,s),FT(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),DT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=on(e).toVar();return nn(FT(o.x,a,n,i),FT(o.y,a,n,i),FT(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),VT=fy([IT,DT]),UT=$i(([e])=>{const t=Yi(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),OT=$i(([e])=>{const t=Yi(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),kT=fy([UT,$i(([e])=>{const t=nn(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),GT=fy([OT,$i(([e])=>{const t=nn(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),zT=$i(([e,t])=>{const r=Qi(t).toVar(),s=Zi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Qi(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),HT=$i(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(zT(r,Qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(zT(e,Qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(zT(t,Qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(zT(r,Qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(zT(e,Qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(zT(t,Qi(4))),t.addAssign(e)}),$T=$i(([e,t,r])=>{const s=Zi(r).toVar(),i=Zi(t).toVar(),n=Zi(e).toVar();return s.bitXorAssign(i),s.subAssign(zT(i,Qi(14))),n.bitXorAssign(s),n.subAssign(zT(s,Qi(11))),i.bitXorAssign(n),i.subAssign(zT(n,Qi(25))),s.bitXorAssign(i),s.subAssign(zT(i,Qi(16))),n.bitXorAssign(s),n.subAssign(zT(s,Qi(4))),i.bitXorAssign(n),i.subAssign(zT(n,Qi(14))),s.bitXorAssign(i),s.subAssign(zT(i,Qi(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),WT=$i(([e])=>{const t=Zi(e).toVar();return Yi(t).div(Yi(Zi(Qi(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),qT=$i(([e])=>{const t=Yi(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),jT=fy([$i(([e])=>{const t=Qi(e).toVar(),r=Zi(Zi(1)).toVar(),s=Zi(Zi(Qi(3735928559)).add(r.shiftLeft(Zi(2))).add(Zi(13))).toVar();return $T(s.add(Zi(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(Zi(2)).toVar(),n=Zi().toVar(),a=Zi().toVar(),o=Zi().toVar();return n.assign(a.assign(o.assign(Zi(Qi(3735928559)).add(i.shiftLeft(Zi(2))).add(Zi(13))))),n.addAssign(Zi(s)),a.addAssign(Zi(r)),$T(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(Zi(3)).toVar(),o=Zi().toVar(),u=Zi().toVar(),l=Zi().toVar();return o.assign(u.assign(l.assign(Zi(Qi(3735928559)).add(a.shiftLeft(Zi(2))).add(Zi(13))))),o.addAssign(Zi(n)),u.addAssign(Zi(i)),l.addAssign(Zi(s)),$T(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),$i(([e,t,r,s])=>{const i=Qi(s).toVar(),n=Qi(r).toVar(),a=Qi(t).toVar(),o=Qi(e).toVar(),u=Zi(Zi(4)).toVar(),l=Zi().toVar(),d=Zi().toVar(),c=Zi().toVar();return l.assign(d.assign(c.assign(Zi(Qi(3735928559)).add(u.shiftLeft(Zi(2))).add(Zi(13))))),l.addAssign(Zi(o)),d.addAssign(Zi(a)),c.addAssign(Zi(n)),HT(l,d,c),l.addAssign(Zi(i)),$T(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),$i(([e,t,r,s,i])=>{const n=Qi(i).toVar(),a=Qi(s).toVar(),o=Qi(r).toVar(),u=Qi(t).toVar(),l=Qi(e).toVar(),d=Zi(Zi(5)).toVar(),c=Zi().toVar(),h=Zi().toVar(),p=Zi().toVar();return c.assign(h.assign(p.assign(Zi(Qi(3735928559)).add(d.shiftLeft(Zi(2))).add(Zi(13))))),c.addAssign(Zi(l)),h.addAssign(Zi(u)),p.addAssign(Zi(o)),HT(c,h,p),c.addAssign(Zi(a)),h.addAssign(Zi(n)),$T(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),XT=fy([$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(jT(s,r)).toVar(),n=on().toVar();return n.x.assign(i.bitAnd(Qi(255))),n.y.assign(i.shiftRight(Qi(8)).bitAnd(Qi(255))),n.z.assign(i.shiftRight(Qi(16)).bitAnd(Qi(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(jT(n,i,s)).toVar(),o=on().toVar();return o.x.assign(a.bitAnd(Qi(255))),o.y.assign(a.shiftRight(Qi(8)).bitAnd(Qi(255))),o.z.assign(a.shiftRight(Qi(16)).bitAnd(Qi(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),KT=fy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(CT(t.x,r)).toVar(),n=Yi(CT(t.y,s)).toVar(),a=Yi(qT(i)).toVar(),o=Yi(qT(n)).toVar(),u=Yi(MT(FT(jT(r,s),i,n),FT(jT(r.add(Qi(1)),s),i.sub(1),n),FT(jT(r,s.add(Qi(1))),i,n.sub(1)),FT(jT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return kT(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(CT(t.x,r)).toVar(),a=Yi(CT(t.y,s)).toVar(),o=Yi(CT(t.z,i)).toVar(),u=Yi(qT(n)).toVar(),l=Yi(qT(a)).toVar(),d=Yi(qT(o)).toVar(),c=Yi(PT(FT(jT(r,s,i),n,a,o),FT(jT(r.add(Qi(1)),s,i),n.sub(1),a,o),FT(jT(r,s.add(Qi(1)),i),n,a.sub(1),o),FT(jT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),FT(jT(r,s,i.add(Qi(1))),n,a,o.sub(1)),FT(jT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),FT(jT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),FT(jT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return GT(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),YT=fy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(CT(t.x,r)).toVar(),n=Yi(CT(t.y,s)).toVar(),a=Yi(qT(i)).toVar(),o=Yi(qT(n)).toVar(),u=nn(MT(VT(XT(r,s),i,n),VT(XT(r.add(Qi(1)),s),i.sub(1),n),VT(XT(r,s.add(Qi(1))),i,n.sub(1)),VT(XT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return kT(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(CT(t.x,r)).toVar(),a=Yi(CT(t.y,s)).toVar(),o=Yi(CT(t.z,i)).toVar(),u=Yi(qT(n)).toVar(),l=Yi(qT(a)).toVar(),d=Yi(qT(o)).toVar(),c=nn(PT(VT(XT(r,s,i),n,a,o),VT(XT(r.add(Qi(1)),s,i),n.sub(1),a,o),VT(XT(r,s.add(Qi(1)),i),n,a.sub(1),o),VT(XT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),VT(XT(r,s,i.add(Qi(1))),n,a,o.sub(1)),VT(XT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),VT(XT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),VT(XT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return GT(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),QT=fy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(RT(t)).toVar();return WT(jT(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar();return WT(jT(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar();return WT(jT(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar(),n=Qi(RT(t.w)).toVar();return WT(jT(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),ZT=fy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(RT(t)).toVar();return nn(WT(jT(r,Qi(0))),WT(jT(r,Qi(1))),WT(jT(r,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar();return nn(WT(jT(r,s,Qi(0))),WT(jT(r,s,Qi(1))),WT(jT(r,s,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar();return nn(WT(jT(r,s,i,Qi(0))),WT(jT(r,s,i,Qi(1))),WT(jT(r,s,i,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar(),n=Qi(RT(t.w)).toVar();return nn(WT(jT(r,s,i,n,Qi(0))),WT(jT(r,s,i,n,Qi(1))),WT(jT(r,s,i,n,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),JT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=Yi(0).toVar(),l=Yi(1).toVar();return xh(a,()=>{u.addAssign(l.mul(KT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),e_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(0).toVar(),l=Yi(1).toVar();return xh(a,()=>{u.addAssign(l.mul(YT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),t_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar();return en(JT(o,a,n,i),JT(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),r_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(e_(o,a,n,i)).toVar(),l=Yi(JT(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i)).toVar();return ln(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),s_=fy([$i(([e,t,r,s,i,n,a])=>{const o=Qi(a).toVar(),u=Yi(n).toVar(),l=Qi(i).toVar(),d=Qi(s).toVar(),c=Qi(r).toVar(),h=Qi(t).toVar(),p=en(e).toVar(),g=nn(ZT(en(h.add(d),c.add(l)))).toVar(),m=en(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=en(en(Yi(h),Yi(c)).add(m)).toVar(),y=en(f.sub(p)).toVar();return ji(o.equal(Qi(2)),()=>uo(y.x).add(uo(y.y))),ji(o.equal(Qi(3)),()=>wo(uo(y.x),uo(y.y))),Po(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),$i(([e,t,r,s,i,n,a,o,u])=>{const l=Qi(u).toVar(),d=Yi(o).toVar(),c=Qi(a).toVar(),h=Qi(n).toVar(),p=Qi(i).toVar(),g=Qi(s).toVar(),m=Qi(r).toVar(),f=Qi(t).toVar(),y=nn(e).toVar(),b=nn(ZT(nn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=nn(nn(Yi(f),Yi(m),Yi(g)).add(b)).toVar(),T=nn(x.sub(y)).toVar();return ji(l.equal(Qi(2)),()=>uo(T.x).add(uo(T.y)).add(uo(T.z))),ji(l.equal(Qi(3)),()=>wo(uo(T.x),uo(T.y),uo(T.z))),Po(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),i_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=Yi(1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();l.assign(Eo(l,r))})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),n_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=en(1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),a_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=nn(1e6,1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),o_=fy([i_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=Yi(1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Eo(d,n))})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),u_=fy([n_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=en(1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),l_=fy([a_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=nn(1e6,1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),d_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=en(t).toVar(),p=en(r).toVar(),g=en(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(YT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(ZT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(l_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(e_(nn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),c_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=nn(t).toVar(),p=nn(r).toVar(),g=nn(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(YT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(ZT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(l_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(e_(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),h_=$i(([e])=>{const t=e.y,r=e.z,s=nn().toVar();return ji(t.lessThan(1e-4),()=>{s.assign(nn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(Za(i)).mul(6).toVar();const n=Qi(bo(i)),a=i.sub(Yi(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ji(n.equal(Qi(0)),()=>{s.assign(nn(r,l,o))}).ElseIf(n.equal(Qi(1)),()=>{s.assign(nn(u,r,o))}).ElseIf(n.equal(Qi(2)),()=>{s.assign(nn(o,r,l))}).ElseIf(n.equal(Qi(3)),()=>{s.assign(nn(o,u,r))}).ElseIf(n.equal(Qi(4)),()=>{s.assign(nn(l,o,r))}).Else(()=>{s.assign(nn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),p_=$i(([e])=>{const t=nn(e).toVar(),r=Yi(t.x).toVar(),s=Yi(t.y).toVar(),i=Yi(t.z).toVar(),n=Yi(Eo(r,Eo(s,i))).toVar(),a=Yi(wo(r,wo(s,i))).toVar(),o=Yi(a.sub(n)).toVar(),u=Yi().toVar(),l=Yi().toVar(),d=Yi().toVar();return d.assign(a),ji(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ji(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ji(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ji(u.lessThan(0),()=>{u.addAssign(1)})}),nn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),g_=$i(([e])=>{const t=nn(e).toVar(),r=un(xa(t,nn(.04045))).toVar(),s=nn(t.div(12.92)).toVar(),i=nn(Lo(wo(t.add(nn(.055)),nn(0)).div(1.055),nn(2.4))).toVar();return ko(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),m_=(e,t)=>{e=Yi(e),t=Yi(t);const r=en(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return $o(e.sub(r),e.add(r),t)},f_=(e,t,r,s)=>ko(e,t,r[s].clamp()),y_=(e,t,r,s,i)=>ko(e,t,m_(r,s[i])),b_=$i(([e,t,r])=>{const s=eo(e).toVar(),i=ha(Yi(.5).mul(t.sub(r)),jl).div(s).toVar(),n=ha(Yi(-.5).mul(t.sub(r)),jl).div(s).toVar(),a=nn().toVar();a.x=s.x.greaterThan(Yi(0)).select(i.x,n.x),a.y=s.y.greaterThan(Yi(0)).select(i.y,n.y),a.z=s.z.greaterThan(Yi(0)).select(i.z,n.z);const o=Eo(a.x,a.y,a.z).toVar();return jl.add(s.mul(o)).toVar().sub(r)}),x_=$i(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(pa(r,r).sub(pa(s,s)))),n});var T_=Object.freeze({__proto__:null,BRDF_GGX:ng,BRDF_Lambert:$p,BasicPointShadowFilter:hT,BasicShadowFilter:Xx,Break:Th,Const:uu,Continue:()=>$u("continue").toStack(),DFGApprox:ag,D_GGX:rg,Discard:Wu,EPSILON:Ua,F_Schlick:Hp,Fn:$i,INFINITY:Oa,If:ji,Loop:xh,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,OnMaterialUpdate:e=>tb(eb.MATERIAL,e),OnObjectUpdate:e=>tb(eb.OBJECT,e),PCFShadowFilter:Kx,PCFSoftShadowFilter:Yx,PI:ka,PI2:Ga,PointShadowFilter:pT,Return:()=>$u("return").toStack(),Schlick_to_F0:ug,ScriptableNodeResources:ex,ShaderNode:Fi,Stack:Xi,Switch:(...e)=>ai.Switch(...e),TBNViewMatrix:rc,VSMShadowFilter:Qx,V_GGX_SmithCorrelated:eg,Var:ou,VarIntent:lu,abs:uo,acesFilmicToneMapping:kb,acos:ao,add:ca,addMethodChaining:ui,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:$b,all:za,alphaT:Bn,and:va,anisotropy:Ln,anisotropyB:In,anisotropyT:Fn,any:Ha,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),Xi(e)),array:ia,arrayBuffer:e=>Ii(new ii(e,"ArrayBuffer")),asin:no,assign:aa,atan:oo,atan2:Yo,atomicAdd:(e,t)=>Nx(_x.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Nx(_x.ATOMIC_AND,e,t),atomicFunc:Nx,atomicLoad:e=>Nx(_x.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Nx(_x.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Nx(_x.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Nx(_x.ATOMIC_OR,e,t),atomicStore:(e,t)=>Nx(_x.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Nx(_x.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Nx(_x.ATOMIC_XOR,e,t),attenuationColor:jn,attenuationDistance:qn,attribute:Qu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new sb(e,r,s);return gh(i,t,e)},backgroundBlurriness:lb,backgroundIntensity:db,backgroundRotation:cb,batch:dh,bentNormalView:ic,billboarding:vy,bitAnd:wa,bitNot:Aa,bitOr:Ra,bitXor:Ca,bitangentGeometry:Zd,bitangentLocal:Jd,bitangentView:ec,bitangentWorld:tc,bitcast:No,blendBurn:dp,blendColor:gp,blendDodge:cp,blendOverlay:pp,blendScreen:hp,blur:um,bool:Ji,buffer:ll,bufferAttribute:Cu,bumpMap:dc,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),dp(e)),bvec2:sn,bvec3:un,bvec4:hn,bypass:Ou,cache:Vu,call:ua,cameraFar:fl,cameraIndex:gl,cameraNear:ml,cameraNormalMatrix:_l,cameraPosition:vl,cameraProjectionMatrix:yl,cameraProjectionMatrixInverse:bl,cameraViewMatrix:xl,cameraWorldMatrix:Tl,cbrt:Uo,cdl:Rb,ceil:Ja,checker:ST,cineonToneMapping:Ub,clamp:Go,clearcoat:En,clearcoatNormalView:ud,clearcoatRoughness:wn,code:jb,color:Ki,colorSpaceToWorking:Tu,colorToDirection:e=>Ii(e).mul(2).sub(1),compute:Iu,computeKernel:Fu,computeSkinning:(e,t=null)=>{const r=new fh(e);return r.positionNode=gh(new L(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(eh).toVar(),r.skinIndexNode=gh(new L(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(eh).toVar(),r.skinWeightNode=gh(new L(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(eh).toVar(),r.bindMatrixNode=ra(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=ra(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=ll(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Ii(r)},context:ru,convert:yn,convertColorSpace:(e,t,r)=>Ii(new bu(Ii(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Ky(e,...t),cos:so,cross:Bo,cubeTexture:wd,cubeTextureBase:Ed,cubeToUV:cT,dFdx:go,dFdy:mo,dashSize:kn,debug:Ku,decrement:Ia,decrementBefore:La,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Bi,degrees:Wa,deltaTime:by,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),ax(e,nx(t))},densityFogFactor:nx,depth:tp,depthPass:(e,t,r)=>Ii(new Fb(Fb.DEPTH,e,t,r)),determinant:_o,difference:Mo,diffuseColor:_n,directPointLight:vT,directionToColor:Ap,directionToFaceDirection:ed,dispersion:Xn,distance:Co,div:ga,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),cp(e)),dot:Po,drawIndex:ih,dynamicBufferAttribute:Mu,element:fn,emissive:vn,equal:fa,equals:So,equirectUV:Mp,exp:qa,exp2:ja,expression:$u,faceDirection:Jl,faceForward:Wo,faceforward:Qo,float:Yi,floor:Za,fog:ax,fract:to,frameGroup:Zn,frameId:xy,frontFacing:Zl,fwidth:xo,gain:(e,t)=>e.lessThan(.5)?dy(e.mul(2),t).div(2):ha(1,dy(pa(ha(1,e),2),t).div(2)),gapSize:Gn,getConstNodeType:Li,getCurrentStack:qi,getDirection:im,getDistanceAttenuation:_T,getGeometryRoughness:Zp,getNormalFromDepth:Zy,getParallaxCorrectNormal:b_,getRoughness:Jp,getScreenPosition:Qy,getShIrradianceAt:x_,getShadowMaterial:Jx,getShadowRenderObjectFunction:rT,getTextureIndex:ay,getViewPosition:Yy,globalId:mx,glsl:(e,t)=>jb(e,t,"glsl"),glslFn:(e,t)=>Kb(e,t,"glsl"),grayscale:Nb,greaterThan:xa,greaterThanEqual:_a,hash:ly,highpModelNormalViewMatrix:Hl,highpModelViewMatrix:zl,hue:wb,increment:Fa,incrementBefore:Ba,instance:ah,instanceIndex:eh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new rb(e,r,s);return gh(i,t,e)},instancedBufferAttribute:Pu,instancedDynamicBufferAttribute:Bu,instancedMesh:uh,int:Qi,inverse:vo,inverseSqrt:Qa,inversesqrt:Zo,invocationLocalIndex:sh,invocationSubgroupIndex:rh,ior:Hn,iridescence:Cn,iridescenceIOR:Mn,iridescenceThickness:Pn,ivec2:tn,ivec3:an,ivec4:dn,js:(e,t)=>jb(e,t,"js"),label:iu,length:co,lengthSq:Oo,lessThan:ba,lessThanEqual:Ta,lightPosition:Rx,lightProjectionUV:Ax,lightShadowMatrix:wx,lightTargetDirection:Px,lightTargetPosition:Cx,lightViewPosition:Mx,lightingContext:Ch,lights:(e=[])=>Ii(new Ix).setLights(e),linearDepth:rp,linearToneMapping:Db,localId:fx,log:Xa,log2:Ka,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Xa(r.div(t)));return Yi(Math.E).pow(s).mul(t).negate()},luminance:Ab,mat2:pn,mat3:gn,mat4:mn,matcapUV:Km,materialAO:Kc,materialAlphaTest:pc,materialAnisotropy:Bc,materialAnisotropyVector:Yc,materialAttenuationColor:kc,materialAttenuationDistance:Oc,materialClearcoat:wc,materialClearcoatNormal:Rc,materialClearcoatRoughness:Ac,materialColor:gc,materialDispersion:jc,materialEmissive:fc,materialEnvIntensity:yd,materialEnvRotation:bd,materialIOR:Uc,materialIridescence:Lc,materialIridescenceIOR:Fc,materialIridescenceThickness:Ic,materialLightMap:Xc,materialLineDashOffset:Wc,materialLineDashSize:zc,materialLineGapSize:Hc,materialLineScale:Gc,materialLineWidth:$c,materialMetalness:Sc,materialNormal:Ec,materialOpacity:yc,materialPointSize:qc,materialReference:Bd,materialReflectivity:vc,materialRefractionRatio:fd,materialRotation:Cc,materialRoughness:Nc,materialSheen:Mc,materialSheenRoughness:Pc,materialShininess:mc,materialSpecular:bc,materialSpecularColor:Tc,materialSpecularIntensity:xc,materialSpecularStrength:_c,materialThickness:Vc,materialTransmission:Dc,max:wo,maxMipLevel:rl,mediumpModelViewMatrix:Gl,metalness:Sn,min:Eo,mix:ko,mixElement:jo,mod:ma,modInt:Da,modelDirection:Bl,modelNormalMatrix:Ul,modelPosition:Fl,modelRadius:Vl,modelScale:Il,modelViewMatrix:kl,modelViewPosition:Dl,modelViewProjection:Qc,modelWorldMatrix:Ll,modelWorldMatrixInverse:Ol,morphReference:Eh,mrt:uy,mul:pa,mx_aastep:m_,mx_add:(e,t=Yi(0))=>ca(e,t),mx_atan2:(e=Yi(0),t=Yi(1))=>oo(e,t),mx_cell_noise_float:(e=Zu())=>QT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Yi(e).sub(r).mul(t).add(r),mx_divide:(e,t=Yi(1))=>ga(e,t),mx_fractal_noise_float:(e=Zu(),t=3,r=2,s=.5,i=1)=>JT(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Zu(),t=3,r=2,s=.5,i=1)=>t_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Zu(),t=3,r=2,s=.5,i=1)=>e_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Zu(),t=3,r=2,s=.5,i=1)=>r_(e,Qi(t),r,s).mul(i),mx_frame:()=>xy,mx_heighttonormal:(e,t)=>(e=nn(e),t=Yi(t),dc(e,t)),mx_hsvtorgb:h_,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=Yi(1))=>ha(t,e),mx_modulo:(e,t=Yi(1))=>ma(e,t),mx_multiply:(e,t=Yi(1))=>pa(e,t),mx_noise_float:(e=Zu(),t=1,r=0)=>KT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Zu(),t=1,r=0)=>YT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Zu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ln(YT(e),KT(e.add(en(19,73)))).mul(t).add(r)},mx_place2d:(e,t=en(.5,.5),r=en(1,1),s=Yi(0),i=en(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=en(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=Yi(1))=>Lo(e,t),mx_ramp4:(e,t,r,s,i=Zu())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ko(e,t,n),u=ko(r,s,n);return ko(o,u,a)},mx_ramplr:(e,t,r=Zu())=>f_(e,t,r,"x"),mx_ramptb:(e,t,r=Zu())=>f_(e,t,r,"y"),mx_rgbtohsv:p_,mx_rotate2d:(e,t)=>{e=en(e);const r=(t=Yi(t)).mul(Math.PI/180);return Jm(e,r)},mx_rotate3d:(e,t,r)=>{e=nn(e),t=Yi(t),r=nn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=Yi(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=Yi(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Zu())=>y_(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Zu())=>y_(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:g_,mx_subtract:(e,t=Yi(0))=>ha(e,t),mx_timer:()=>yy,mx_transform_uv:(e=1,t=0,r=Zu())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Zu(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>d_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Zu(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>c_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Zu(),t=1)=>o_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec2:(e=Zu(),t=1)=>u_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec3:(e=Zu(),t=1)=>l_(e.convert("vec2|vec3"),t,Qi(1)),negate:ho,neutralToneMapping:Wb,nodeArray:Ui,nodeImmutable:ki,nodeObject:Ii,nodeObjectIntent:Di,nodeObjects:Vi,nodeProxy:Oi,nodeProxyIntent:Gi,normalFlat:sd,normalGeometry:td,normalLocal:rd,normalMap:ac,normalView:ad,normalViewGeometry:id,normalWorld:od,normalWorldGeometry:nd,normalize:eo,not:Sa,notEqual:ya,numWorkgroups:px,objectDirection:El,objectGroup:ea,objectPosition:Al,objectRadius:Ml,objectScale:Rl,objectViewPosition:Cl,objectWorldMatrix:wl,oneMinus:po,or:Na,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=yy)=>e.fract(),oscSine:(e=yy)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=yy)=>e.fract().round(),oscTriangle:(e=yy)=>e.add(.5).fract().mul(2).sub(1).abs(),output:On,outputStruct:ny,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),pp(e)),overloadingFn:fy,parabola:dy,parallaxDirection:sc,parallaxUV:(e,t)=>e.sub(sc.mul(t)),parameter:(e,t)=>Ii(new Jf(e,t)),pass:(e,t,r)=>Ii(new Fb(Fb.COLOR,e,t,r)),passTexture:(e,t)=>Ii(new Bb(e,t)),pcurve:(e,t,r)=>Lo(ga(Lo(e,t),ca(Lo(e,t),Lo(ha(1,e),r))),1/t),perspectiveDepthToViewZ:Zh,pmremTexture:Fm,pointShadow:xT,pointUV:nb,pointWidth:zn,positionGeometry:$l,positionLocal:Wl,positionPrevious:ql,positionView:Kl,positionViewDirection:Yl,positionWorld:jl,positionWorldDirection:Xl,posterize:Mb,pow:Lo,pow2:Fo,pow3:Io,pow4:Do,premultiplyAlpha:mp,property:xn,radians:$a,rand:qo,range:dx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),ax(e,ix(t,r))},rangeFogFactor:ix,reciprocal:yo,reference:Cd,referenceBuffer:Md,reflect:Ro,reflectVector:_d,reflectView:xd,reflector:e=>Ii(new Gy(e)),refract:Ho,refractVector:vd,refractView:Td,reinhardToneMapping:Vb,remap:Gu,remapClamp:zu,renderGroup:Jn,renderOutput:ju,rendererReference:Su,rotate:Jm,rotateUV:Ty,roughness:Nn,round:fo,rtt:Ky,sRGBTransferEOTF:mu,sRGBTransferOETF:fu,sample:e=>Ii(new Jy(e)),sampler:e=>(!0===e.isNode?e:al(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:al(e)).convert("samplerComparison"),saturate:zo,saturation:Sb,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),hp(e)),screenCoordinate:Dh,screenSize:Ih,screenUV:Fh,scriptable:rx,scriptableValue:Qb,select:eu,setCurrentStack:Wi,setName:su,shaderStages:Hs,shadow:lT,shadowPositionWorld:Vx,shapeCircle:ET,sharedUniformGroup:Qn,sheen:An,sheenRoughness:Rn,shiftLeft:Ma,shiftRight:Pa,shininess:Un,sign:lo,sin:ro,sinc:(e,t)=>ro(ka.mul(t.mul(e).sub(1))).div(ka.mul(t.mul(e).sub(1))),skinning:yh,smoothstep:$o,smoothstepElement:Xo,specularColor:Dn,specularF90:Vn,spherizeUV:_y,split:(e,t)=>Ii(new Js(Ii(e),t)),spritesheetUV:Ey,sqrt:Ya,stack:ty,step:Ao,stepElement:Ko,storage:gh,storageBarrier:()=>bx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),gh(e,t,r).setPBO(!0)),storageTexture:pb,string:(e="")=>Ii(new ii(e,"string")),struct:(e,t=null)=>{const r=new ry(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;ebx("texture").toStack(),textureBicubic:Rg,textureBicubicLevel:Ag,textureCubeUV:nm,textureLoad:ol,textureSize:el,textureStore:(e,t,r)=>{const s=pb(e,t,r);return null!==r&&s.toStack(),s},thickness:Wn,time:yy,toneMapping:wu,toneMappingExposure:Au,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ii(new Ib(t,r,Ii(s),Ii(i),Ii(n))),transformDirection:Vo,transformNormal:ld,transformNormalToView:dd,transformedClearcoatNormalView:pd,transformedNormalView:cd,transformedNormalWorld:hd,transmission:$n,transpose:To,triNoise3D:py,triplanarTexture:(...e)=>wy(...e),triplanarTextures:wy,trunc:bo,uint:Zi,uniform:ra,uniformArray:hl,uniformCubeTexture:(e=Nd)=>Ed(e),uniformGroup:Yn,uniformTexture:(e=sl)=>al(e),unpremultiplyAlpha:fp,userData:(e,t,r)=>Ii(new yb(e,t,r)),uv:Zu,uvec2:rn,uvec3:on,uvec4:cn,varying:pu,varyingProperty:Tn,vec2:en,vec3:nn,vec4:ln,vectorComponents:$s,velocity:vb,vertexColor:lp,vertexIndex:Jc,vertexStage:gu,vibrance:Eb,viewZToLogarithmicDepth:Jh,viewZToOrthographicDepth:Yh,viewZToPerspectiveDepth:Qh,viewport:Vh,viewportCoordinate:Oh,viewportDepthTexture:Xh,viewportLinearDepth:sp,viewportMipTexture:Wh,viewportResolution:Gh,viewportSafeUV:Ny,viewportSharedTexture:Sp,viewportSize:Uh,viewportTexture:$h,viewportUV:kh,wgsl:(e,t)=>jb(e,t,"wgsl"),wgslFn:(e,t)=>Kb(e,t,"wgsl"),workgroupArray:(e,t)=>Ii(new Tx("Workgroup",e,t)),workgroupBarrier:()=>bx("workgroup").toStack(),workgroupId:gx,workingToColorSpace:xu,xor:Ea});const __=new Zf;class v_ extends xf{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(__),__.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(__),__.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;__.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=ru(ln(u).mul(db),{getUV:()=>cb.mul(nd),getTextureLevel:()=>lb});let h=Qc;h=h.setZ(h.w);const p=new yp;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=S,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new X(new Oe(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=ln(u).mul(db),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?__.set(0,0,0,1):"alpha-blend"===a&&__.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=__.r,m.g=__.g,m.b=__.b,m.a=__.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let N_=0;class S_{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=N_++}}class E_{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new S_(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class w_{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class A_{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class R_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class C_ extends R_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class M_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let P_=0;class B_{constructor(e=null){this.id=P_++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class L_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class F_{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class I_ extends F_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class D_ extends F_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class V_ extends F_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class U_ extends F_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class O_ extends F_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class k_ extends F_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class G_ extends F_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class z_ extends F_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class H_ extends I_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class $_ extends D_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class W_ extends V_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class q_ extends U_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class j_ extends O_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class X_ extends k_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class K_ extends G_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Y_ extends z_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Q_=new WeakMap,Z_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),J_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class ev{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=ty(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new B_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.currentStack=null,this.subBuildFn=null}getBindGroupsCache(){let e=Q_.get(this.renderer);return void 0===e&&(e=new gf,Q_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ue(e,t,r)}createCubeRenderTarget(e,t){return new Pp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new S_(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new S_(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Hs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${J_(n.r)}, ${J_(n.g)}, ${J_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new w_(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===_)return"int";if(t===T)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=ws(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return Z_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=ty(this.stack),this.stacks.push(qi()||this.stack),Wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Wi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new w_("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new L_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new A_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new R_(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new C_(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new M_("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Xb,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Jf(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new B_,this.stack=ty();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new yp),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Hs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new H_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new $_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new W_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new q_(e);if("color"===t)return new j_(e);if("mat2"===t)return new X_(e);if("mat3"===t)return new K_(e);if("mat4"===t)return new Y_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${He} - Node System\n`}*[Symbol.iterator](){}}class tv{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class rv{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}rv.isNodeFunctionInput=!0;class sv extends TT{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Px(this.light),lightColor:e}}}const iv=new a,nv=new a;let av=null;class ov extends TT{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ra(new r).setGroup(Jn),this.halfWidth=ra(new r).setGroup(Jn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;nv.identity(),iv.copy(t.matrixWorld),iv.premultiply(r),nv.extractRotation(iv),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(nv),this.halfHeight.value.applyMatrix4(nv)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=al(av.LTC_FLOAT_1),r=al(av.LTC_FLOAT_2)):(t=al(av.LTC_HALF_1),r=al(av.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Mx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){av=e}}class uv extends TT{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ra(0).setGroup(Jn),this.penumbraCosNode=ra(0).setGroup(Jn),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(0).setGroup(Jn),this.colorNode=ra(this.color).setGroup(Jn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return $o(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=Ax(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Px(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=_T({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=al(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class lv extends uv{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=al(r,en(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const dv=$i(([e,t])=>{const r=e.abs().sub(t);return co(wo(r,0)).add(Eo(wo(r.x,r.y),0))});class cv extends uv{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=Yi(0),r=this.penumbraCosNode,s=wx(this.light).mul(e.context.positionWorld||jl);return ji(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=dv(e.xy.sub(en(.5)),en(.5)),n=ga(-1,ha(1,ao(r)).sub(1));t.assign(zo(i.mul(-2).mul(n)))}),t}}class hv extends TT{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class pv extends TT{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Rx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ra(new e).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=od.dot(s).mul(.5).add(.5),n=ko(r,t,i);e.context.irradiance.addAssign(n)}}class gv extends TT{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=hl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=x_(od,this.lightProbe);e.context.irradiance.addAssign(t)}}class mv{parseFunction(){console.warn("Abstract function.")}}class fv{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}fv.isNodeFunction=!0;const yv=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,bv=/[a-z_0-9]+/gi,xv="#pragma main";class Tv extends fv{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(xv),r=-1!==t?e.slice(t+12):e,s=r.match(yv);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=bv.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===Z||r.mapping===J||r.mapping===he){if(e.backgroundBlurriness>0||r.mapping===he)return Fm(r);{let e;return e=!0===r.isCubeTexture?wd(r):al(r),Dp(e)}}if(!0===r.isTexture)return al(r,Fh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=Cd("color","color",r).setGroup(Jn),t=Cd("density","float",r).setGroup(Jn);return ax(e,nx(t))}if(r.isFog){const e=Cd("color","color",r).setGroup(Jn),t=Cd("near","float",r).setGroup(Jn),s=Cd("far","float",r).setGroup(Jn);return ax(e,ix(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?wd(r):!0===r.isTexture?al(r):void console.error("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return vv.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?fb(e,nn(Fh,pl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):al(e,Fh).renderOutput(t.toneMapping,t.currentColorSpace);return vv.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new tv,this.nodeBuilderCache=new Map,this.cacheLib={}}}const wv=new Me;class Av{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new Iv(i.framebufferWidth,i.framebufferHeight,{format:de,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;Ov(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function Hv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function $v(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new Ev(this,r),this._animation=new pf(this._nodes,this.info),this._attributes=new Ef(r),this._background=new v_(this,this._nodes),this._geometries=new Rf(this._attributes,this.info),this._textures=new Qf(this,r,this.info),this._pipelines=new If(r,this._nodes),this._bindings=new Df(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new bf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new zf(this.lighting),this._bundles=new Mv,this._renderContexts=new Kf,this._animation.start(),this._initialized=!0,e(this)})),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:Wv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new Av),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)}),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=zl,this.overrideNodes.modelNormalViewMatrix=Hl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===zl&&this.overrideNodes.modelNormalViewMatrix===Hl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=x,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(jv),p.scissorValue.copy(y).multiplyScalar(b).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(jv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Av),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Kv:Xv;t.isArrayCamera||(Yv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(Yv,t.coordinateSystem,t.reversedDepth));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:E,transparent:w,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_setXRLayerSize(e,t){this._width=e,this._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:c.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()}),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls;const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.delete(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Qv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=Qv.copy(t).floor()}else t=Qv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?Kv:Xv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Qv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(Yv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Qv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?Kv:Xv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Qv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(Yv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=S;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=qe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=E}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===E&&!1===i.forceSinglePass?(i.side=S,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=qe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=E):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class Jv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class eN extends Jv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Sf-e%Sf)%Sf;var e}get buffer(){return this._buffer}update(){return!0}}class tN extends eN{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let rN=0;class sN extends tN{constructor(e,t){super("UniformBuffer_"+rN++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class iN extends tN{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.texture=null},this.texture=t,this.version=t?t.version:0,this.generation=null,this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onDisposeTexture),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onDisposeTexture))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}}let uN=0;class lN extends oN{constructor(e,t){super(e,t),this.id=uN++,this.store=!1,this.isSampledTexture=!0}}class dN extends lN{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class cN extends dN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class hN extends dN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const pN={textureDimensions:"textureSize",equals:"equal"},gN={low:"lowp",medium:"mediump",high:"highp"},mN={swizzleAssign:!0,storageBuffer:!1},fN={perspective:"smooth",linear:"noperspective"},yN={centroid:"centroid"},bN="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class xN extends ev{constructor(e,t){super(e,t,new _v),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==b}getMethod(e){return pN[e]||e}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?it:nt;2===s?n=i?lt:Ve:3===s?n=i?dt:ct:4===s&&(n=i?ht:de);const a={Float32Array:I,Uint8Array:Ce,Uint16Array:ut,Uint32Array:T,Int8Array:ot,Int16Array:at,Int32Array:_,Uint8ClampedArray:Ce},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=gN[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==_){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${fN[s.interpolationType]||s.interpolationType} ${yN[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${fN[e.interpolationType]||e.interpolationType} ${yN[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=mN[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}mN[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new dN(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new cN(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new hN(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new sN(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new aN(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let TN=null,_N=null;class vN{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void pt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void pt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return TN=TN||new t,this.renderer.getDrawingBufferSize(TN)}setScissorTest(){}getClearColor(){const e=this.renderer;return _N=_N||new Zf,e.getClearColor(_N),_N.getRGB(_N),_N}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:gt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${He} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let NN,SN,EN=0;class wN{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class AN{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===_,id:EN++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new wN(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let MN,PN,BN,LN=!1;class FN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===LN&&(this._init(),LN=!0)}_init(){const e=this.gl;MN={[Nr]:e.REPEAT,[vr]:e.CLAMP_TO_EDGE,[_r]:e.MIRRORED_REPEAT},PN={[v]:e.NEAREST,[Sr]:e.NEAREST_MIPMAP_NEAREST,[Ge]:e.NEAREST_MIPMAP_LINEAR,[Y]:e.LINEAR,[ke]:e.LINEAR_MIPMAP_NEAREST,[V]:e.LINEAR_MIPMAP_LINEAR},BN={[Pr]:e.NEVER,[Mr]:e.ALWAYS,[De]:e.LESS,[Cr]:e.LEQUAL,[Rr]:e.EQUAL,[Ar]:e.GEQUAL,[wr]:e.GREATER,[Er]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=c.getPrimaries(c.workingColorSpace),a=t.colorSpace===b?null:c.getPrimaries(t.colorSpace),o=t.colorSpace===b||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,MN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,MN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,MN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,PN[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===Y&&u?V:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,PN[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,BN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===v)return;if(t.minFilter!==Ge&&t.minFilter!==V)return;if(t.type===I&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}function IN(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class DN{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class VN{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const UN={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class ON{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce((e,t)=>e+t,0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class zN extends vN{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new DN(this),this.capabilities=new VN(this),this.attributeUtils=new AN(this),this.textureUtils=new FN(this),this.bufferRenderer=new ON(this),this.state=new RN(this),this.utils=new CN(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new GN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(o)){const i=s.framebuffers[e.getCacheKey()];let n=t.COLOR_BUFFER_BIT;o.resolveDepthBuffer&&(o.depthBuffer&&(n|=t.DEPTH_BUFFER_BIT),o.stencilBuffer&&o.resolveStencilBuffer&&(n|=t.STENCIL_BUFFER_BIT));const a=s.msaaFrameBuffer,u=s.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i),d)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(pt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):pt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eUN[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Wf(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,0)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const HN="point-list",$N="line-list",WN="line-strip",qN="triangle-list",jN="triangle-strip",XN="never",KN="less",YN="equal",QN="less-equal",ZN="greater",JN="not-equal",eS="greater-equal",tS="always",rS="store",sS="load",iS="clear",nS="ccw",aS="none",oS="front",uS="back",lS="uint16",dS="uint32",cS="r8unorm",hS="r8snorm",pS="r8uint",gS="r8sint",mS="r16uint",fS="r16sint",yS="r16float",bS="rg8unorm",xS="rg8snorm",TS="rg8uint",_S="rg8sint",vS="r32uint",NS="r32sint",SS="r32float",ES="rg16uint",wS="rg16sint",AS="rg16float",RS="rgba8unorm",CS="rgba8unorm-srgb",MS="rgba8snorm",PS="rgba8uint",BS="rgba8sint",LS="bgra8unorm",FS="bgra8unorm-srgb",IS="rgb9e5ufloat",DS="rgb10a2unorm",VS="rgb10a2unorm",US="rg32uint",OS="rg32sint",kS="rg32float",GS="rgba16uint",zS="rgba16sint",HS="rgba16float",$S="rgba32uint",WS="rgba32sint",qS="rgba32float",jS="depth16unorm",XS="depth24plus",KS="depth24plus-stencil8",YS="depth32float",QS="depth32float-stencil8",ZS="bc1-rgba-unorm",JS="bc1-rgba-unorm-srgb",eE="bc2-rgba-unorm",tE="bc2-rgba-unorm-srgb",rE="bc3-rgba-unorm",sE="bc3-rgba-unorm-srgb",iE="bc4-r-unorm",nE="bc4-r-snorm",aE="bc5-rg-unorm",oE="bc5-rg-snorm",uE="bc6h-rgb-ufloat",lE="bc6h-rgb-float",dE="bc7-rgba-unorm",cE="bc7-rgba-srgb",hE="etc2-rgb8unorm",pE="etc2-rgb8unorm-srgb",gE="etc2-rgb8a1unorm",mE="etc2-rgb8a1unorm-srgb",fE="etc2-rgba8unorm",yE="etc2-rgba8unorm-srgb",bE="eac-r11unorm",xE="eac-r11snorm",TE="eac-rg11unorm",_E="eac-rg11snorm",vE="astc-4x4-unorm",NE="astc-4x4-unorm-srgb",SE="astc-5x4-unorm",EE="astc-5x4-unorm-srgb",wE="astc-5x5-unorm",AE="astc-5x5-unorm-srgb",RE="astc-6x5-unorm",CE="astc-6x5-unorm-srgb",ME="astc-6x6-unorm",PE="astc-6x6-unorm-srgb",BE="astc-8x5-unorm",LE="astc-8x5-unorm-srgb",FE="astc-8x6-unorm",IE="astc-8x6-unorm-srgb",DE="astc-8x8-unorm",VE="astc-8x8-unorm-srgb",UE="astc-10x5-unorm",OE="astc-10x5-unorm-srgb",kE="astc-10x6-unorm",GE="astc-10x6-unorm-srgb",zE="astc-10x8-unorm",HE="astc-10x8-unorm-srgb",$E="astc-10x10-unorm",WE="astc-10x10-unorm-srgb",qE="astc-12x10-unorm",jE="astc-12x10-unorm-srgb",XE="astc-12x12-unorm",KE="astc-12x12-unorm-srgb",YE="clamp-to-edge",QE="repeat",ZE="mirror-repeat",JE="linear",ew="nearest",tw="zero",rw="one",sw="src",iw="one-minus-src",nw="src-alpha",aw="one-minus-src-alpha",ow="dst",uw="one-minus-dst",lw="dst-alpha",dw="one-minus-dst-alpha",cw="src-alpha-saturated",hw="constant",pw="one-minus-constant",gw="add",mw="subtract",fw="reverse-subtract",yw="min",bw="max",xw=0,Tw=15,_w="keep",vw="zero",Nw="replace",Sw="invert",Ew="increment-clamp",ww="decrement-clamp",Aw="increment-wrap",Rw="decrement-wrap",Cw="storage",Mw="read-only-storage",Pw="write-only",Bw="read-only",Lw="read-write",Fw="non-filtering",Iw="comparison",Dw="float",Vw="unfilterable-float",Uw="depth",Ow="sint",kw="uint",Gw="2d",zw="3d",Hw="2d",$w="2d-array",Ww="cube",qw="3d",jw="all",Xw="vertex",Kw="instance",Yw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"};class Qw extends oN{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class Zw extends eN{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Jw=0;class eA extends Zw{constructor(e,t){super("StorageBuffer_"+Jw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class tA extends xf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:JE}),this.flipYSampler=e.createSampler({minFilter:ew}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:jN,stripIndexFormat:dS},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:jN,stripIndexFormat:dS},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:iS,storeOp:rS,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,oA=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,uA={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class lA extends fv{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(aA);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=oA.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class dA extends mv{parseFunction(e){return new lA(e)}}const cA="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},hA={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},pA={[Nr]:"repeat",[vr]:"clamp",[_r]:"mirror"},gA={vertex:cA?cA.VERTEX:1,fragment:cA?cA.FRAGMENT:2,compute:cA?cA.COMPUTE:4},mA={instance:!0,swizzleAssign:!1,storageBuffer:!0},fA={"^^":"tsl_xor"},yA={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},bA={},xA={tsl_xor:new qb("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new qb("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new qb("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new qb("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new qb("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new qb("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new qb("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new qb("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new qb("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new qb("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new qb("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new qb("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new qb("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},TA={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(xA.pow_float=new qb("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),xA.pow_vec2=new qb("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[xA.pow_float]),xA.pow_vec3=new qb("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[xA.pow_float]),xA.pow_vec4=new qb("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[xA.pow_float]),TA.pow_float="tsl_pow_float",TA.pow_vec2="tsl_pow_vec2",TA.pow_vec3="tsl_pow_vec3",TA.pow_vec4="tsl_pow_vec4");let _A="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(_A+="diagnostic( off, derivative_uniformity );\n");class vA extends ev{constructor(e,t){super(e,t,new dA),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${pA[e.wrapS]}S_${pA[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=bA[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Nr?(s.push(xA.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===vr?(s.push(xA.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===_r?(s.push(xA.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",bA[t]=r=new qb(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new nu(new Hu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new nu(new Hu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new nu(new Hu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===I||!1===this.isSampleCompare(e)&&e.minFilter===v&&e.magFilter===v||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return!0===e.isDepthTexture&&!0===e.isArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=fA[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(console.warn("WebGPURenderer: Atomic operations are only supported in compute shaders."),ks.READ_WRITE):ks.READ_ONLY:e.access}getStorageAccess(e,t){return hA[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new hN(i.name,i.node,o,n):new dN(i.name,i.node,o,n):"cubeTexture"===t?s=new cN(i.name,i.node,o,n):"texture3D"===t&&(s=new hN(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(gA[r]),!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Qw(`${i.name}_sampler`,i.node,o);e.setVisibility(gA[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?sN:eA)(e,o);n.setVisibility(gA[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new aN(u,o),s.setVisibility(gA[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=nA(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return yA[e]||e}isAvailable(e){let t=mA[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),mA[e]=t),t}_getWGSLMethod(e){return void 0!==xA[e]&&this._include(e),TA[e]}_include(e){const t=xA[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${_A}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class NA{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=KS:e.depth&&(t=XS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?HN:e.isLineSegments||e.isMesh&&!0===t.wireframe?$N:e.isLine?WN:e.isMesh?qN:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return LS;if(e===ce)return HS;throw new Error("Unsupported outputType")}}const SA=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&SA.set(Float16Array,["float16"]);const EA=new Map([[ze,["float16"]]]),wA=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class AA{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Vw)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=Vw:s.sampleType=Uw;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===_?s.sampleType=Ow:e===T?s.sampleType=kw:e===I&&(this.backend.hasFeature("float32-filterable")?s.sampleType=Dw:s.sampleType=Vw)}r.isSampledCubeTexture?s.viewDimension=Ww:r.texture.isArrayTexture||r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=$w:r.isSampledTexture3D&&(s.viewDimension=qw),e.texture=s}else if(r.isSampler){const s={};r.texture.isDepthTexture&&(null!==r.texture.compareFunction?s.type=Iw:t.compatibilityMode&&(s.type=Fw)),e.sampler=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount;let s=`view-${e.texture.width}-${e.texture.height}`;if(e.texture.depthOrArrayLayers>1&&(s+=`-${e.texture.depthOrArrayLayers}`),s+=`-${r}`,a=e[s],void 0===a){const i=jw;let n;n=t.isSampledCubeTexture?Ww:t.isSampledTexture3D?qw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?$w:Hw,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class CA{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;s.blending===H||s.blending===k&&!1===s.transparent||(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise(e=>{l.createRenderPipelineAsync(S).then(t=>{c.pipeline=t,e()})});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===je){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:gw},r={srcFactor:i,dstFactor:n,operation:gw}};if(e.premultipliedAlpha)switch(s){case k:i(rw,aw,rw,aw);break;case Bt:i(rw,rw,rw,rw);break;case Pt:i(tw,iw,tw,rw);break;case Mt:i(ow,aw,tw,rw)}else switch(s){case k:i(nw,aw,rw,aw);break;case Bt:i(nw,rw,rw,rw);break;case Pt:console.error("THREE.WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Mt:console.error("THREE.WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=tw;break;case wt:t=rw;break;case Et:t=sw;break;case Tt:t=iw;break;case St:t=nw;break;case xt:t=aw;break;case vt:t=ow;break;case bt:t=uw;break;case _t:t=lw;break;case yt:t=dw;break;case Nt:t=cw;break;case 211:t=hw;break;case 212:t=pw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case kr:t=XN;break;case Or:t=tS;break;case Ur:t=KN;break;case Vr:t=QN;break;case Dr:t=YN;break;case Ir:t=eS;break;case Fr:t=ZN;break;case Lr:t=JN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=_w;break;case jr:t=vw;break;case qr:t=Nw;break;case Wr:t=Sw;break;case $r:t=Ew;break;case Hr:t=ww;break;case zr:t=Aw;break;case Gr:t=Rw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=gw;break;case ft:t=mw;break;case mt:t=fw;break;case Yr:t=yw;break;case Kr:t=bw;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?lS:dS),r.side){case qe:s.frontFace=nS,s.cullMode=uS;break;case S:s.frontFace=nS,s.cullMode=oS;break;case E:s.frontFace=nS,s.cullMode=aS;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Tw:xw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=tS;else{const r=e.depthFunc;switch(r){case kt:t=XN;break;case Ot:t=tS;break;case Ut:t=KN;break;case Vt:t=QN;break;case Dt:t=YN;break;case It:t=eS;break;case Ft:t=ZN;break;case Lt:t=JN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class MA extends kN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class PA extends vN{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new NA(this),this.attributeUtils=new AA(this),this.bindingUtils=new RA(this),this.pipelineUtils=new CA(this),this.textureUtils=new iA(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Yw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)});const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Yw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:sS}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea&&(u[0]=Math.min(i,a),u[1]=Math.ceil(i/a)),n.dispatchSize=u}u=n.dispatchSize}else u=i;a.dispatchWorkgroups(u[0],u[1]||1,u[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{this.pipelineUtils.setPipeline(t,u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&pt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new zN(e)));super(new t(e),e),this.library=new FA,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class DA extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class VA{constructor(e,t=ln(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new yp;r.name="PostProcessing",this._quadMesh=new qy(r),this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ju(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}}class UA extends x{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class OA extends x{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=Y,this.minFilter=Y,this.wrapR=vr,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class kA extends x{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class GA extends sb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class zA extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Yi()):Ii(new this.nodes[e])}}class HA extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class $A extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new zA;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new HA;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>bs(e),Ts=e=>bs(e),_s=(...e)=>bs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(bs(s.slice(0,-4)),i.getCacheKey(t));return bs(r)}function*Ns(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0)).buffer}var Ds=Object.freeze({__proto__:null,arrayBufferToBase64:Fs,base64ToArrayBuffer:Is,getByteBoundaryFromType:Ms,getCacheKey:vs,getDataFromObject:Ls,getLengthFromType:Rs,getMemoryLengthFromType:Cs,getNodeChildren:Ns,getTypeFromLength:ws,getTypedArrayFromType:As,getValueFromType:Bs,getValueType:Ps,hash:_s,hashArray:Ts,hashString:xs});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],Hs=[...Gs,"compute"],$s=["x","y","z","w"],Ws={analyze:"setup",generate:"analyze"};let qs=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:qs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of Ns(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=_s(vs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}getArrayCount(){return null}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e,t=null){const r=e.increaseUsage(this);if(!0===this.parents){const r=e.getDataFromNode(this,"any");r.stages=r.stages||{},r.stages[e.shaderStage]=r.stages[e.shaderStage]||[],r.stages[e.shaderStage].push(t)}if(1===r){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e,this)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);const s=e.getDataFromNode(this);s.buildStages=s.buildStages||{},s.buildStages[e.buildStage]=!0;const i=Ws[e.buildStage];if(i&&!0!==s.buildStages[i]){const t=e.getBuildStage();e.setBuildStage(i),this.build(e),e.setBuildStage(t)}e.addNode(this),e.addChain(this);let n=null;const a=e.getBuildStage();if("setup"===a){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0,t.outputNode=this.setup(e)||t.outputNode||null;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}}n=t.outputNode}else if("analyze"===a)this.analyze(e,t);else if("generate"===a){if(1===this.generate.length){const r=this.getNodeType(e),s=e.getDataFromNode(this);n=s.snippet,void 0===n?void 0===s.generated?(s.generated=!0,n=this.generate(e)||"",s.snippet=n):(console.warn("THREE.Node: Recursion detected.",this),n="/* Recursion detected. */"):void 0!==s.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),n=e.format(n,r,t)}else n=this.generate(e,t)||"";""===n&&null!==t&&"void"!==t&&"OutputType"!==t&&(console.error(`THREE.TSL: Invalid generated code, expected a "${t}".`),n=e.generateConst(t))}return e.removeChain(this),e.addSequentialNode(this),n}getSerializeChildren(){return Ns(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Xs extends js{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ks extends js{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Ys extends js{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Qs extends Ys{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Zs=$s.join("");class Js extends js{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max($s.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Zs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class ei extends Ys{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),di=e=>li(e).split("").sort().join(""),ci={setup(e,t){const r=t.shift();return e(Vi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ai.assign(r,...e),r);if(oi.has(t)){const s=oi.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("toVarIntent"===t)return()=>r;if("self"===t)return e;if(t.endsWith("Assign")&&oi.has(t.slice(0,t.length-6))){const s=oi.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=li(t),Ii(new Js(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(3).toLowerCase()),r=>Ii(new ei(e,t,Ii(r)));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(4).toLowerCase()),()=>Ii(new ti(Ii(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ii(new Js(e,t));if(!0===/^\d+$/.test(t))return Ii(new Xs(r,new ii(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Ii(new ni(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},hi=new WeakMap,pi=new WeakMap,gi=function(e,t=null){for(const r in e)e[r]=Ii(e[r],t);return e},mi=function(e,t=null){const r=e.length;for(let s=0;so?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ui(l(t)))):null!==r?(r=Ii(r),n=(...s)=>i(new e(t,...Ui(l(s)),r))):n=(...r)=>i(new e(t,...Ui(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},yi=function(e,...t){return Ii(new e(...Ui(t)))};class bi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn;e.subBuildFn=i;let o=null;if(t.layout){let s=pi.get(e.constructor);void 0===s&&(s=new WeakMap,pi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Ii(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i),o=Ii(i.call(r))}else{let s=r;if(Array.isArray(s)){let e=0;s=new Proxy(s,{get:(t,r,s)=>{let i;return i=void 0===t[r]?t[e++]:Reflect.get(t,r,s),i}})}const i=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),n=t.jsFunc,a=null!==s||n.length>1?n(s||[],i):n(i);o=Ii(a)}return e.subBuildFn=a,t.once&&(s[n]=o),o}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e);if("setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return r}}class xi extends js{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Vi(e),Ii(new bi(this,e))}setup(){return this.call()}}const Ti=[!1,!0],_i=[0,1,2,3],vi=[-1,-2],Ni=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Si=new Map;for(const e of Ti)Si.set(e,new ii(e));const Ei=new Map;for(const e of _i)Ei.set(e,new ii(e,"uint"));const wi=new Map([...Ei].map(e=>new ii(e.value,"int")));for(const e of vi)wi.set(e,new ii(e,"int"));const Ai=new Map([...wi].map(e=>new ii(e.value)));for(const e of Ni)Ai.set(e,new ii(e));for(const e of Ni)Ai.set(-e,new ii(-e));const Ri={bool:Si,uint:Ei,ints:wi,float:Ai},Ci=new Map([...Si,...Ai]),Mi=(e,t)=>Ci.has(e)?Ci.get(e):!0===e.isNode?e:new ii(e,t),Pi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return console.error(`THREE.TSL: Invalid parameter for the type "${e}".`),Ii(new ii(0,e));if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Bs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Di(t.get(r[0]));if(1===r.length){const t=Mi(r[0],e);return t.nodeType===e?Di(t):Di(new Ks(t,e))}const s=r.map(e=>Mi(e));return Di(new Qs(s,e))}},Bi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),ci)}const Ii=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=hi.get(e);return void 0===t&&(t=new Proxy(e,ci),hi.set(e,t),hi.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ii(Mi(e,t)):"shader"===r?e.isFn?e:$i(e):e}(e,t),Di=(e,t=null)=>Ii(e,t).toVarIntent(),Vi=(e,t=null)=>new gi(e,t),Ui=(e,t=null)=>new mi(e,t),Oi=(e,t=null,r=null,s=null)=>new fi(e,t,r,s),ki=(e,...t)=>new yi(e,...t),Gi=(e,t=null,r=null,s={})=>new fi(e,t,r,{intent:!0,...s});let zi=0;class Hi extends js{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null)),this.shaderNode=new Fi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+zi++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){let t;Vi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];const r=this.shaderNode.call(t);return"void"===this.shaderNode.nodeType&&r.toStack(),r.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return console.error('THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function $i(e,t=null){const r=new Hi(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const Wi=e=>{ai=e},qi=()=>ai,ji=(...e)=>ai.If(...e);function Xi(e){return ai&&ai.add(e),e}ui("toStack",Xi);const Ki=new Pi("color"),Yi=new Pi("float",Ri.float),Qi=new Pi("int",Ri.ints),Zi=new Pi("uint",Ri.uint),Ji=new Pi("bool",Ri.bool),en=new Pi("vec2"),tn=new Pi("ivec2"),rn=new Pi("uvec2"),sn=new Pi("bvec2"),nn=new Pi("vec3"),an=new Pi("ivec3"),on=new Pi("uvec3"),un=new Pi("bvec3"),ln=new Pi("vec4"),dn=new Pi("ivec4"),cn=new Pi("uvec4"),hn=new Pi("bvec4"),pn=new Pi("mat2"),gn=new Pi("mat3"),mn=new Pi("mat4");ui("toColor",Ki),ui("toFloat",Yi),ui("toInt",Qi),ui("toUint",Zi),ui("toBool",Ji),ui("toVec2",en),ui("toIVec2",tn),ui("toUVec2",rn),ui("toBVec2",sn),ui("toVec3",nn),ui("toIVec3",an),ui("toUVec3",on),ui("toBVec3",un),ui("toVec4",ln),ui("toIVec4",dn),ui("toUVec4",cn),ui("toBVec4",hn),ui("toMat2",pn),ui("toMat3",gn),ui("toMat4",mn);const fn=Oi(Xs).setParameterLength(2),yn=(e,t)=>Ii(new Ks(Ii(e),t));ui("element",fn),ui("convert",yn);ui("append",e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),Xi(e)));class bn extends js{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const xn=(e,t)=>Ii(new bn(e,t)),Tn=(e,t)=>Ii(new bn(e,t,!0)),_n=ki(bn,"vec4","DiffuseColor"),vn=ki(bn,"vec3","EmissiveColor"),Nn=ki(bn,"float","Roughness"),Sn=ki(bn,"float","Metalness"),En=ki(bn,"float","Clearcoat"),wn=ki(bn,"float","ClearcoatRoughness"),An=ki(bn,"vec3","Sheen"),Rn=ki(bn,"float","SheenRoughness"),Cn=ki(bn,"float","Iridescence"),Mn=ki(bn,"float","IridescenceIOR"),Pn=ki(bn,"float","IridescenceThickness"),Bn=ki(bn,"float","AlphaT"),Ln=ki(bn,"float","Anisotropy"),Fn=ki(bn,"vec3","AnisotropyT"),In=ki(bn,"vec3","AnisotropyB"),Dn=ki(bn,"color","SpecularColor"),Vn=ki(bn,"float","SpecularF90"),Un=ki(bn,"float","Shininess"),On=ki(bn,"vec4","Output"),kn=ki(bn,"float","dashSize"),Gn=ki(bn,"float","gapSize"),zn=ki(bn,"float","pointWidth"),Hn=ki(bn,"float","IOR"),$n=ki(bn,"float","Transmission"),Wn=ki(bn,"float","Thickness"),qn=ki(bn,"float","AttenuationDistance"),jn=ki(bn,"color","AttenuationColor"),Xn=ki(bn,"float","Dispersion");class Kn extends js{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Yn=e=>new Kn(e),Qn=(e,t=0)=>new Kn(e,!0,t),Zn=Qn("frame"),Jn=Qn("render"),ea=Yn("object");class ta extends ri{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ea}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate(t=>{const s=e(t,r);void 0!==s&&(this.value=s)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const ra=(e,t)=>{const r=Li(t||e);return r===e&&(e=Bs(r)),e=e&&!0===e.isNode?e.node&&e.node.value||e.value:e,Ii(new ta(e,r))};class sa extends Ys{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ia=(...e)=>{let t;if(1===e.length){const r=e[0];t=new sa(null,r.length,r)}else{const r=e[0],s=e[1];t=new sa(r,s)}return Ii(t)};ui("toArray",(e,t)=>ia(Array(t).fill(e)));class na extends Ys{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return $s.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this;e.getNodeProperties(t).assign=!0;const s=e.getNodeProperties(this);s.sourceNode=r,s.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ui(t):Vi(t[0]),Ii(new oa(Ii(e),t)));ui("call",ua);const la={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class da extends Ys{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new da(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const ca=Gi(da,"+").setParameterLength(2,1/0).setName("add"),ha=Gi(da,"-").setParameterLength(2,1/0).setName("sub"),pa=Gi(da,"*").setParameterLength(2,1/0).setName("mul"),ga=Gi(da,"/").setParameterLength(2,1/0).setName("div"),ma=Gi(da,"%").setParameterLength(2).setName("mod"),fa=Gi(da,"==").setParameterLength(2).setName("equal"),ya=Gi(da,"!=").setParameterLength(2).setName("notEqual"),ba=Gi(da,"<").setParameterLength(2).setName("lessThan"),xa=Gi(da,">").setParameterLength(2).setName("greaterThan"),Ta=Gi(da,"<=").setParameterLength(2).setName("lessThanEqual"),_a=Gi(da,">=").setParameterLength(2).setName("greaterThanEqual"),va=Gi(da,"&&").setParameterLength(2,1/0).setName("and"),Na=Gi(da,"||").setParameterLength(2,1/0).setName("or"),Sa=Gi(da,"!").setParameterLength(1).setName("not"),Ea=Gi(da,"^^").setParameterLength(2).setName("xor"),wa=Gi(da,"&").setParameterLength(2).setName("bitAnd"),Aa=Gi(da,"~").setParameterLength(2).setName("bitNot"),Ra=Gi(da,"|").setParameterLength(2).setName("bitOr"),Ca=Gi(da,"^").setParameterLength(2).setName("bitXor"),Ma=Gi(da,"<<").setParameterLength(2).setName("shiftLeft"),Pa=Gi(da,">>").setParameterLength(2).setName("shiftRight"),Ba=$i(([e])=>(e.addAssign(1),e)),La=$i(([e])=>(e.subAssign(1),e)),Fa=$i(([e])=>{const t=Qi(e).toConst();return e.addAssign(1),t}),Ia=$i(([e])=>{const t=Qi(e).toConst();return e.subAssign(1),t});ui("add",ca),ui("sub",ha),ui("mul",pa),ui("div",ga),ui("mod",ma),ui("equal",fa),ui("notEqual",ya),ui("lessThan",ba),ui("greaterThan",xa),ui("lessThanEqual",Ta),ui("greaterThanEqual",_a),ui("and",va),ui("or",Na),ui("not",Sa),ui("xor",Ea),ui("bitAnd",wa),ui("bitNot",Aa),ui("bitOr",Ra),ui("bitXor",Ca),ui("shiftLeft",Ma),ui("shiftRight",Pa),ui("incrementBefore",Ba),ui("decrementBefore",La),ui("increment",Fa),ui("decrement",Ia);const Da=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ma(Qi(e),Qi(t)));ui("modInt",Da);class Va extends Ys{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Va.MAX||e===Va.MIN)&&arguments.length>3){let i=new Va(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Va.LENGTH||t===Va.DISTANCE||t===Va.DOT?"float":t===Va.CROSS?"vec3":t===Va.ALL||t===Va.ANY?"bool":t===Va.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===Va.ONE_MINUS)i=ha(1,t);else if(s===Va.RECIPROCAL)i=ga(1,t);else if(s===Va.DIFFERENCE)i=uo(ha(t,r));else if(s===Va.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=ln(nn(n),0):s=ln(nn(s),0);const a=pa(s,n).xyz;i=eo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Va.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const c=[];return r===Va.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Va.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Va.MIN&&r!==Va.MAX?r===Va.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Va.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Va.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Va.DFDX&&r!==Va.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Va.ALL="all",Va.ANY="any",Va.RADIANS="radians",Va.DEGREES="degrees",Va.EXP="exp",Va.EXP2="exp2",Va.LOG="log",Va.LOG2="log2",Va.SQRT="sqrt",Va.INVERSE_SQRT="inversesqrt",Va.FLOOR="floor",Va.CEIL="ceil",Va.NORMALIZE="normalize",Va.FRACT="fract",Va.SIN="sin",Va.COS="cos",Va.TAN="tan",Va.ASIN="asin",Va.ACOS="acos",Va.ATAN="atan",Va.ABS="abs",Va.SIGN="sign",Va.LENGTH="length",Va.NEGATE="negate",Va.ONE_MINUS="oneMinus",Va.DFDX="dFdx",Va.DFDY="dFdy",Va.ROUND="round",Va.RECIPROCAL="reciprocal",Va.TRUNC="trunc",Va.FWIDTH="fwidth",Va.TRANSPOSE="transpose",Va.DETERMINANT="determinant",Va.INVERSE="inverse",Va.BITCAST="bitcast",Va.EQUALS="equals",Va.MIN="min",Va.MAX="max",Va.STEP="step",Va.REFLECT="reflect",Va.DISTANCE="distance",Va.DIFFERENCE="difference",Va.DOT="dot",Va.CROSS="cross",Va.POW="pow",Va.TRANSFORM_DIRECTION="transformDirection",Va.MIX="mix",Va.CLAMP="clamp",Va.REFRACT="refract",Va.SMOOTHSTEP="smoothstep",Va.FACEFORWARD="faceforward";const Ua=Yi(1e-6),Oa=Yi(1e6),ka=Yi(Math.PI),Ga=Yi(2*Math.PI),za=Gi(Va,Va.ALL).setParameterLength(1),Ha=Gi(Va,Va.ANY).setParameterLength(1),$a=Gi(Va,Va.RADIANS).setParameterLength(1),Wa=Gi(Va,Va.DEGREES).setParameterLength(1),qa=Gi(Va,Va.EXP).setParameterLength(1),ja=Gi(Va,Va.EXP2).setParameterLength(1),Xa=Gi(Va,Va.LOG).setParameterLength(1),Ka=Gi(Va,Va.LOG2).setParameterLength(1),Ya=Gi(Va,Va.SQRT).setParameterLength(1),Qa=Gi(Va,Va.INVERSE_SQRT).setParameterLength(1),Za=Gi(Va,Va.FLOOR).setParameterLength(1),Ja=Gi(Va,Va.CEIL).setParameterLength(1),eo=Gi(Va,Va.NORMALIZE).setParameterLength(1),to=Gi(Va,Va.FRACT).setParameterLength(1),ro=Gi(Va,Va.SIN).setParameterLength(1),so=Gi(Va,Va.COS).setParameterLength(1),io=Gi(Va,Va.TAN).setParameterLength(1),no=Gi(Va,Va.ASIN).setParameterLength(1),ao=Gi(Va,Va.ACOS).setParameterLength(1),oo=Gi(Va,Va.ATAN).setParameterLength(1,2),uo=Gi(Va,Va.ABS).setParameterLength(1),lo=Gi(Va,Va.SIGN).setParameterLength(1),co=Gi(Va,Va.LENGTH).setParameterLength(1),ho=Gi(Va,Va.NEGATE).setParameterLength(1),po=Gi(Va,Va.ONE_MINUS).setParameterLength(1),go=Gi(Va,Va.DFDX).setParameterLength(1),mo=Gi(Va,Va.DFDY).setParameterLength(1),fo=Gi(Va,Va.ROUND).setParameterLength(1),yo=Gi(Va,Va.RECIPROCAL).setParameterLength(1),bo=Gi(Va,Va.TRUNC).setParameterLength(1),xo=Gi(Va,Va.FWIDTH).setParameterLength(1),To=Gi(Va,Va.TRANSPOSE).setParameterLength(1),_o=Gi(Va,Va.DETERMINANT).setParameterLength(1),vo=Gi(Va,Va.INVERSE).setParameterLength(1),No=Gi(Va,Va.BITCAST).setParameterLength(2),So=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),fa(e,t)),Eo=Gi(Va,Va.MIN).setParameterLength(2,1/0),wo=Gi(Va,Va.MAX).setParameterLength(2,1/0),Ao=Gi(Va,Va.STEP).setParameterLength(2),Ro=Gi(Va,Va.REFLECT).setParameterLength(2),Co=Gi(Va,Va.DISTANCE).setParameterLength(2),Mo=Gi(Va,Va.DIFFERENCE).setParameterLength(2),Po=Gi(Va,Va.DOT).setParameterLength(2),Bo=Gi(Va,Va.CROSS).setParameterLength(2),Lo=Gi(Va,Va.POW).setParameterLength(2),Fo=Gi(Va,Va.POW,2).setParameterLength(1),Io=Gi(Va,Va.POW,3).setParameterLength(1),Do=Gi(Va,Va.POW,4).setParameterLength(1),Vo=Gi(Va,Va.TRANSFORM_DIRECTION).setParameterLength(2),Uo=e=>pa(lo(e),Lo(uo(e),1/3)),Oo=e=>Po(e,e),ko=Gi(Va,Va.MIX).setParameterLength(3),Go=(e,t=0,r=1)=>Ii(new Va(Va.CLAMP,Ii(e),Ii(t),Ii(r))),zo=e=>Go(e),Ho=Gi(Va,Va.REFRACT).setParameterLength(3),$o=Gi(Va,Va.SMOOTHSTEP).setParameterLength(3),Wo=Gi(Va,Va.FACEFORWARD).setParameterLength(3),qo=$i(([e])=>{const t=Po(e.xy,en(12.9898,78.233)),r=ma(t,ka);return to(ro(r).mul(43758.5453))}),jo=(e,t,r)=>ko(t,r,e),Xo=(e,t,r)=>$o(t,r,e),Ko=(e,t)=>Ao(t,e),Yo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),oo(e,t)),Qo=Wo,Zo=Qa;ui("all",za),ui("any",Ha),ui("equals",So),ui("radians",$a),ui("degrees",Wa),ui("exp",qa),ui("exp2",ja),ui("log",Xa),ui("log2",Ka),ui("sqrt",Ya),ui("inverseSqrt",Qa),ui("floor",Za),ui("ceil",Ja),ui("normalize",eo),ui("fract",to),ui("sin",ro),ui("cos",so),ui("tan",io),ui("asin",no),ui("acos",ao),ui("atan",oo),ui("abs",uo),ui("sign",lo),ui("length",co),ui("lengthSq",Oo),ui("negate",ho),ui("oneMinus",po),ui("dFdx",go),ui("dFdy",mo),ui("round",fo),ui("reciprocal",yo),ui("trunc",bo),ui("fwidth",xo),ui("atan2",Yo),ui("min",Eo),ui("max",wo),ui("step",Ko),ui("reflect",Ro),ui("distance",Co),ui("dot",Po),ui("cross",Bo),ui("pow",Lo),ui("pow2",Fo),ui("pow3",Io),ui("pow4",Do),ui("transformDirection",Vo),ui("mix",jo),ui("clamp",Go),ui("refract",Ho),ui("smoothstep",Xo),ui("faceForward",Wo),ui("difference",Mo),ui("saturate",zo),ui("cbrt",Uo),ui("transpose",To),ui("determinant",_o),ui("inverse",vo),ui("rand",qo);class Jo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?xn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(d,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const eu=Oi(Jo).setParameterLength(2,3);ui("select",eu);class tu extends js{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const ru=Oi(tu).setParameterLength(1,2),su=e=>ru(e,{uniformFlow:!0}),iu=(e,t)=>ru(e,{nodeName:t});function nu(e,t){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),iu(e,t)}ui("context",ru),ui("label",nu),ui("uniformFlow",su),ui("setName",iu);class au extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}build(...e){if(!0===this.intent){if(!0!==e[0].getNodeProperties(this).assign)return this.node.build(...e)}return super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=t.getArrayCount(e);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const ou=Oi(au),uu=(e,t=null)=>ou(e,t).toStack(),lu=(e,t=null)=>ou(e,t,!0).toStack(),du=e=>null===qi()?e:ou(e).setIntent(!0).toStack();ui("toVar",uu),ui("toConst",lu),ui("toVarIntent",du);class cu extends js{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const hu=(e,t,r=null)=>Ii(new cu(Ii(e),t,r));class pu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=hu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const gu=Oi(pu).setParameterLength(1,2),mu=e=>gu(e);ui("toVarying",gu),ui("toVertexStage",mu),ui("varying",(...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),gu(...e))),ui("vertexStage",(...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),gu(...e)));const fu=$i(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ko(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),yu=$i(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ko(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),bu="WorkingColorSpace";class xu extends Ys{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===bu?c.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=ln(fu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=ln(gn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=ln(yu(i.rgb),i.a)),i):i}}const Tu=(e,t)=>Ii(new xu(Ii(e),bu,t)),_u=(e,t)=>Ii(new xu(Ii(e),t,bu));ui("workingToColorSpace",Tu),ui("colorSpaceToWorking",_u);let vu=class extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Nu extends js{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ii(new vu(this,Ii(e)))}setNodeType(e){const t=ra(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Su(e,t,r));class wu extends Ys{static get type(){return"ToneMappingNode"}constructor(e,t=Ru,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ln(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Au=(e,t,r)=>Ii(new wu(e,Ii(t),Ii(r))),Ru=Eu("toneMappingExposure","float");ui("toneMapping",(e,t,r)=>Au(t,r,e));class Cu extends ri{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=gu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const Mu=(e,t=null,r=0,s=0)=>Ii(new Cu(e,t,r,s)),Pu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setUsage(y),Bu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setInstanced(!0),Lu=(e,t=null,r=0,s=0)=>Pu(e,t,r,s).setInstanced(!0);ui("toAttribute",e=>Mu(e.value));class Fu extends js{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const Iu=(e,t=[64])=>{(0===t.length||t.length>3)&&console.error("THREE.TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;eIu(e,r).setCount(t);ui("compute",Du),ui("computeKernel",Iu);class Vu extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Uu=(e,t)=>Ii(new Vu(Ii(e),t));ui("cache",Uu);class Ou extends js{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ku=Oi(Ou).setParameterLength(2);ui("bypass",ku);class Gu extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=Yi(0),i=Yi(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const zu=Oi(Gu,null,null,{doClamp:!1}).setParameterLength(3,5),Hu=Oi(Gu).setParameterLength(3,5);ui("remap",zu),ui("remapClamp",Hu);class $u extends js{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Wu=Oi($u).setParameterLength(1,2),qu=e=>(e?eu(e,Wu("discard")):Wu("discard")).toStack();ui("discard",qu);class ju extends Ys{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||b;return r!==p&&(t=t.toneMapping(r)),s!==b&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Xu=(e,t=null,r=null)=>Ii(new ju(Ii(e),t,r));ui("renderOutput",Xu);class Ku extends Ys{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Yu=(e,t=null)=>Ii(new Ku(Ii(e),t)).toStack();ui("debug",Yu);class Qu extends js{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return gu(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Zu=(e,t=null)=>Ii(new Qu(e,t)),Ju=(e=0)=>Zu("uv"+(e>0?e:""),"vec2");class el extends js{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const tl=Oi(el).setParameterLength(1,2);class rl extends ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const sl=Oi(rl).setParameterLength(1),il=new x;class nl extends ta{static get type(){return"TextureNode"}constructor(e=il,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Us.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===T?"uvec4":this.value.type===_?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Ju(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ra(this.value.matrix)),this._matrixUniform.mul(nn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Qi(tl(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${b}`,this),n.snippet=b,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=_u(Wu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Ii(e).mul(sl(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===v||r.magFilter===v)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Ii(t)}level(e){const t=this.clone();return t.levelNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}size(e){return tl(this,e)}bias(e){const t=this.clone();return t.biasNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}compare(e){const t=this.clone();return t.compareNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ii(e),Ii(t)],r.referenceNode=this.getSelf(),Ii(r)}depth(e){const t=this.clone();return t.depthNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const al=Oi(nl).setParameterLength(1,4).setName("texture"),ol=(e=il,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=al(e,t,r,s),i},ul=(...e)=>ol(...e).setSampler(!1);class ll extends ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const dl=(e,t,r)=>Ii(new ll(e,t,r));class cl extends Xs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class hl extends ll{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rIi(new hl(e,t));const gl=Oi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),ml=ra(0,"uint").setName("u_cameraIndex").setGroup(Qn("cameraIndex")).toVarying("v_cameraIndex"),fl=ra("float").setName("cameraNear").setGroup(Jn).onRenderUpdate(({camera:e})=>e.near),yl=ra("float").setName("cameraFar").setGroup(Jn).onRenderUpdate(({camera:e})=>e.far),bl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=pl(r).setGroup(Jn).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraProjectionMatrix")}else t=ra("mat4").setName("cameraProjectionMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),xl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=pl(r).setGroup(Jn).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraProjectionMatrixInverse")}else t=ra("mat4").setName("cameraProjectionMatrixInverse").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),Tl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=pl(r).setGroup(Jn).setName("cameraViewMatrices").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraViewMatrix")}else t=ra("mat4").setName("cameraViewMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),_l=ra("mat4").setName("cameraWorldMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorld),vl=ra("mat3").setName("cameraNormalMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.normalMatrix),Nl=ra(new r).setName("cameraPosition").setGroup(Jn).onRenderUpdate(({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)),Sl=new N;class El extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this.uniformNode=new ta(null)}getNodeType(){const e=this.scope;return e===El.WORLD_MATRIX?"mat4":e===El.POSITION||e===El.VIEW_POSITION||e===El.DIRECTION||e===El.SCALE?"vec3":e===El.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===El.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===El.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===El.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===El.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===El.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===El.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Sl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Sl.radius}}generate(e){const t=this.scope;return t===El.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===El.POSITION||t===El.VIEW_POSITION||t===El.DIRECTION||t===El.SCALE?this.uniformNode.nodeType="vec3":t===El.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}El.WORLD_MATRIX="worldMatrix",El.POSITION="position",El.SCALE="scale",El.VIEW_POSITION="viewPosition",El.DIRECTION="direction",El.RADIUS="radius";const wl=Oi(El,El.DIRECTION).setParameterLength(1),Al=Oi(El,El.WORLD_MATRIX).setParameterLength(1),Rl=Oi(El,El.POSITION).setParameterLength(1),Cl=Oi(El,El.SCALE).setParameterLength(1),Ml=Oi(El,El.VIEW_POSITION).setParameterLength(1),Pl=Oi(El,El.RADIUS).setParameterLength(1);class Bl extends El{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Ll=ki(Bl,Bl.DIRECTION),Fl=ki(Bl,Bl.WORLD_MATRIX),Il=ki(Bl,Bl.POSITION),Dl=ki(Bl,Bl.SCALE),Vl=ki(Bl,Bl.VIEW_POSITION),Ul=ki(Bl,Bl.RADIUS),Ol=ra(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),kl=ra(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Gl=$i(e=>e.renderer.overrideNodes.modelViewMatrix||zl).once()().toVar("modelViewMatrix"),zl=Tl.mul(Fl),Hl=$i(e=>(e.context.isHighPrecisionModelViewMatrix=!0,ra("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),$l=$i(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ra("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Wl=Zu("position","vec3"),ql=Wl.toVarying("positionLocal"),jl=Wl.toVarying("positionPrevious"),Xl=$i(e=>Fl.mul(ql).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Kl=$i(()=>ql.transformDirection(Fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Yl=$i(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Ql=Yl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Zl extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===S?"false":e.getFrontFacing()}}const Jl=ki(Zl),ed=Yi(Jl).mul(2).sub(1),td=$i(([e],{material:t})=>{const r=t.side;return r===S?e=e.mul(-1):r===E&&(e=e.mul(ed)),e}),rd=Zu("normal","vec3"),sd=$i(e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),nn(0,1,0)):rd,"vec3").once()().toVar("normalLocal"),id=Yl.dFdx().cross(Yl.dFdy()).normalize().toVar("normalFlat"),nd=$i(e=>{let t;return t=!0===e.material.flatShading?id:cd(sd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),ad=$i(e=>{let t=nd.transformDirection(Tl);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),od=$i(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=nd,!0!==t.flatShading&&(s=td(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),ud=od.transformDirection(Tl).toVar("normalWorld"),ld=$i(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?od:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),dd=$i(([e,t=Fl])=>{const r=gn(t),s=e.div(nn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),cd=$i(([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ol.mul(e);return Tl.transformDirection(s)}),hd=$i(()=>(console.warn('THREE.TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),od)).once(["NORMAL","VERTEX"])(),pd=$i(()=>(console.warn('THREE.TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),ud)).once(["NORMAL","VERTEX"])(),gd=$i(()=>(console.warn('THREE.TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),ld)).once(["NORMAL","VERTEX"])(),md=new w,fd=new a,yd=ra(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),bd=ra(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),xd=ra(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(md.copy(r),fd.makeRotationFromEuler(md)):fd.identity(),fd}),Td=Ql.negate().reflect(od),_d=Ql.negate().refract(od,yd),vd=Td.transformDirection(Tl).toVar("reflectVector"),Nd=_d.transformDirection(Tl).toVar("reflectVector"),Sd=new A;class Ed extends nl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===R?vd:e.mapping===C?Nd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),nn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=nn(t.x.negate(),t.yz)),xd.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const wd=Oi(Ed).setParameterLength(1,4).setName("cubeTexture"),Ad=(e=Sd,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=wd(e,t,r,s),i};class Rd extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Cd extends js{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Us.OBJECT}element(e){return Ii(new Rd(this,Ii(e)))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?dl(null,e,this.count):Array.isArray(this.getValueFromReference())?pl(null,e):"texture"===e?ol(null):"cubeTexture"===e?Ad(null):ra(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Cd(e,t,r)),Pd=(e,t,r,s)=>Ii(new Cd(e,t,s,r));class Bd extends Cd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Ld=(e,t,r=null)=>Ii(new Bd(e,t,r)),Fd=Ju(),Id=Yl.dFdx(),Dd=Yl.dFdy(),Vd=Fd.dFdx(),Ud=Fd.dFdy(),Od=od,kd=Dd.cross(Od),Gd=Od.cross(Id),zd=kd.mul(Vd.x).add(Gd.mul(Ud.x)),Hd=kd.mul(Vd.y).add(Gd.mul(Ud.y)),$d=zd.dot(zd).max(Hd.dot(Hd)),Wd=$d.equal(0).select(0,$d.inverseSqrt()),qd=zd.mul(Wd).toVar("tangentViewFrame"),jd=Hd.mul(Wd).toVar("bitangentViewFrame"),Xd=$i(e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Zu("tangent","vec4")))(),Kd=Xd.xyz.toVar("tangentLocal"),Yd=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Gl.mul(ln(Kd,0)).xyz.toVarying("v_tangentView").normalize():qd,!0!==r.flatShading&&(s=td(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Qd=Yd.transformDirection(Tl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Zd=$i(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Xd.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Jd=Zd(rd.cross(Xd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),ec=Zd(sd.cross(Kd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),tc=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Zd(od.cross(Yd),"v_bitangentView").normalize():jd,!0!==r.flatShading&&(s=td(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),rc=Zd(ud.cross(Qd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),sc=gn(Yd,tc,od).toVar("TBNViewMatrix"),ic=Ql.mul(sc),nc=$i(()=>{let e=In.cross(Ql);return e=e.cross(In).normalize(),e=ko(e,od,Ln.mul(Nn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()();class ac extends Ys{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=M}setup({material:e}){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);if(null!==r){let t=r;!0===e.flatShading&&(t=td(t)),s=nn(s.xy.mul(t),s.z)}let i=null;return t===P?i=cd(s):t===M?i=sc.mul(s).normalize():(console.error(`THREE.NodeMaterial: Unsupported normal map type: ${t}`),i=od),i}}const oc=Oi(ac).setParameterLength(1,2),uc=$i(({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Ju()),forceUVContext:!0}),s=Yi(r(e=>e));return en(Yi(r(e=>e.add(e.dFdx()))).sub(s),Yi(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),lc=$i(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(ed),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class dc extends Ys{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=uc({textureNode:this.textureNode,bumpScale:e});return lc({surf_pos:Yl,surf_norm:od,dHdxy:t})}}const cc=Oi(dc).setParameterLength(1,2),hc=new Map;class pc extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=hc.get(e);return void 0===r&&(r=Ld(e,t),hc.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===pc.COLOR){const e=void 0!==t.color?this.getColor(r):nn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===pc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===pc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Yi(1);else if(r===pc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===pc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===pc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===pc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===pc.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===pc.NORMAL)t.normalMap?(s=oc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?cc(this.getTexture("bump").r,this.getFloat("bumpScale")):od;else if(r===pc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===pc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===pc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?oc(this.getTexture(r),this.getCache(r+"Scale","vec2")):od;else if(r===pc.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===pc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===pc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=pn(Qc.x,Qc.y,Qc.y.negate(),Qc.x).mul(e.rg.mul(2).sub(en(1)).normalize().mul(e.b))}else s=Qc;else if(r===pc.IRIDESCENCE_THICKNESS){const e=Md("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Md("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===pc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===pc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===pc.IOR)s=this.getFloat(r);else if(r===pc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===pc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===pc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):Yi(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}pc.ALPHA_TEST="alphaTest",pc.COLOR="color",pc.OPACITY="opacity",pc.SHININESS="shininess",pc.SPECULAR="specular",pc.SPECULAR_STRENGTH="specularStrength",pc.SPECULAR_INTENSITY="specularIntensity",pc.SPECULAR_COLOR="specularColor",pc.REFLECTIVITY="reflectivity",pc.ROUGHNESS="roughness",pc.METALNESS="metalness",pc.NORMAL="normal",pc.CLEARCOAT="clearcoat",pc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",pc.CLEARCOAT_NORMAL="clearcoatNormal",pc.EMISSIVE="emissive",pc.ROTATION="rotation",pc.SHEEN="sheen",pc.SHEEN_ROUGHNESS="sheenRoughness",pc.ANISOTROPY="anisotropy",pc.IRIDESCENCE="iridescence",pc.IRIDESCENCE_IOR="iridescenceIOR",pc.IRIDESCENCE_THICKNESS="iridescenceThickness",pc.IOR="ior",pc.TRANSMISSION="transmission",pc.THICKNESS="thickness",pc.ATTENUATION_DISTANCE="attenuationDistance",pc.ATTENUATION_COLOR="attenuationColor",pc.LINE_SCALE="scale",pc.LINE_DASH_SIZE="dashSize",pc.LINE_GAP_SIZE="gapSize",pc.LINE_WIDTH="linewidth",pc.LINE_DASH_OFFSET="dashOffset",pc.POINT_SIZE="size",pc.DISPERSION="dispersion",pc.LIGHT_MAP="light",pc.AO="ao";const gc=ki(pc,pc.ALPHA_TEST),mc=ki(pc,pc.COLOR),fc=ki(pc,pc.SHININESS),yc=ki(pc,pc.EMISSIVE),bc=ki(pc,pc.OPACITY),xc=ki(pc,pc.SPECULAR),Tc=ki(pc,pc.SPECULAR_INTENSITY),_c=ki(pc,pc.SPECULAR_COLOR),vc=ki(pc,pc.SPECULAR_STRENGTH),Nc=ki(pc,pc.REFLECTIVITY),Sc=ki(pc,pc.ROUGHNESS),Ec=ki(pc,pc.METALNESS),wc=ki(pc,pc.NORMAL),Ac=ki(pc,pc.CLEARCOAT),Rc=ki(pc,pc.CLEARCOAT_ROUGHNESS),Cc=ki(pc,pc.CLEARCOAT_NORMAL),Mc=ki(pc,pc.ROTATION),Pc=ki(pc,pc.SHEEN),Bc=ki(pc,pc.SHEEN_ROUGHNESS),Lc=ki(pc,pc.ANISOTROPY),Fc=ki(pc,pc.IRIDESCENCE),Ic=ki(pc,pc.IRIDESCENCE_IOR),Dc=ki(pc,pc.IRIDESCENCE_THICKNESS),Vc=ki(pc,pc.TRANSMISSION),Uc=ki(pc,pc.THICKNESS),Oc=ki(pc,pc.IOR),kc=ki(pc,pc.ATTENUATION_DISTANCE),Gc=ki(pc,pc.ATTENUATION_COLOR),zc=ki(pc,pc.LINE_SCALE),Hc=ki(pc,pc.LINE_DASH_SIZE),$c=ki(pc,pc.LINE_GAP_SIZE),Wc=ki(pc,pc.LINE_WIDTH),qc=ki(pc,pc.LINE_DASH_OFFSET),jc=ki(pc,pc.POINT_SIZE),Xc=ki(pc,pc.DISPERSION),Kc=ki(pc,pc.LIGHT_MAP),Yc=ki(pc,pc.AO),Qc=ra(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Zc=$i(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Jc extends js{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Jc.VERTEX)s=e.getVertexIndex();else if(r===Jc.INSTANCE)s=e.getInstanceIndex();else if(r===Jc.DRAW)s=e.getDrawIndex();else if(r===Jc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Jc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Jc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=gu(this).build(e,t)}return i}}Jc.VERTEX="vertex",Jc.INSTANCE="instance",Jc.SUBGROUP="subgroup",Jc.INVOCATION_LOCAL="invocationLocal",Jc.INVOCATION_SUBGROUP="invocationSubgroup",Jc.DRAW="draw";const eh=ki(Jc,Jc.VERTEX),th=ki(Jc,Jc.INSTANCE),rh=ki(Jc,Jc.SUBGROUP),sh=ki(Jc,Jc.INVOCATION_SUBGROUP),ih=ki(Jc,Jc.INVOCATION_LOCAL),nh=ki(Jc,Jc.DRAW);class ah extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=dl(r.array,"mat4",Math.max(t,1)).element(th);else{const e=new B(r.array,16,1);this.buffer=e;const t=r.usage===y?Lu:Bu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=mn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new L(s.array,3),t=s.usage===y?Lu:Bu;this.bufferColor=e,n=nn(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(ql).xyz;if(ql.assign(a),e.hasGeometryAttribute("normal")){const e=dd(sd,i);sd.assign(e)}null!==this.instanceColorNode&&Tn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const oh=Oi(ah).setParameterLength(2,3);class uh extends ah{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const lh=Oi(uh).setParameterLength(1);class dh extends js{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=th:this.batchingIdNode=nh);const t=$i(([e])=>{const t=Qi(tl(ul(this.batchMesh._indirectTexture),0).x),r=Qi(e).mod(t),s=Qi(e).div(t);return ul(this.batchMesh._indirectTexture,tn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Qi(tl(ul(s),0).x),n=Yi(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=mn(ul(s,tn(a,o)),ul(s,tn(a.add(1),o)),ul(s,tn(a.add(2),o)),ul(s,tn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=$i(([e])=>{const t=Qi(tl(ul(l),0).x),r=e,s=r.mod(t),i=r.div(t);return ul(l,tn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Tn("vec3","vBatchColor").assign(t)}const d=gn(u);ql.assign(u.mul(ql));const c=sd.div(nn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sd.assign(h),e.hasGeometryAttribute("tangent")&&Kd.mulAssign(d)}}const ch=Oi(dh).setParameterLength(1);class hh extends Xs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const ph=Oi(hh).setParameterLength(2);class gh extends ll{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=ws(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return ph(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Mu(this.value),this._varying=gu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const mh=(e,t=null,r=0)=>Ii(new gh(e,t,r)),fh=new WeakMap;class yh extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Zu("skinIndex","uvec4"),this.skinWeightNode=Zu("skinWeight","vec4"),this.bindMatrixNode=Md("bindMatrix","mat4"),this.bindMatrixInverseNode=Md("bindMatrixInverse","mat4"),this.boneMatricesNode=Pd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=ql,this.toPositionNode=ql,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=ca(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sd){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Pd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,jl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ls(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&jl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sd.assign(t),e.hasGeometryAttribute("tangent")&&Kd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;fh.get(t)!==e.frameId&&(fh.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const bh=e=>Ii(new yh(e));class xh extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tIi(new xh(Ui(e,"int"))).toStack(),_h=()=>Wu("break").toStack(),vh=new WeakMap,Nh=new s,Sh=$i(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Qi(eh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return ul(e,tn(u,o)).depth(i).xyz.mul(t)});class Eh extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ra(1),this.updateType=Us.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=vh.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new F(m,h,p,a);f.type=I,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Yi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(ul(this.mesh.morphTexture,tn(Qi(e).add(1),Qi(th))).r):t.assign(Md("morphTargetInfluences","float").element(e).toVar()),ji(t.notEqual(0),()=>{!0===s&&ql.addAssign(Sh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(0)})),!0===i&&sd.addAssign(Sh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const wh=Oi(Eh).setParameterLength(1);class Ah extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Rh extends Ah{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Ch extends tu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:nn().toVar("directDiffuse"),directSpecular:nn().toVar("directSpecular"),indirectDiffuse:nn().toVar("indirectDiffuse"),indirectSpecular:nn().toVar("indirectSpecular")};return{radiance:nn().toVar("radiance"),irradiance:nn().toVar("irradiance"),iblIrradiance:nn().toVar("iblIrradiance"),ambientOcclusion:Yi(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Mh=Oi(Ch);class Ph extends Ah{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Bh,Lh;class Fh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Fh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==Fh.SIZE&&this.scope!==Fh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Fh.VIEWPORT?null!==t?Lh.copy(t.viewport):(e.getViewport(Lh),Lh.multiplyScalar(e.getPixelRatio())):null!==t?(Bh.width=t.width,Bh.height=t.height):e.getDrawingBufferSize(Bh)}setup(){const e=this.scope;let r=null;return r=e===Fh.SIZE?ra(Bh||(Bh=new t)):e===Fh.VIEWPORT?ra(Lh||(Lh=new s)):en(Vh.div(Dh)),r}generate(e){if(this.scope===Fh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Dh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Fh.COORDINATE="coordinate",Fh.VIEWPORT="viewport",Fh.SIZE="size",Fh.UV="uv";const Ih=ki(Fh,Fh.UV),Dh=ki(Fh,Fh.SIZE),Vh=ki(Fh,Fh.COORDINATE),Uh=ki(Fh,Fh.VIEWPORT),Oh=Uh.zw,kh=Vh.sub(Uh.xy),Gh=kh.div(Oh),zh=$i(()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Dh),"vec2").once()(),Hh=new t;class $h extends nl{static get type(){return"ViewportTextureNode"}constructor(e=Ih,t=null,r=null){let s=null;null===r?(s=new D,s.minFilter=V,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Us.RENDER,this._textures=new WeakMap}getFrameBufferTexture(e=null){const t=this.referenceNode?this.referenceNode.defaultFramebuffer:this.defaultFramebuffer;if(null===e)return t;if(!1===this._textures.has(e)){const r=t.clone();this._textures.set(e,r)}return this._textures.get(e)}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Hh):Hh.set(r.width,r.height);const s=this.getFrameBufferTexture(r);s.image.width===Hh.width&&s.image.height===Hh.height||(s.image.width=Hh.width,s.image.height=Hh.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i,this.value=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Wh=Oi($h).setParameterLength(0,3),qh=Oi($h,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let jh=null;class Xh extends $h{static get type(){return"ViewportDepthTextureNode"}constructor(e=Ih,t=null){null===jh&&(jh=new U),super(e,t,jh)}}const Kh=Oi(Xh).setParameterLength(0,2);class Yh extends js{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Yh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Yh.DEPTH_BASE)null!==r&&(s=tp().assign(r));else if(t===Yh.DEPTH)s=e.isPerspectiveCamera?Zh(Yl.z,fl,yl):Qh(Yl.z,fl,yl);else if(t===Yh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Jh(r,fl,yl);s=Qh(e,fl,yl)}else s=r;else s=Qh(Yl.z,fl,yl);return s}}Yh.DEPTH_BASE="depthBase",Yh.DEPTH="depth",Yh.LINEAR_DEPTH="linearDepth";const Qh=(e,t,r)=>e.add(t).div(t.sub(r)),Zh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Jh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),ep=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ka(e.negate().div(t)),i=Ka(r.div(t));return s.div(i)},tp=Oi(Yh,Yh.DEPTH_BASE),rp=ki(Yh,Yh.DEPTH),sp=Oi(Yh,Yh.LINEAR_DEPTH).setParameterLength(0,1),ip=sp(Kh());rp.assign=e=>tp(e);class np extends js{static get type(){return"ClippingNode"}constructor(e=np.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===np.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===np.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return $i(()=>{const r=Yi().toVar("distanceToPlane"),s=Yi().toVar("distanceToGradient"),i=Yi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=pl(t);Th(n,({i:t})=>{const n=e.element(t);r.assign(Yl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign($o(s.negate(),s,r))})}const a=e.length;if(a>0){const t=pl(e),n=Yi(1).toVar("intersectionClipOpacity");Th(a,({i:e})=>{const i=t.element(e);r.assign(Yl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign($o(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}_n.a.mulAssign(i),_n.a.equal(0).discard()})()}setupDefault(e,t){return $i(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=pl(t);Th(r,({i:t})=>{const r=e.element(t);Yl.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=pl(e),r=Ji(!0).toVar("clipped");Th(s,({i:e})=>{const s=t.element(e);r.assign(Yl.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),$i(()=>{const s=pl(e),i=gl(t.getClipDistance());Th(r,({i:e})=>{const t=s.element(e),r=Yl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}np.ALPHA_TO_COVERAGE="alphaToCoverage",np.DEFAULT="default",np.HARDWARE="hardware";const ap=$i(([e])=>to(pa(1e4,ro(pa(17,e.x).add(pa(.1,e.y)))).mul(ca(.1,uo(ro(pa(13,e.y).add(e.x))))))),op=$i(([e])=>ap(en(ap(e.xy),e.z))),up=$i(([e])=>{const t=wo(co(go(e.xyz)),co(mo(e.xyz))),r=Yi(1).div(Yi(.05).mul(t)).toVar("pixScale"),s=en(ja(Za(Ka(r))),ja(Ja(Ka(r)))),i=en(op(Za(s.x.mul(e.xyz))),op(Za(s.y.mul(e.xyz)))),n=to(Ka(r)),a=ca(pa(n.oneMinus(),i.x),pa(n,i.y)),o=Eo(n,n.oneMinus()),u=nn(a.mul(a).div(pa(2,o).mul(ha(1,o))),a.sub(pa(.5,o)).div(ha(1,o)),ha(1,ha(1,a).mul(ha(1,a)).div(pa(2,o).mul(ha(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Go(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class lp extends Qu{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const dp=(e=0)=>Ii(new lp(e)),cp=$i(([e,t])=>Eo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hp=$i(([e,t])=>Eo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pp=$i(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),gp=$i(([e,t])=>ko(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ao(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),mp=$i(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ln(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),fp=$i(([e])=>ln(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),yp=$i(([e])=>(ji(e.a.equal(0),()=>ln(0)),ln(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class bp extends O{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>hu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=hu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.add(a);const i=ln(s,_n.a).max(0);n=this.setupOutput(e,i),On.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&On.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ln(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Ii(new np(np.ALPHA_TO_COVERAGE)):e.stack.add(Ii(new np))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Ii(new np(np.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?ep(Yl.z,fl,yl):Qh(Yl.z,fl,yl))}null!==s&&rp.assign(s).toStack()}setupPositionView(){return Gl.mul(ql).xyz}setupModelViewProjection(){return bl.mul(Yl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Zc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&wh(t).toStack(),!0===t.isSkinnedMesh&&bh(t).toStack(),this.displacementMap){const e=Ld("displacementMap","texture"),t=Ld("displacementScale","float"),r=Ld("displacementBias","float");ql.addAssign(sd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ch(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&lh(t).toStack(),null!==this.positionNode&&ql.assign(hu(this.positionNode,"POSITION","vec3")),ql}setupDiffuseColor({object:e,geometry:t}){null!==this.maskNode&&Ji(this.maskNode).not().discard();let r=this.colorNode?ln(this.colorNode):mc;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(dp())),e.instanceColor){r=Tn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Tn("vec3","vBatchColor").mul(r)}_n.assign(r);const s=this.opacityNode?Yi(this.opacityNode):bc;_n.a.assign(_n.a.mul(s));let i=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(i=null!==this.alphaTestNode?Yi(this.alphaTestNode):gc,_n.a.lessThanEqual(i).discard()),!0===this.alphaHash&&_n.a.lessThan(up(ql)).discard();!1===this.transparent&&this.blending===k&&!1===this.alphaToCoverage?_n.a.assign(1):null===i&&_n.a.lessThanEqual(0).discard()}setupVariants(){}setupOutgoingLight(){return!0===this.lights?nn(0):_n.rgb}setupNormal(){return this.normalNode?nn(this.normalNode):wc}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Ld("envMap","cubeTexture"):Ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ph(Kc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Yc;t.push(new Rh(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Mh(n,t,r,s)}else null!==r&&(a=nn(null!==s?ko(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(vn.assign(nn(i||yc)),a=a.add(vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(On.assign(t),t=ln(r.toVar())),t}setupPremultipliedAlpha(e,t){return fp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=O.prototype.toJSON.call(this,e),s=Ns(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const xp=new G;class Tp extends bp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(xp),this.setValues(e)}}const _p=new z;class vp extends bp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(_p),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Yi(this.offsetNode):qc,t=this.dashScaleNode?Yi(this.dashScaleNode):zc,r=this.dashSizeNode?Yi(this.dashSizeNode):Hc,s=this.gapSizeNode?Yi(this.gapSizeNode):$c;kn.assign(r),Gn.assign(s);const i=gu(Zu("lineDistance").mul(t));(e?i.add(e):i).mod(kn.add(Gn)).greaterThan(kn).discard()}}let Np=null;class Sp extends $h{static get type(){return"ViewportSharedTextureNode"}constructor(e=Ih,t=null){null===Np&&(Np=new D),super(e,t,Np)}updateReference(){return this}}const Ep=Oi(Sp).setParameterLength(0,2),wp=new z;class Ap extends bp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(wp),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=H,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=$i(({start:e,end:t})=>{const r=bl.element(2).element(2),s=bl.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ln(ko(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=$i(()=>{const e=Zu("instanceStart"),t=Zu("instanceEnd"),r=ln(Gl.mul(ln(e,1))).toVar("start"),s=ln(Gl.mul(ln(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Yi(this.dashScaleNode):zc,t=this.offsetNode?Yi(this.offsetNode):qc,r=Zu("instanceDistanceStart"),s=Zu("instanceDistanceEnd");let i=Wl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Tn("float","lineDistance").assign(i)}n&&(Tn("vec3","worldStart").assign(r.xyz),Tn("vec3","worldEnd").assign(s.xyz));const o=Uh.z.div(Uh.w),u=bl.element(2).element(3).equal(-1);ji(u,()=>{ji(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=bl.mul(r),d=bl.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=ln().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ko(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Tn("vec4","worldPos");o.assign(Wl.y.lessThan(.5).select(r,s));const u=Wc.mul(.5);o.addAssign(ln(Wl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(ln(Wl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(ln(a.mul(u),0)),ji(Wl.y.greaterThan(1).or(Wl.y.lessThan(0)),()=>{o.subAssign(ln(a.mul(2).mul(u),0))})),g.assign(bl.mul(o));const l=nn().toVar();l.assign(Wl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=en(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Wl.x.lessThan(0).select(e.negate(),e)),ji(Wl.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Wl.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Wc)),e.assign(e.div(Uh.w)),g.assign(Wl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ln(e,0,0)))}return g})();const o=$i(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return en(h,p)});if(this.colorNode=$i(()=>{const e=Ju();if(i){const t=this.dashSizeNode?Yi(this.dashSizeNode):Hc,r=this.gapSizeNode?Yi(this.gapSizeNode):$c;kn.assign(t),Gn.assign(r);const s=Tn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(kn.add(Gn)).greaterThan(kn).discard()}const a=Yi(1).toVar("alpha");if(n){const e=Tn("vec3","worldStart"),s=Tn("vec3","worldEnd"),n=Tn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:nn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Wc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign($o(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=Yi(s.fwidth()).toVar("dlen");ji(e.y.abs().greaterThan(1),()=>{a.assign($o(i.oneMinus(),i.add(1),s).oneMinus())})}else ji(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Zu("instanceColorStart"),t=Zu("instanceColorEnd");u=Wl.y.lessThan(.5).select(e,t).mul(mc)}else u=mc;return ln(u,a)})(),this.transparent){const e=this.opacityNode?Yi(this.opacityNode):bc;this.outputNode=ln(this.colorNode.rgb.mul(e).add(Ep().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Rp=e=>Ii(e).mul(.5).add(.5),Cp=new $;class Mp extends bp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Cp),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Yi(this.opacityNode):bc;_n.assign(_u(ln(Rp(od),e),W))}}const Pp=$i(([e=Kl])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return en(t,r)});class Bp extends q{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new j(5,5,5),n=Pp(Kl),a=new bp;a.colorNode=ol(t,n,0),a.side=S,a.blending=H;const o=new X(i,a),u=new K;u.add(o),t.minFilter===V&&(t.minFilter=Y);const l=new Q(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Lp=new WeakMap;class Fp extends Ys{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Ad(null);const t=new A;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Z||r===J){if(Lp.has(e)){const t=Lp.get(e);Dp(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Bp(r.height);s.fromEquirectangularTexture(t,e),Dp(s.texture,e.mapping),this._cubeTexture=s.texture,Lp.set(e,s.texture),e.addEventListener("dispose",Ip)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Ip(e){const t=e.target;t.removeEventListener("dispose",Ip);const r=Lp.get(t);void 0!==r&&(Lp.delete(t),r.dispose())}function Dp(e,t){t===Z?e.mapping=R:t===J&&(e.mapping=C)}const Vp=Oi(Fp).setParameterLength(1);class Up extends Ah{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Vp(this.envNode)}}class Op extends Ah{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Yi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class kp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Gp extends kp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(ln(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(ln(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(_n.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case re:s.rgb.assign(ko(s.rgb,s.rgb.mul(i.rgb),vc.mul(Nc)));break;case te:s.rgb.assign(ko(s.rgb,i.rgb,vc.mul(Nc)));break;case ee:s.rgb.addAssign(i.rgb.mul(vc.mul(Nc)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const zp=new se;class Hp extends bp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(zp),this.setValues(e)}setupNormal(){return td(nd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Op(Kc)),t}setupOutgoingLight(){return _n.rgb}setupLightingModel(){return new Gp}}const $p=$i(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Wp=$i(e=>e.diffuseColor.mul(1/Math.PI)),qp=$i(({dotNH:e})=>Un.mul(Yi(.5)).add(1).mul(Yi(1/Math.PI)).mul(e.pow(Un))),jp=$i(({lightDirection:e})=>{const t=e.add(Ql).normalize(),r=od.dot(t).clamp(),s=Ql.dot(t).clamp(),i=$p({f0:Dn,f90:1,dotVH:s}),n=Yi(.25),a=qp({dotNH:r});return i.mul(n).mul(a)});class Xp extends Gp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=od.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Wp({diffuseColor:_n.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(jp({lightDirection:e})).mul(vc))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Wp({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Kp=new ie;class Yp extends bp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Kp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightingModel(){return new Xp(!1)}}const Qp=new ne;class Zp extends bp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Qp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightingModel(){return new Xp}setupVariants(){const e=(this.shininessNode?Yi(this.shininessNode):fc).max(1e-4);Un.assign(e);const t=this.specularNode||xc;Dn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Jp=$i(e=>{if(!1===e.geometry.hasAttribute("normal"))return Yi(0);const t=nd.dFdx().abs().max(nd.dFdy().abs());return t.x.max(t.y).max(t.z)}),eg=$i(e=>{const{roughness:t}=e,r=Jp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),tg=$i(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return ga(.5,i.add(n).max(Ua))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),rg=$i(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(nn(e.mul(r),t.mul(s),a).length()),l=a.mul(nn(e.mul(i),t.mul(n),o).length());return ga(.5,u.add(l)).saturate()}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),sg=$i(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),ig=Yi(1/Math.PI),ng=$i(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=nn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return ig.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),ag=$i(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=od,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Ql).normalize(),d=n.dot(e).clamp(),c=n.dot(Ql).clamp(),h=n.dot(l).clamp(),p=Ql.dot(l).clamp();let g,m,f=$p({f0:t,f90:r,dotVH:p});if(Bi(a)&&(f=Cn.mix(f,i)),Bi(o)){const t=Fn.dot(e),r=Fn.dot(Ql),s=Fn.dot(l),i=In.dot(e),n=In.dot(Ql),a=In.dot(l);g=rg({alphaT:Bn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=ng({alphaT:Bn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=tg({alpha:u,dotNL:d,dotNV:c}),m=sg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),og=$i(({roughness:e,dotNV:t})=>{const r=ln(-1,-.0275,-.572,.022),s=ln(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return en(-1.04,1.04).mul(n).add(i.zw)}).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),ug=$i(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),lg=$i(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(nn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),dg=$i(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Yi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Yi(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),cg=$i(({dotNV:e,dotNL:t})=>Yi(1).div(Yi(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),hg=$i(({lightDirection:e})=>{const t=e.add(Ql).normalize(),r=od.dot(e).clamp(),s=od.dot(Ql).clamp(),i=od.dot(t).clamp(),n=dg({roughness:Rn,dotNH:i}),a=cg({dotNV:s,dotNL:r});return An.mul(n).mul(a)}),pg=$i(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=en(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),gg=$i(({f:e})=>{const t=e.length();return wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),mg=$i(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,wo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),fg=$i(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=nn().toVar();return ji(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(gn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=nn(0).toVar();f.addAssign(mg({v1:h,v2:p})),f.addAssign(mg({v1:p,v2:g})),f.addAssign(mg({v1:g,v2:m})),f.addAssign(mg({v1:m,v2:h})),c.assign(nn(gg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),yg=$i(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=nn().toVar();return ji(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=nn(0).toVar();d.addAssign(mg({v1:n,v2:a})),d.addAssign(mg({v1:a,v2:o})),d.addAssign(mg({v1:o,v2:l})),d.addAssign(mg({v1:l,v2:n})),u.assign(nn(gg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),bg=1/6,xg=e=>pa(bg,pa(e,pa(e,e.negate().add(3)).sub(3)).add(1)),Tg=e=>pa(bg,pa(e,pa(e,pa(3,e).sub(6))).add(4)),_g=e=>pa(bg,pa(e,pa(e,pa(-3,e).add(3)).add(3)).add(1)),vg=e=>pa(bg,Lo(e,3)),Ng=e=>xg(e).add(Tg(e)),Sg=e=>_g(e).add(vg(e)),Eg=e=>ca(-1,Tg(e).div(xg(e).add(Tg(e)))),wg=e=>ca(1,vg(e).div(_g(e).add(vg(e)))),Ag=(e,t,r)=>{const s=e.uvNode,i=pa(s,t.zw).add(.5),n=Za(i),a=to(i),o=Ng(a.x),u=Sg(a.x),l=Eg(a.x),d=wg(a.x),c=Eg(a.y),h=wg(a.y),p=en(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=en(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=en(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=en(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Ng(a.y).mul(ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Sg(a.y).mul(ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Rg=$i(([e,t])=>{const r=en(e.size(Qi(t))),s=en(e.size(Qi(t.add(1)))),i=ga(1,r),n=ga(1,s),a=Ag(e,ln(i,r),Za(t)),o=Ag(e,ln(n,s),Ja(t));return to(t).mix(a,o)}),Cg=$i(([e,t])=>{const r=t.mul(sl(e));return Rg(e,r)}),Mg=$i(([e,t,r,s,i])=>{const n=nn(Ho(t.negate(),eo(e),ga(1,s))),a=nn(co(i[0].xyz),co(i[1].xyz),co(i[2].xyz));return eo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),Pg=$i(([e,t])=>e.mul(Go(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Bg=qh(),Lg=qh(),Fg=$i(([e,t,r],{material:s})=>{const i=(s.side===S?Bg:Lg).sample(e),n=Ka(Dh.x).mul(Pg(t,r));return Rg(i,n)}),Ig=$i(([e,t,r])=>(ji(r.notEqual(0),()=>{const s=Xa(t).negate().div(r);return qa(s.negate().mul(e))}),nn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Dg=$i(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ln().toVar(),f=nn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=nn(d.sub(i),d,d.add(i));Th({start:0,end:3},({i:i})=>{const d=n.element(i),g=Mg(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(ln(y,1))),x=en(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(en(x.x,x.y.oneMinus()));const T=Fg(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ig(co(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Mg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(ln(n,1))),y=en(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(en(y.x,y.y.oneMinus())),m=Fg(y,r,d),f=s.mul(Ig(co(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=nn(ug({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ln(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Vg=gn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Ug=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Og=$i(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ko(e,t,$o(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ji(a.lessThan(0),()=>nn(1));const o=a.sqrt(),u=Ug(n,e),l=$p({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Yi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return nn(1).add(t).div(nn(1).sub(t))})(i.clamp(0,.9999)),g=Ug(p,n.toVec3()),m=$p({f0:g,f90:1,dotVH:o}),f=nn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=nn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(nn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Th({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=nn(54856e-17,44201e-17,52481e-17),i=nn(1681e3,1795300,2208400),n=nn(43278e5,93046e5,66121e5),a=Yi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=nn(o.x.add(a),o.y,o.z).div(1.0685e-7),Vg.mul(o)})(Yi(e).mul(y),Yi(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(nn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),kg=$i(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=eu(r.lessThan(.25),Yi(-339.2).mul(i).add(Yi(161.4).mul(r)).sub(25.9),Yi(-8.48).mul(i).add(Yi(14.3).mul(r)).sub(9.95)),a=eu(r.lessThan(.25),Yi(44).mul(i).sub(Yi(23.7).mul(r)).add(3.26),Yi(1.97).mul(i).sub(Yi(3.27).mul(r)).add(.72));return eu(r.lessThan(.25),0,Yi(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()}),Gg=nn(.04),zg=Yi(1);class Hg extends kp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=nn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=nn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=nn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=nn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=nn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=od.dot(Ql).clamp();this.iridescenceFresnel=Og({outsideIOR:Yi(1),eta2:Mn,cosTheta1:e,thinFilmThickness:Pn,baseF0:Dn}),this.iridescenceF0=lg({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xl,r=Nl.sub(Xl).normalize(),s=ud,i=e.context;i.backdrop=Dg(s,r,Nn,_n,Dn,Vn,t,Fl,Tl,bl,Hn,Wn,jn,qn,this.dispersion?Xn:null),i.backdropAlpha=$n,_n.a.mulAssign(ko(1,i.backdrop.a,$n))}super.start(e)}computeMultiscattering(e,t,r){const s=od.dot(Ql).clamp(),i=og({roughness:Nn,dotNV:s}),n=(this.iridescenceF0?Cn.mix(Dn,this.iridescenceF0):Dn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Dn.add(Dn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=od.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(hg({lightDirection:e}))),!0===this.clearcoat){const r=ld.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(ag({lightDirection:e,f0:Gg,f90:zg,roughness:wn,normalView:ld})))}r.directDiffuse.addAssign(s.mul(Wp({diffuseColor:_n.rgb}))),r.directSpecular.addAssign(s.mul(ag({lightDirection:e,f0:Dn,f90:1,roughness:Nn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=od,h=Ql,p=Yl.toVar(),g=pg({N:c,V:h,roughness:Nn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=gn(nn(m.x,0,m.y),nn(0,1,0),nn(m.z,0,m.w)).toVar(),b=Dn.mul(f.x).add(Dn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(fg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(_n).mul(fg({N:c,V:h,P:p,mInv:gn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(Wp({diffuseColor:_n})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(An,kg({normal:od,viewDir:Ql,roughness:Rn}))),!0===this.clearcoat){const e=ld.dot(Ql).clamp(),t=ug({dotNV:e,specularColor:Gg,specularF90:zg,roughness:wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=nn().toVar("singleScattering"),n=nn().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Vn);const o=i.add(n),u=_n.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=od.dot(Ql).clamp().add(t),i=Nn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ld.dot(Ql).clamp(),r=$p({dotVH:e,f0:Gg,f90:zg}),s=t.mul(En.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(En));t.assign(s)}if(!0===this.sheen){const e=An.r.max(An.g).max(An.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const $g=Yi(1),Wg=Yi(-2),qg=Yi(.8),jg=Yi(-1),Xg=Yi(.4),Kg=Yi(2),Yg=Yi(.305),Qg=Yi(3),Zg=Yi(.21),Jg=Yi(4),em=Yi(4),tm=Yi(16),rm=$i(([e])=>{const t=nn(uo(e)).toVar(),r=Yi(-1).toVar();return ji(t.x.greaterThan(t.z),()=>{ji(t.x.greaterThan(t.y),()=>{r.assign(eu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}).Else(()=>{ji(t.z.greaterThan(t.y),()=>{r.assign(eu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),sm=$i(([e,t])=>{const r=en().toVar();return ji(t.equal(0),()=>{r.assign(en(e.z,e.y).div(uo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(en(e.x.negate(),e.z.negate()).div(uo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(en(e.x.negate(),e.y).div(uo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(en(e.z.negate(),e.y).div(uo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(en(e.x.negate(),e.z).div(uo(e.y)))}).Else(()=>{r.assign(en(e.x,e.y).div(uo(e.z)))}),pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),im=$i(([e])=>{const t=Yi(0).toVar();return ji(e.greaterThanEqual(qg),()=>{t.assign($g.sub(e).mul(jg.sub(Wg)).div($g.sub(qg)).add(Wg))}).ElseIf(e.greaterThanEqual(Xg),()=>{t.assign(qg.sub(e).mul(Kg.sub(jg)).div(qg.sub(Xg)).add(jg))}).ElseIf(e.greaterThanEqual(Yg),()=>{t.assign(Xg.sub(e).mul(Qg.sub(Kg)).div(Xg.sub(Yg)).add(Kg))}).ElseIf(e.greaterThanEqual(Zg),()=>{t.assign(Yg.sub(e).mul(Jg.sub(Qg)).div(Yg.sub(Zg)).add(Qg))}).Else(()=>{t.assign(Yi(-2).mul(Ka(pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),nm=$i(([e,t])=>{const r=e.toVar();r.assign(pa(2,r).sub(1));const s=nn(r,1).toVar();return ji(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),am=$i(([e,t,r,s,i,n])=>{const a=Yi(r),o=nn(t),u=Go(im(a),Wg,n),l=to(u),d=Za(u),c=nn(om(e,o,d,s,i,n)).toVar();return ji(l.notEqual(0),()=>{const t=nn(om(e,o,d.add(1),s,i,n)).toVar();c.assign(ko(c,t,l))}),c}),om=$i(([e,t,r,s,i,n])=>{const a=Yi(r).toVar(),o=nn(t),u=Yi(rm(o)).toVar(),l=Yi(wo(em.sub(a),0)).toVar();a.assign(wo(a,em));const d=Yi(ja(a)).toVar(),c=en(sm(o,u).mul(d.sub(2)).add(1)).toVar();return ji(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(pa(3,tm))),c.y.addAssign(pa(4,ja(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(en(),en())}),um=$i(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=so(s),l=r.mul(u).add(i.cross(r).mul(ro(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return om(e,l,t,n,a,o)}),lm=$i(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=nn(eu(t,r,Bo(r,s))).toVar();ji(h.equal(nn(0)),()=>{h.assign(nn(s.z,0,s.x.negate()))}),h.assign(eo(h));const p=nn().toVar();return p.addAssign(i.element(0).mul(um({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Th({start:Qi(1),end:e},({i:e})=>{ji(e.greaterThanEqual(n),()=>{_h()});const t=Yi(a.mul(Yi(e))).toVar();p.addAssign(i.element(e).mul(um({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(um({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),ln(p,1)}),dm=[.125,.215,.35,.446,.526,.582],cm=20,hm=new ae(-1,1,1,-1,0,1),pm=new oe(90,1),gm=new e;let mm=null,fm=0,ym=0;const bm=(1+Math.sqrt(5))/2,xm=1/bm,Tm=[new r(-bm,xm,0),new r(bm,xm,0),new r(-xm,0,bm),new r(xm,0,bm),new r(0,bm,-xm),new r(0,bm,xm),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],_m=new r,vm=new WeakMap,Nm=[3,1,5,0,4,2],Sm=nm(Ju(),Zu("faceIndex")).normalize(),Em=nn(Sm.x,Sm.y,Sm.z);class wm{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=_m,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}mm=this._renderer.getRenderTarget(),fm=this._renderer.getActiveCubeFace(),ym=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Mm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Pm(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===R||e.mapping===C?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=dm[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Nm[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new pe;_.setAttribute("position",new ge(b,m)),_.setAttribute("uv",new ge(x,f)),_.setAttribute("faceIndex",new ge(T,y)),t.push(_),i.push(new X(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(t)),this._blurMaterial=function(e,t,s){const i=pl(new Array(cm).fill(0)),n=ra(new r(0,1,0)),a=ra(0),o=Yi(cm),u=ra(0),l=ra(1),d=ol(null),c=ra(0),h=Yi(1/t),p=Yi(1/s),g=Yi(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Em,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Cm("blur");return f.fragmentNode=lm({...m,latitudinal:u.equal(1)}),vm.set(f,m),f}(t,e.width,e.height)}}async _compileMaterial(e){const t=new X(this._lodPlanes[0],e);await this._renderer.compile(t,hm)}_sceneToCubeUV(e,t,r,s,i){const n=pm;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(gm),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new se({name:"PMREM.Background",side:S,depthWrite:!1,depthTest:!1});d=new X(new j,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(gm),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Rm(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===R||e.mapping===C;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Mm(e)):null===this._equirectMaterial&&(this._equirectMaterial=Pm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Rm(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,hm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tcm&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),o.setRenderTarget(t),o.render(l,hm)}}function Am(e,t){const r=new ue(e,t,{magFilter:Y,minFilter:Y,generateMipmaps:!1,type:ce,format:de,colorSpace:le});return r.texture.mapping=he,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Rm(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Cm(e){const t=new bp;return t.depthTest=!1,t.depthWrite=!1,t.blending=H,t.name=`PMREM_${e}`,t}function Mm(e){const t=Cm("cubemap");return t.fragmentNode=Ad(e,Em),t}function Pm(e){const t=Cm("equirect");return t.fragmentNode=ol(e,Pp(Em),0),t}const Bm=new WeakMap;function Lm(e,t,r){const s=function(e){let t=Bm.get(e);void 0===t&&(t=new WeakMap,Bm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Fm extends Ys{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new x;s.isRenderTargetTexture=!0,this._texture=ol(s),this._width=ra(0),this._height=ra(0),this._maxMip=ra(0),this.updateBeforeType=Us.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Lm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new wm(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=xd.mul(nn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),am(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Im=Oi(Fm).setParameterLength(1,3),Dm=new WeakMap;class Vm extends Ah{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Dm.get(e);void 0===s&&(s=Im(e),Dm.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?nc:od,i=r.context(Um(Nn,s)).mul(bd),n=r.context(Om(ud)).mul(Math.PI).mul(bd),a=Uu(i),o=Uu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Um(wn,ld)).mul(bd),t=Uu(e);u.addAssign(t)}}}const Um=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Ql.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Tl)),r),getTextureLevel:()=>e}},Om=e=>({getUV:()=>e,getTextureLevel:()=>Yi(1)}),km=new me;class Gm extends bp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(km),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Vm(t):null}setupLightingModel(){return new Hg}setupSpecular(){const e=ko(nn(.04),_n.rgb,Sn);Dn.assign(e),Vn.assign(1)}setupVariants(){const e=this.metalnessNode?Yi(this.metalnessNode):Ec;Sn.assign(e);let t=this.roughnessNode?Yi(this.roughnessNode):Sc;t=eg({roughness:t}),Nn.assign(t),this.setupSpecular(),_n.assign(ln(_n.rgb.mul(e.oneMinus()),_n.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const zm=new fe;class Hm extends Gm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(zm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Yi(this.iorNode):Oc;Hn.assign(e),Dn.assign(ko(Eo(Fo(Hn.sub(1).div(Hn.add(1))).mul(_c),nn(1)).mul(Tc),_n.rgb,Sn)),Vn.assign(ko(Tc,1,Sn))}setupLightingModel(){return new Hg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Yi(this.clearcoatNode):Ac,t=this.clearcoatRoughnessNode?Yi(this.clearcoatRoughnessNode):Rc;En.assign(e),wn.assign(eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?nn(this.sheenNode):Pc,t=this.sheenRoughnessNode?Yi(this.sheenRoughnessNode):Bc;An.assign(e),Rn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Yi(this.iridescenceNode):Fc,t=this.iridescenceIORNode?Yi(this.iridescenceIORNode):Ic,r=this.iridescenceThicknessNode?Yi(this.iridescenceThicknessNode):Dc;Cn.assign(e),Mn.assign(t),Pn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?en(this.anisotropyNode):Lc).toVar();Ln.assign(e.length()),ji(Ln.equal(0),()=>{e.assign(en(1,0))}).Else(()=>{e.divAssign(en(Ln)),Ln.assign(Ln.saturate())}),Bn.assign(Ln.pow2().mix(Nn.pow2(),1)),Fn.assign(sc[0].mul(e.x).add(sc[1].mul(e.y))),In.assign(sc[1].mul(e.x).sub(sc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Yi(this.transmissionNode):Vc,t=this.thicknessNode?Yi(this.thicknessNode):Uc,r=this.attenuationDistanceNode?Yi(this.attenuationDistanceNode):kc,s=this.attenuationColorNode?nn(this.attenuationColorNode):Gc;if($n.assign(e),Wn.assign(t),qn.assign(r),jn.assign(s),this.useDispersion){const e=this.dispersionNode?Yi(this.dispersionNode):Xc;Xn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?nn(this.clearcoatNormalNode):Cc}setup(e){e.context.setupClearcoatNormal=()=>hu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class $m extends Hg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(od.mul(a)).normalize(),h=Yi(Ql.dot(c.negate()).saturate().pow(l).mul(d)),p=nn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Wm extends Hm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Yi(.1),this.thicknessAmbientNode=Yi(0),this.thicknessAttenuationNode=Yi(.1),this.thicknessPowerNode=Yi(2),this.thicknessScaleNode=Yi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new $m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const qm=$i(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=en(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Ld("gradientMap","texture").context({getUV:()=>i});return nn(e.r)}{const e=i.fwidth().mul(.5);return ko(nn(.7),nn(1),$o(Yi(.7).sub(e.x),Yi(.7).add(e.x),i.x))}});class jm extends kp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=qm({normal:rd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Wp({diffuseColor:_n.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Wp({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Xm=new ye;class Km extends bp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Xm),this.setValues(e)}setupLightingModel(){return new jm}}const Ym=$i(()=>{const e=nn(Ql.z,0,Ql.x.negate()).normalize(),t=Ql.cross(e);return en(e.dot(od),t.dot(od)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Qm=new be;class Zm extends bp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Qm),this.setValues(e)}setupVariants(e){const t=Ym;let r;r=e.material.matcap?Ld("matcap","texture").context({getUV:()=>t}):nn(ko(.2,.8,t.y)),_n.rgb.mulAssign(r.rgb)}}class Jm extends Ys{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return pn(e,s,s.negate(),e).mul(r)}{const e=t,s=mn(ln(1,0,0,0),ln(0,so(e.x),ro(e.x).negate(),0),ln(0,ro(e.x),so(e.x),0),ln(0,0,0,1)),i=mn(ln(so(e.y),0,ro(e.y),0),ln(0,1,0,0),ln(ro(e.y).negate(),0,so(e.y),0),ln(0,0,0,1)),n=mn(ln(so(e.z),ro(e.z).negate(),0,0),ln(ro(e.z),so(e.z),0,0),ln(0,0,1,0),ln(0,0,0,1));return s.mul(i).mul(n).mul(ln(r,1)).xyz}}}const ef=Oi(Jm).setParameterLength(2),tf=new xe;class rf extends bp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(tf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Gl.mul(nn(i||0));let u=en(Fl[0].xyz.length(),Fl[1].xyz.length());if(null!==a&&(u=u.mul(en(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=Yi(2).div(bl.element(1).element(1));u=u.mul(e.mul(2))}let l=Wl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ii(new Nu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Yi(n||Mc),c=ef(l,d);return ln(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const sf=new Te;class nf extends rf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(sf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Gl.mul(nn(e||ql)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Wl.xy.toVar(),a=Uh.z.div(Uh.w);if(r&&r.isNode){const e=Yi(r);n.assign(ef(n,e))}let o=null!==i?en(i):jc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Yl.z.negate()))),s&&s.isNode&&(o=o.mul(en(s))),n.mulAssign(o.mul(2)),n.assign(n.div(Uh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(ln(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class af extends kp{constructor(){super(),this.shadowNode=Yi(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){_n.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(_n.rgb)}}const of=new _e;class uf extends bp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(of),this.setValues(e)}setupLightingModel(){return new af}}const lf=xn("vec3"),df=xn("vec3"),cf=xn("vec3");class hf extends kp{constructor(){super()}start(e){const{material:t,context:r}=e,s=xn("vec3"),i=xn("vec3");ji(Nl.sub(Xl).length().greaterThan(Ul.mul(2)),()=>{s.assign(Nl),i.assign(Xl)}).Else(()=>{s.assign(Xl),i.assign(Nl)});const n=i.sub(s),a=ra("int").onRenderUpdate(({material:e})=>e.steps),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=Yi(0).toVar(),d=nn(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Th(a,()=>{const i=s.add(u.mul(l)),n=Tl.mul(ln(i,1)).xyz;let a;null!==t.depthNode&&(df.assign(sp(Zh(n.z,fl,yl))),r.sceneDepthNode=sp(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,lf.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&lf.mulAssign(a);const c=lf.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)}),cf.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ji(r.greaterThanEqual(df),()=>{lf.addAssign(e)}):lf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(yg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(cf)}}class pf extends bp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=S,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new hf}}class gf{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class mf{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const bf=[];class xf{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);bf[0]=e,bf[1]=t,bf[2]=n,bf[3]=i;let l=u.get(bf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(bf,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),bf.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new mf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Tf{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const _f=1,vf=2,Nf=3,Sf=4,Ef=16;class wf extends Tf{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===_f?this.backend.createAttribute(e):t===vf?this.backend.createIndexAttribute(e):t===Nf?this.backend.createStorageAttribute(e):t===Sf&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Nf):this.updateAttribute(e,_f);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,vf);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Sf)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Rf(t),e.set(t,r)):r.version!==Af(t)&&(this.attributes.delete(r),r=Rf(t),e.set(t,r)),s=r}return s}}class Mf{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class Pf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Bf extends Pf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Lf extends Pf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Ff=0;class If{constructor(e,t,r,s=null,i=null){this.id=Ff++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Df extends Tf{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new If(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new If(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new If(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Lf(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new Bf(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Vf extends Tf{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Sf:Nf;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Sf:Nf;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else t.isSampler&&t.update()}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Of(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function kf(e){return(e.transmission>0||e.transmissionNode)&&e.side===E&&!1===e.forceSinglePass}class Gf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(kf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(kf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Uf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Of),this.transparent.length>1&&this.transparent.sort(t||Of)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new U,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:T,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Qf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Jf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ey extends bn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class ty extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.hasOutput?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.hasOutput?this.outputNode.getMemberType(e,t):"void"}add(e){return!0!==e.isNode?(console.error("THREE.TSL: Invalid node added to stack."),this):(this.nodes.push(e),this)}If(e,t){const r=new Fi(t);return this._currentCond=eu(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=eu(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Ii(e),this}Case(...e){const t=[];if(e.length>=2)for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=0;for(const r of this.membersLayout){const s=r.type,i=Cs(s)*e,n=t%8,a=n%Ms(s),o=n+a;t+=a,0!==o&&8-oe.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class iy extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class ny extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),cy=(e,t)=>Lo(pa(4,e.mul(ha(1,e))),t),hy=$i(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),py=$i(([e])=>nn(hy(e.z.add(hy(e.y.mul(1)))),hy(e.z.add(hy(e.x.mul(1)))),hy(e.y.add(hy(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),gy=$i(([e,t,r])=>{const s=nn(e).toVar(),i=Yi(1.4).toVar(),n=Yi(0).toVar(),a=nn(s).toVar();return Th({start:Yi(0),end:Yi(3),type:"float",condition:"<="},()=>{const e=nn(py(a.mul(2))).toVar();s.addAssign(e.add(r.mul(Yi(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=Yi(hy(s.z.add(hy(s.x.add(hy(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class my extends js{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const fy=Oi(my),yy=e=>(...t)=>fy(e,...t),by=ra(0).setGroup(Jn).onRenderUpdate(e=>e.time),xy=ra(0).setGroup(Jn).onRenderUpdate(e=>e.deltaTime),Ty=ra(0,"uint").setGroup(Jn).onRenderUpdate(e=>e.frameId),_y=$i(([e,t,r=en(.5)])=>ef(e.sub(r),t).add(r)),vy=$i(([e,t,r=en(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Ny=$i(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Fl;const i=Tl.mul(s);return Bi(t)&&(i[0][0]=Fl[0].length(),i[0][1]=0,i[0][2]=0),Bi(r)&&(i[1][0]=0,i[1][1]=Fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,bl.mul(i).mul(ql)}),Sy=$i(([e=null])=>{const t=sp();return sp(Kh(e)).sub(t).lessThan(0).select(Ih,e)});class Ey extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Ju(),r=Yi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=en(a,o);return t.add(l).mul(u)}}const wy=Oi(Ey).setParameterLength(3),Ay=$i(([e,t=null,r=null,s=Yi(1),i=ql,n=sd])=>{let a=n.abs().normalize();a=a.div(a.dot(nn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=ol(d,o).mul(a.x),g=ol(c,u).mul(a.y),m=ol(h,l).mul(a.z);return ca(p,g,m)}),Ry=new Me,Cy=new r,My=new r,Py=new r,By=new a,Ly=new r(0,0,-1),Fy=new s,Iy=new r,Dy=new r,Vy=new s,Uy=new t,Oy=new ue,ky=Ih.flipX();Oy.depthTexture=new U(1,1);let Gy=!1;class zy extends nl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Oy.texture,ky),this._reflectorBaseNode=e.reflector||new Hy(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Ii(new zy({defaultTexture:Oy.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Hy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Uy),e.setSize(Math.round(Uy.width*r),Math.round(Uy.height*r))}setup(e){return this._updateResolution(Oy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ue(0,0,{type:ce,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new U),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Gy)return!1;Gy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Uy),this._updateResolution(o,s),My.setFromMatrixPosition(n.matrixWorld),Py.setFromMatrixPosition(r.matrixWorld),By.extractRotation(n.matrixWorld),Cy.set(0,0,1),Cy.applyMatrix4(By),Iy.subVectors(My,Py);let u=!1;if(!0===Iy.dot(Cy)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Gy=!1);u=!0}Iy.reflect(Cy).negate(),Iy.add(My),By.extractRotation(r.matrixWorld),Ly.set(0,0,-1),Ly.applyMatrix4(By),Ly.add(Py),Dy.subVectors(My,Ly),Dy.reflect(Cy).negate(),Dy.add(My),a.coordinateSystem=r.coordinateSystem,a.position.copy(Iy),a.up.set(0,1,0),a.up.applyMatrix4(By),a.up.reflect(Cy),a.lookAt(Dy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Ry.setFromNormalAndCoplanarPoint(Cy,My),Ry.applyMatrix4(a.matrixWorldInverse),Fy.set(Ry.normal.x,Ry.normal.y,Ry.normal.z,Ry.constant);const l=a.projectionMatrix;Vy.x=(Math.sign(Fy.x)+l.elements[8])/l.elements[0],Vy.y=(Math.sign(Fy.y)+l.elements[9])/l.elements[5],Vy.z=-1,Vy.w=(1+l.elements[10])/l.elements[14],Fy.multiplyScalar(1/Fy.dot(Vy));l.elements[2]=Fy.x,l.elements[6]=Fy.y,l.elements[10]=s.coordinateSystem===d?Fy.z-0:Fy.z+1-0,l.elements[14]=Fy.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const c=s.getRenderTarget(),h=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),s.setMRT(h),s.setRenderTarget(c),s.autoClear=p,i.visible=!0,Gy=!1,this.forceUpdate=!1}}const $y=new ae(-1,1,1,-1,0,1);class Wy extends pe{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Le([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Le(t,2))}}const qy=new Wy;class jy extends X{constructor(e=null){super(qy,e),this.camera=$y,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,$y)}render(e){e.render(this,$y)}}const Xy=new t;class Ky extends nl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ce}){const i=new ue(t,r,s);super(i.texture,Ju()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new jy(new bp),this.updateBeforeType=Us.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Xy),s=r.width*t,i=r.height*t;s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new nl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Yy=(e,...t)=>Ii(new Ky(Ii(e),...t)),Qy=$i(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=en(e.x,e.y.oneMinus()).mul(2).sub(1),i=ln(nn(e,t),1)):i=ln(nn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ln(r.mul(i));return n.xyz.div(n.w)}),Zy=$i(([e,t])=>{const r=t.mul(ln(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return en(s.x,s.y.oneMinus())}),Jy=$i(([e,t,r])=>{const s=tl(ul(t)),i=tn(e.mul(s)).toVar(),n=ul(t,i).toVar(),a=ul(t,i.sub(tn(2,0))).toVar(),o=ul(t,i.sub(tn(1,0))).toVar(),u=ul(t,i.add(tn(1,0))).toVar(),l=ul(t,i.add(tn(2,0))).toVar(),d=ul(t,i.add(tn(0,2))).toVar(),c=ul(t,i.add(tn(0,1))).toVar(),h=ul(t,i.sub(tn(0,1))).toVar(),p=ul(t,i.sub(tn(0,2))).toVar(),g=uo(ha(Yi(2).mul(o).sub(a),n)).toVar(),m=uo(ha(Yi(2).mul(u).sub(l),n)).toVar(),f=uo(ha(Yi(2).mul(c).sub(d),n)).toVar(),y=uo(ha(Yi(2).mul(h).sub(p),n)).toVar(),b=Qy(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Qy(e.sub(en(Yi(1).div(s.x),0)),o,r)),b.negate().add(Qy(e.add(en(Yi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Qy(e.add(en(0,Yi(1).div(s.y))),c,r)),b.negate().add(Qy(e.sub(en(0,Yi(1).div(s.y))),h,r)));return eo(Bo(x,T))});class eb extends js{static get type(){return"SampleNode"}constructor(e){super(),this.callback=e,this.isSampleNode=!0}setup(){return this.sample(Ju())}sample(e){return this.callback(e)}}class tb extends js{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===tb.OBJECT?this.updateType=Us.OBJECT:e===tb.MATERIAL&&(this.updateType=Us.RENDER)}update(e){this.callback(e)}}tb.OBJECT="object",tb.MATERIAL="material";const rb=(e,t)=>Ii(new tb(e,t)).toStack();class sb extends L{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class ib extends ge{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class nb extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ab=ki(nb),ob=new w,ub=new a;class lb extends js{static get type(){return"SceneNode"}constructor(e=lb.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===lb.BACKGROUND_BLURRINESS?s=Md("backgroundBlurriness","float",r):t===lb.BACKGROUND_INTENSITY?s=Md("backgroundIntensity","float",r):t===lb.BACKGROUND_ROTATION?s=ra("mat4").setName("backgroundRotation").setGroup(Jn).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Fe?(ob.copy(r.backgroundRotation),ob.x*=-1,ob.y*=-1,ob.z*=-1,ub.makeRotationFromEuler(ob)):ub.identity(),ub}):console.error("THREE.SceneNode: Unknown scope:",t),s}}lb.BACKGROUND_BLURRINESS="backgroundBlurriness",lb.BACKGROUND_INTENSITY="backgroundIntensity",lb.BACKGROUND_ROTATION="backgroundRotation";const db=ki(lb,lb.BACKGROUND_BLURRINESS),cb=ki(lb,lb.BACKGROUND_INTENSITY),hb=ki(lb,lb.BACKGROUND_ROTATION);class pb extends nl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e}}const gb=Oi(pb).setParameterLength(1,3),mb=$i(({texture:e,uv:t})=>{const r=1e-4,s=nn().toVar();return ji(t.x.lessThan(r),()=>{s.assign(nn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(nn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(nn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(nn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(nn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(nn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(nn(-.01,0,0))).r.sub(e.sample(t.add(nn(r,0,0))).r),n=e.sample(t.add(nn(0,-.01,0))).r.sub(e.sample(t.add(nn(0,r,0))).r),a=e.sample(t.add(nn(0,0,-.01))).r.sub(e.sample(t.add(nn(0,0,r))).r);s.assign(nn(i,n,a))}),s.normalize()});class fb extends nl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return nn(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Qi(tl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return mb({texture:this,uv:e})}}const yb=Oi(fb).setParameterLength(1,3);class bb extends Cd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const xb=new WeakMap;class Tb extends Ys{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=ra(new a),this.previousProjectionMatrix=ra(new a).setGroup(Jn),this.previousCameraViewMatrix=ra(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=vb(r);this.previousModelWorldMatrix.value.copy(s);const i=_b(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){vb(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?bl:ra(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Gl).mul(ql),s=this.previousProjectionMatrix.mul(t).mul(jl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ha(i,n)}}function _b(e){let t=xb.get(e);return void 0===t&&(t={},xb.set(e,t)),t}function vb(e,t=0){const r=_b(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Nb=ki(Tb),Sb=$i(([e])=>Rb(e.rgb)),Eb=$i(([e,t=Yi(1)])=>t.mix(Rb(e.rgb),e.rgb)),wb=$i(([e,t=Yi(1)])=>{const r=ca(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return ko(e.rgb,s,i)}),Ab=$i(([e,t=Yi(1)])=>{const r=nn(.57735,.57735,.57735),s=t.cos();return nn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Po(r,e.rgb).mul(s.oneMinus())))))}),Rb=(e,t=nn(c.getLuminanceCoefficients(new r)))=>Po(e,t),Cb=$i(([e,t=nn(1),s=nn(0),i=nn(1),n=Yi(1),a=nn(c.getLuminanceCoefficients(new r,le))])=>{const o=e.rgb.dot(nn(a)),u=wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ji(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ji(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ji(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),ln(u.rgb,e.a)});class Mb extends Ys{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Pb=Oi(Mb).setParameterLength(2),Bb=new t;class Lb extends nl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Fb extends Lb{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}class Ib extends Ys{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new U;i.isRenderTargetTexture=!0,i.name="depth";const n=new ue(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ce,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ra(0),this._cameraFar=ra(0),this._mrt=null,this._layers=null,this._resolution=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Us.FRAME,this.global=!0}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Ii(new Fb(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Ii(new Fb(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Jh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Qh(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getColorBufferType(),this.scope===Ib.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Bb.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Bb)),this._pixelRatio=i,this.setSize(Bb.width,Bb.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolution).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolution).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ib.COLOR="color",Ib.DEPTH="depth";class Db extends Ib{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ib.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new bp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=S;const t=sd.negate(),r=bl.mul(Gl),s=Yi(1),i=r.mul(ln(ql,1)),n=r.mul(ln(ql.add(t),1)),a=eo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ln(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Vb=$i(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ub=$i(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ob=$i(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kb=$i(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),Gb=$i(([e,t])=>{const r=gn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=gn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=kb(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zb=gn(nn(1.6605,-.1246,-.0182),nn(-.5876,1.1329,-.1006),nn(-.0728,-.0083,1.1187)),Hb=gn(nn(.6274,.0691,.0164),nn(.3293,.9195,.088),nn(.0433,.0113,.8956)),$b=$i(([e])=>{const t=nn(e).toVar(),r=nn(t.mul(t)).toVar(),s=nn(r.mul(r)).toVar();return Yi(15.5).mul(s.mul(r)).sub(pa(40.14,s.mul(t))).add(pa(31.96,s).sub(pa(6.868,r.mul(t))).add(pa(.4298,r).add(pa(.1191,t).sub(.00232))))}),Wb=$i(([e,t])=>{const r=nn(e).toVar(),s=gn(nn(.856627153315983,.137318972929847,.11189821299995),nn(.0951212405381588,.761241990602591,.0767994186031903),nn(.0482516061458583,.101439036467562,.811302368396859)),i=gn(nn(1.1271005818144368,-.1413297634984383,-.14132976349843826),nn(-.11060664309660323,1.157823702216272,-.11060664309660294),nn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Yi(-12.47393),a=Yi(4.026069);return r.mulAssign(t),r.assign(Hb.mul(r)),r.assign(s.mul(r)),r.assign(wo(r,1e-10)),r.assign(Ka(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Go(r,0,1)),r.assign($b(r)),r.assign(i.mul(r)),r.assign(Lo(wo(nn(0),r),nn(2.2))),r.assign(zb.mul(r)),r.assign(Go(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),qb=$i(([e,t])=>{const r=Yi(.76),s=Yi(.15);e=e.mul(t);const i=Eo(e.r,Eo(e.g,e.b)),n=eu(i.lessThan(.08),i.sub(pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=wo(e.r,wo(e.g,e.b));ji(a.lessThan(r),()=>e);const o=ha(1,r),u=ha(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ha(1,ga(1,s.mul(a.sub(u)).add(1)));return ko(e,nn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class jb extends js{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Xb=Oi(jb).setParameterLength(1,3);class Kb extends jb{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Yb=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Qb extends js{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Yi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Fs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Is(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Zb=Oi(Qb).setParameterLength(1);class Jb extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class ex{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const tx=new Jb;class rx extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Jb,this._output=Zb(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Zb(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Zb(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new ex(this),t=tx.get("THREE"),r=tx.get("TSL"),s=this.getMethod(),i=[e,this._local,tx,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Yi()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const sx=Oi(rx).setParameterLength(1,2);function ix(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Yl.z).negate()}const nx=$i(([e,t],r)=>{const s=ix(r);return $o(e,t,s)}),ax=$i(([e],t)=>{const r=ix(t);return e.mul(e,r,r).negate().exp().oneMinus()}),ox=$i(([e,t])=>ln(t.toFloat().mix(On.rgb,e.toVec3()),On.a));let ux=null,lx=null;class dx extends js{static get type(){return"RangeNode"}constructor(e=Yi(),t=Yi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));ux=ux||new s,lx=lx||new s,ux.setScalar(0),lx.setScalar(0),1===a?ux.setScalar(i):i.isColor?ux.set(i.r,i.g,i.b,1):ux.set(i.x,i.y,i.z||0,i.w||0),1===o?lx.setScalar(n):n.isColor?lx.set(n.r,n.g,n.b,1):lx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eIi(new hx(e,t)),gx=px("numWorkgroups","uvec3"),mx=px("workgroupId","uvec3"),fx=px("globalId","uvec3"),yx=px("localId","uvec3"),bx=px("subgroupSize","uint");const xx=Oi(class extends js{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Tx extends Xs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class _x extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ii(new Tx(this,e))}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class vx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=Wu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}vx.ATOMIC_LOAD="atomicLoad",vx.ATOMIC_STORE="atomicStore",vx.ATOMIC_ADD="atomicAdd",vx.ATOMIC_SUB="atomicSub",vx.ATOMIC_MAX="atomicMax",vx.ATOMIC_MIN="atomicMin",vx.ATOMIC_AND="atomicAnd",vx.ATOMIC_OR="atomicOr",vx.ATOMIC_XOR="atomicXor";const Nx=Oi(vx),Sx=(e,t,r)=>Nx(e,t,r).toStack();let Ex;function wx(e){Ex=Ex||new WeakMap;let t=Ex.get(e);return void 0===t&&Ex.set(e,t={}),t}function Ax(e){const t=wx(e);return t.shadowMatrix||(t.shadowMatrix=ra("mat4").setGroup(Jn).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||e.shadow.updateMatrices(e),e.shadow.matrix)))}function Rx(e,t=Xl){const r=Ax(e).mul(t);return r.xyz.div(r.w)}function Cx(e){const t=wx(e);return t.position||(t.position=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function Mx(e){const t=wx(e);return t.targetPosition||(t.targetPosition=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function Px(e){const t=wx(e);return t.viewPosition||(t.viewPosition=ra(new r).setGroup(Jn).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const Bx=e=>Tl.transformDirection(Cx(e).sub(Mx(e))),Lx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},Fx=new WeakMap,Ix=[];class Dx extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=xn("vec3","totalDiffuse"),this.totalSpecularNode=xn("vec3","totalSpecular"),this.outgoingLightNode=xn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ii(e));else{let s=null;if(null!==r&&(s=Lx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;Fx.has(e)?s=Fx.get(e):(s=Ii(new r(e)),Fx.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=nn(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class Vx extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){Ux.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Xl)}}const Ux=xn("vec3","shadowPositionWorld");function Ox(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function kx(e,t){return t=Ox(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function Gx(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function zx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function Hx(e,t){return t=zx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function $x(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function Wx(e,t,r){return r=Hx(t,r=kx(e,r))}function qx(e,t,r){Gx(e,r),$x(t,r)}var jx=Object.freeze({__proto__:null,resetRendererAndSceneState:Wx,resetRendererState:kx,resetSceneState:Hx,restoreRendererAndSceneState:qx,restoreRendererState:Gx,restoreSceneState:$x,saveRendererAndSceneState:function(e,t,r={}){return r=zx(t,r=Ox(e,r))},saveRendererState:Ox,saveSceneState:zx});const Xx=new WeakMap,Kx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=ol(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),Yx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=ol(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Md("mapSize","vec2",r).setGroup(Jn),a=Md("radius","float",r).setGroup(Jn),o=en(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return ca(i(t.xy.add(en(u,l)),t.z),i(t.xy.add(en(0,l)),t.z),i(t.xy.add(en(d,l)),t.z),i(t.xy.add(en(h,p)),t.z),i(t.xy.add(en(0,p)),t.z),i(t.xy.add(en(g,p)),t.z),i(t.xy.add(en(u,0)),t.z),i(t.xy.add(en(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(en(g,0)),t.z),i(t.xy.add(en(d,0)),t.z),i(t.xy.add(en(h,m)),t.z),i(t.xy.add(en(0,m)),t.z),i(t.xy.add(en(g,m)),t.z),i(t.xy.add(en(u,c)),t.z),i(t.xy.add(en(0,c)),t.z),i(t.xy.add(en(d,c)),t.z)).mul(1/17)}),Qx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=ol(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Md("mapSize","vec2",r).setGroup(Jn),a=en(1).div(n),o=a.x,u=a.y,l=t.xy,d=to(l.mul(n).add(.5));return l.subAssign(d.mul(a)),ca(i(l,t.z),i(l.add(en(o,0)),t.z),i(l.add(en(0,u)),t.z),i(l.add(a),t.z),ko(i(l.add(en(o.negate(),0)),t.z),i(l.add(en(o.mul(2),0)),t.z),d.x),ko(i(l.add(en(o.negate(),u)),t.z),i(l.add(en(o.mul(2),u)),t.z),d.x),ko(i(l.add(en(0,u.negate())),t.z),i(l.add(en(0,u.mul(2))),t.z),d.y),ko(i(l.add(en(o,u.negate())),t.z),i(l.add(en(o,u.mul(2))),t.z),d.y),ko(ko(i(l.add(en(o.negate(),u.negate())),t.z),i(l.add(en(o.mul(2),u.negate())),t.z),d.x),ko(i(l.add(en(o.negate(),u.mul(2))),t.z),i(l.add(en(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),Zx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=Yi(1).toVar();let i=ol(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=Ao(t.z,i.x);return ji(n.notEqual(Yi(1)),()=>{const e=t.z.sub(i.x),r=wo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Go(ha(a,.3).div(.95-.3)),s.assign(Go(wo(n,a)))}),s}),Jx=$i(([e,t,r])=>{let s=Xl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),eT=e=>{let t=Xx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Md("near","float",t).setGroup(Jn),s=Md("far","float",t).setGroup(Jn),i=Rl(e);return Jx(i,r,s)})(e):null;t=new bp,t.colorNode=ln(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,Xx.set(e,t)}return t},tT=new mf,rT=[],sT=(e,t,r,s)=>{rT[0]=e,rT[1]=t;let i=tT.get(rT);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ls(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,tT.set(rT,i)),rT[0]=null,rT[1]=null,i},iT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanVertical"),a=Yi(0).toVar("squareMeanVertical"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));Th({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Vh.xy,en(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),nT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanHorizontal"),a=Yi(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));Th({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Vh.xy,en(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),aT=[Kx,Yx,Qx,Zx];let oT;const uT=new jy;class lT extends Vx{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,Yi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Md("bias","float",r).setGroup(Jn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=Md("near","float",r.camera).setGroup(Jn),s=Md("far","float",r.camera).setGroup(Jn);n=ep(e.negate(),t,s)}return a=nn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return aT[e]}setupRenderTarget(e,t){const r=new U(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=De;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie&&!0!==s.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}));let t=ol(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=ol(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const i=Md("blurSamples","float",s).setGroup(Jn),o=Md("radius","float",s).setGroup(Jn),u=Md("mapSize","vec2",s).setGroup(Jn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new bp);l.fragmentNode=iT({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new bp),l.fragmentNode=nT({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=Md("intensity","float",s).setGroup(Jn),u=Md("normalBias","float",s).setGroup(Jn),l=Ax(r).mul(Ux.add(ud.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ie&&!0!==s.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=ol(a.texture,d);n.isArrayTexture&&(g=g.depth(this.depthLayer));const m=ko(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return $i(()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");oT=Wx(i,n,oT),n.overrideMaterial=eT(r),i.setRenderObjectFunction(sT(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ie&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,qx(i,n,oT)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),uT.material=this.vsmMaterialVertical,uT.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),uT.material=this.vsmMaterialHorizontal,uT.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const dT=(e,t)=>Ii(new lT(e,t)),cT=new e,hT=$i(([e,t])=>{const r=e.toVar(),s=uo(r),i=ga(1,wo(s.x,wo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=en(r.xy).toVar(),a=t.mul(1.5).oneMinus();return ji(s.z.greaterThanEqual(a),()=>{ji(r.z.greaterThan(0),()=>{n.x.assign(ha(4,r.x))})}).ElseIf(s.x.greaterThanEqual(a),()=>{const e=lo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))}).ElseIf(s.y.greaterThanEqual(a),()=>{const e=lo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))}),en(.125,.25).mul(n).add(en(.375,.75)).flipY()}).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),pT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>ol(e,hT(t,s.y)).compare(r)),gT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Md("radius","float",i).setGroup(Jn),a=en(-1,1).mul(n).mul(s.y);return ol(e,hT(t.add(a.xyy),s.y)).compare(r).add(ol(e,hT(t.add(a.yyy),s.y)).compare(r)).add(ol(e,hT(t.add(a.xyx),s.y)).compare(r)).add(ol(e,hT(t.add(a.yyx),s.y)).compare(r)).add(ol(e,hT(t,s.y)).compare(r)).add(ol(e,hT(t.add(a.xxy),s.y)).compare(r)).add(ol(e,hT(t.add(a.yxy),s.y)).compare(r)).add(ol(e,hT(t.add(a.xxx),s.y)).compare(r)).add(ol(e,hT(t.add(a.yxx),s.y)).compare(r)).mul(1/9)}),mT=$i(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.near),o=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.far),u=Md("bias","float",s).setGroup(Jn),l=ra(s.mapSize).setGroup(Jn),d=Yi(1).toVar();return ji(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=en(1).div(l.mul(en(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))}),d}),fT=new s,yT=new t,bT=new t;class xT extends lT{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?pT:gT}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return mT({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();bT.copy(t.mapSize),bT.multiply(a),r.setSize(bT.width,bT.height),yT.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(cT),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eIi(new xT(e,t));class _T extends Ah{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ra(this.color).setGroup(Jn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}getHash(){return this.light.uuid}getLightVector(e){return Px(this.light).sub(e.context.positionView||Yl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return dT(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Ii(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const vT=$i(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),NT=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=vT({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class ST extends _T{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(2).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return TT(this.light)}setupDirect(e){return NT({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const ET=$i(([e=Ju()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),wT=$i(([e=Ju()],{renderer:t,material:r})=>{const s=Oo(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.samples>1){const e=Yi(s.fwidth()).toVar();i=$o(e.oneMinus(),e.add(1),s).oneMinus()}else i=eu(s.greaterThan(1),0,1);return i}),AT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Ji(e).toVar();return eu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),RT=$i(([e,t])=>{const r=Ji(t).toVar(),s=Yi(e).toVar();return eu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),CT=$i(([e])=>{const t=Yi(e).toVar();return Qi(Za(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),MT=$i(([e,t])=>{const r=Yi(e).toVar();return t.assign(CT(r)),r.sub(Yi(t))}),PT=yy([$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=Yi(s).toVar(),l=Yi(r).toVar(),d=Yi(t).toVar(),c=Yi(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=nn(s).toVar(),l=nn(r).toVar(),d=nn(t).toVar(),c=nn(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),BT=yy([$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=Yi(o).toVar(),m=Yi(a).toVar(),f=Yi(n).toVar(),y=Yi(i).toVar(),b=Yi(s).toVar(),x=Yi(r).toVar(),T=Yi(t).toVar(),_=Yi(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=nn(o).toVar(),m=nn(a).toVar(),f=nn(n).toVar(),y=nn(i).toVar(),b=nn(s).toVar(),x=nn(r).toVar(),T=nn(t).toVar(),_=nn(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),LT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Zi(e).toVar(),a=Zi(n.bitAnd(Zi(7))).toVar(),o=Yi(AT(a.lessThan(Zi(4)),i,s)).toVar(),u=Yi(pa(2,AT(a.lessThan(Zi(4)),s,i))).toVar();return RT(o,Ji(a.bitAnd(Zi(1)))).add(RT(u,Ji(a.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),FT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=Zi(e).toVar(),u=Zi(o.bitAnd(Zi(15))).toVar(),l=Yi(AT(u.lessThan(Zi(8)),a,n)).toVar(),d=Yi(AT(u.lessThan(Zi(4)),n,AT(u.equal(Zi(12)).or(u.equal(Zi(14))),a,i))).toVar();return RT(l,Ji(u.bitAnd(Zi(1)))).add(RT(d,Ji(u.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),IT=yy([LT,FT]),DT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=on(e).toVar();return nn(IT(n.x,i,s),IT(n.y,i,s),IT(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),VT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=on(e).toVar();return nn(IT(o.x,a,n,i),IT(o.y,a,n,i),IT(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),UT=yy([DT,VT]),OT=$i(([e])=>{const t=Yi(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),kT=$i(([e])=>{const t=Yi(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),GT=yy([OT,$i(([e])=>{const t=nn(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),zT=yy([kT,$i(([e])=>{const t=nn(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),HT=$i(([e,t])=>{const r=Qi(t).toVar(),s=Zi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Qi(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),$T=$i(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(HT(r,Qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(HT(e,Qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(HT(t,Qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(HT(r,Qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(HT(e,Qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(HT(t,Qi(4))),t.addAssign(e)}),WT=$i(([e,t,r])=>{const s=Zi(r).toVar(),i=Zi(t).toVar(),n=Zi(e).toVar();return s.bitXorAssign(i),s.subAssign(HT(i,Qi(14))),n.bitXorAssign(s),n.subAssign(HT(s,Qi(11))),i.bitXorAssign(n),i.subAssign(HT(n,Qi(25))),s.bitXorAssign(i),s.subAssign(HT(i,Qi(16))),n.bitXorAssign(s),n.subAssign(HT(s,Qi(4))),i.bitXorAssign(n),i.subAssign(HT(n,Qi(14))),s.bitXorAssign(i),s.subAssign(HT(i,Qi(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),qT=$i(([e])=>{const t=Zi(e).toVar();return Yi(t).div(Yi(Zi(Qi(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),jT=$i(([e])=>{const t=Yi(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),XT=yy([$i(([e])=>{const t=Qi(e).toVar(),r=Zi(Zi(1)).toVar(),s=Zi(Zi(Qi(3735928559)).add(r.shiftLeft(Zi(2))).add(Zi(13))).toVar();return WT(s.add(Zi(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(Zi(2)).toVar(),n=Zi().toVar(),a=Zi().toVar(),o=Zi().toVar();return n.assign(a.assign(o.assign(Zi(Qi(3735928559)).add(i.shiftLeft(Zi(2))).add(Zi(13))))),n.addAssign(Zi(s)),a.addAssign(Zi(r)),WT(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(Zi(3)).toVar(),o=Zi().toVar(),u=Zi().toVar(),l=Zi().toVar();return o.assign(u.assign(l.assign(Zi(Qi(3735928559)).add(a.shiftLeft(Zi(2))).add(Zi(13))))),o.addAssign(Zi(n)),u.addAssign(Zi(i)),l.addAssign(Zi(s)),WT(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),$i(([e,t,r,s])=>{const i=Qi(s).toVar(),n=Qi(r).toVar(),a=Qi(t).toVar(),o=Qi(e).toVar(),u=Zi(Zi(4)).toVar(),l=Zi().toVar(),d=Zi().toVar(),c=Zi().toVar();return l.assign(d.assign(c.assign(Zi(Qi(3735928559)).add(u.shiftLeft(Zi(2))).add(Zi(13))))),l.addAssign(Zi(o)),d.addAssign(Zi(a)),c.addAssign(Zi(n)),$T(l,d,c),l.addAssign(Zi(i)),WT(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),$i(([e,t,r,s,i])=>{const n=Qi(i).toVar(),a=Qi(s).toVar(),o=Qi(r).toVar(),u=Qi(t).toVar(),l=Qi(e).toVar(),d=Zi(Zi(5)).toVar(),c=Zi().toVar(),h=Zi().toVar(),p=Zi().toVar();return c.assign(h.assign(p.assign(Zi(Qi(3735928559)).add(d.shiftLeft(Zi(2))).add(Zi(13))))),c.addAssign(Zi(l)),h.addAssign(Zi(u)),p.addAssign(Zi(o)),$T(c,h,p),c.addAssign(Zi(a)),h.addAssign(Zi(n)),WT(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),KT=yy([$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(XT(s,r)).toVar(),n=on().toVar();return n.x.assign(i.bitAnd(Qi(255))),n.y.assign(i.shiftRight(Qi(8)).bitAnd(Qi(255))),n.z.assign(i.shiftRight(Qi(16)).bitAnd(Qi(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(XT(n,i,s)).toVar(),o=on().toVar();return o.x.assign(a.bitAnd(Qi(255))),o.y.assign(a.shiftRight(Qi(8)).bitAnd(Qi(255))),o.z.assign(a.shiftRight(Qi(16)).bitAnd(Qi(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),YT=yy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(MT(t.x,r)).toVar(),n=Yi(MT(t.y,s)).toVar(),a=Yi(jT(i)).toVar(),o=Yi(jT(n)).toVar(),u=Yi(PT(IT(XT(r,s),i,n),IT(XT(r.add(Qi(1)),s),i.sub(1),n),IT(XT(r,s.add(Qi(1))),i,n.sub(1)),IT(XT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return GT(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(MT(t.x,r)).toVar(),a=Yi(MT(t.y,s)).toVar(),o=Yi(MT(t.z,i)).toVar(),u=Yi(jT(n)).toVar(),l=Yi(jT(a)).toVar(),d=Yi(jT(o)).toVar(),c=Yi(BT(IT(XT(r,s,i),n,a,o),IT(XT(r.add(Qi(1)),s,i),n.sub(1),a,o),IT(XT(r,s.add(Qi(1)),i),n,a.sub(1),o),IT(XT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),IT(XT(r,s,i.add(Qi(1))),n,a,o.sub(1)),IT(XT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),IT(XT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),IT(XT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return zT(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),QT=yy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(MT(t.x,r)).toVar(),n=Yi(MT(t.y,s)).toVar(),a=Yi(jT(i)).toVar(),o=Yi(jT(n)).toVar(),u=nn(PT(UT(KT(r,s),i,n),UT(KT(r.add(Qi(1)),s),i.sub(1),n),UT(KT(r,s.add(Qi(1))),i,n.sub(1)),UT(KT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return GT(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(MT(t.x,r)).toVar(),a=Yi(MT(t.y,s)).toVar(),o=Yi(MT(t.z,i)).toVar(),u=Yi(jT(n)).toVar(),l=Yi(jT(a)).toVar(),d=Yi(jT(o)).toVar(),c=nn(BT(UT(KT(r,s,i),n,a,o),UT(KT(r.add(Qi(1)),s,i),n.sub(1),a,o),UT(KT(r,s.add(Qi(1)),i),n,a.sub(1),o),UT(KT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),UT(KT(r,s,i.add(Qi(1))),n,a,o.sub(1)),UT(KT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),UT(KT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),UT(KT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return zT(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ZT=yy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(CT(t)).toVar();return qT(XT(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar();return qT(XT(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar();return qT(XT(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar(),n=Qi(CT(t.w)).toVar();return qT(XT(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),JT=yy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(CT(t)).toVar();return nn(qT(XT(r,Qi(0))),qT(XT(r,Qi(1))),qT(XT(r,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar();return nn(qT(XT(r,s,Qi(0))),qT(XT(r,s,Qi(1))),qT(XT(r,s,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar();return nn(qT(XT(r,s,i,Qi(0))),qT(XT(r,s,i,Qi(1))),qT(XT(r,s,i,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar(),n=Qi(CT(t.w)).toVar();return nn(qT(XT(r,s,i,n,Qi(0))),qT(XT(r,s,i,n,Qi(1))),qT(XT(r,s,i,n,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),e_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=Yi(0).toVar(),l=Yi(1).toVar();return Th(a,()=>{u.addAssign(l.mul(YT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),t_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(0).toVar(),l=Yi(1).toVar();return Th(a,()=>{u.addAssign(l.mul(QT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),r_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar();return en(e_(o,a,n,i),e_(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),s_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(t_(o,a,n,i)).toVar(),l=Yi(e_(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i)).toVar();return ln(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),i_=yy([$i(([e,t,r,s,i,n,a])=>{const o=Qi(a).toVar(),u=Yi(n).toVar(),l=Qi(i).toVar(),d=Qi(s).toVar(),c=Qi(r).toVar(),h=Qi(t).toVar(),p=en(e).toVar(),g=nn(JT(en(h.add(d),c.add(l)))).toVar(),m=en(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=en(en(Yi(h),Yi(c)).add(m)).toVar(),y=en(f.sub(p)).toVar();return ji(o.equal(Qi(2)),()=>uo(y.x).add(uo(y.y))),ji(o.equal(Qi(3)),()=>wo(uo(y.x),uo(y.y))),Po(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),$i(([e,t,r,s,i,n,a,o,u])=>{const l=Qi(u).toVar(),d=Yi(o).toVar(),c=Qi(a).toVar(),h=Qi(n).toVar(),p=Qi(i).toVar(),g=Qi(s).toVar(),m=Qi(r).toVar(),f=Qi(t).toVar(),y=nn(e).toVar(),b=nn(JT(nn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=nn(nn(Yi(f),Yi(m),Yi(g)).add(b)).toVar(),T=nn(x.sub(y)).toVar();return ji(l.equal(Qi(2)),()=>uo(T.x).add(uo(T.y)).add(uo(T.z))),ji(l.equal(Qi(3)),()=>wo(uo(T.x),uo(T.y),uo(T.z))),Po(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),n_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=Yi(1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();l.assign(Eo(l,r))})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),a_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=en(1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),o_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=nn(1e6,1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),u_=yy([n_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=Yi(1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Eo(d,n))})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),l_=yy([a_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=en(1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),d_=yy([o_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=nn(1e6,1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),c_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=en(t).toVar(),p=en(r).toVar(),g=en(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(QT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(JT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(d_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(t_(nn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),h_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=nn(t).toVar(),p=nn(r).toVar(),g=nn(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(QT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(JT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(d_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(t_(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),p_=$i(([e])=>{const t=e.y,r=e.z,s=nn().toVar();return ji(t.lessThan(1e-4),()=>{s.assign(nn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(Za(i)).mul(6).toVar();const n=Qi(bo(i)),a=i.sub(Yi(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ji(n.equal(Qi(0)),()=>{s.assign(nn(r,l,o))}).ElseIf(n.equal(Qi(1)),()=>{s.assign(nn(u,r,o))}).ElseIf(n.equal(Qi(2)),()=>{s.assign(nn(o,r,l))}).ElseIf(n.equal(Qi(3)),()=>{s.assign(nn(o,u,r))}).ElseIf(n.equal(Qi(4)),()=>{s.assign(nn(l,o,r))}).Else(()=>{s.assign(nn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),g_=$i(([e])=>{const t=nn(e).toVar(),r=Yi(t.x).toVar(),s=Yi(t.y).toVar(),i=Yi(t.z).toVar(),n=Yi(Eo(r,Eo(s,i))).toVar(),a=Yi(wo(r,wo(s,i))).toVar(),o=Yi(a.sub(n)).toVar(),u=Yi().toVar(),l=Yi().toVar(),d=Yi().toVar();return d.assign(a),ji(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ji(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ji(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ji(u.lessThan(0),()=>{u.addAssign(1)})}),nn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),m_=$i(([e])=>{const t=nn(e).toVar(),r=un(xa(t,nn(.04045))).toVar(),s=nn(t.div(12.92)).toVar(),i=nn(Lo(wo(t.add(nn(.055)),nn(0)).div(1.055),nn(2.4))).toVar();return ko(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),f_=(e,t)=>{e=Yi(e),t=Yi(t);const r=en(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return $o(e.sub(r),e.add(r),t)},y_=(e,t,r,s)=>ko(e,t,r[s].clamp()),b_=(e,t,r,s,i)=>ko(e,t,f_(r,s[i])),x_=$i(([e,t,r])=>{const s=eo(e).toVar(),i=ha(Yi(.5).mul(t.sub(r)),Xl).div(s).toVar(),n=ha(Yi(-.5).mul(t.sub(r)),Xl).div(s).toVar(),a=nn().toVar();a.x=s.x.greaterThan(Yi(0)).select(i.x,n.x),a.y=s.y.greaterThan(Yi(0)).select(i.y,n.y),a.z=s.z.greaterThan(Yi(0)).select(i.z,n.z);const o=Eo(a.x,a.y,a.z).toVar();return Xl.add(s.mul(o)).toVar().sub(r)}),T_=$i(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(pa(r,r).sub(pa(s,s)))),n});var __=Object.freeze({__proto__:null,BRDF_GGX:ag,BRDF_Lambert:Wp,BasicPointShadowFilter:pT,BasicShadowFilter:Kx,Break:_h,Const:lu,Continue:()=>Wu("continue").toStack(),DFGApprox:og,D_GGX:sg,Discard:qu,EPSILON:Ua,F_Schlick:$p,Fn:$i,INFINITY:Oa,If:ji,Loop:Th,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,OnMaterialUpdate:e=>rb(tb.MATERIAL,e),OnObjectUpdate:e=>rb(tb.OBJECT,e),PCFShadowFilter:Yx,PCFSoftShadowFilter:Qx,PI:ka,PI2:Ga,PointShadowFilter:gT,Return:()=>Wu("return").toStack(),Schlick_to_F0:lg,ScriptableNodeResources:tx,ShaderNode:Fi,Stack:Xi,Switch:(...e)=>ai.Switch(...e),TBNViewMatrix:sc,VSMShadowFilter:Zx,V_GGX_SmithCorrelated:tg,Var:uu,VarIntent:du,abs:uo,acesFilmicToneMapping:Gb,acos:ao,add:ca,addMethodChaining:ui,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Wb,all:za,alphaT:Bn,and:va,anisotropy:Ln,anisotropyB:In,anisotropyT:Fn,any:Ha,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),Xi(e)),array:ia,arrayBuffer:e=>Ii(new ii(e,"ArrayBuffer")),asin:no,assign:aa,atan:oo,atan2:Yo,atomicAdd:(e,t)=>Sx(vx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Sx(vx.ATOMIC_AND,e,t),atomicFunc:Sx,atomicLoad:e=>Sx(vx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Sx(vx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Sx(vx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Sx(vx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Sx(vx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Sx(vx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Sx(vx.ATOMIC_XOR,e,t),attenuationColor:jn,attenuationDistance:qn,attribute:Zu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new ib(e,r,s);return mh(i,t,e)},backgroundBlurriness:db,backgroundIntensity:cb,backgroundRotation:hb,batch:ch,bentNormalView:nc,billboarding:Ny,bitAnd:wa,bitNot:Aa,bitOr:Ra,bitXor:Ca,bitangentGeometry:Jd,bitangentLocal:ec,bitangentView:tc,bitangentWorld:rc,bitcast:No,blendBurn:cp,blendColor:mp,blendDodge:hp,blendOverlay:gp,blendScreen:pp,blur:lm,bool:Ji,buffer:dl,bufferAttribute:Mu,bumpMap:cc,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),cp(e)),bvec2:sn,bvec3:un,bvec4:hn,bypass:ku,cache:Uu,call:ua,cameraFar:yl,cameraIndex:ml,cameraNear:fl,cameraNormalMatrix:vl,cameraPosition:Nl,cameraProjectionMatrix:bl,cameraProjectionMatrixInverse:xl,cameraViewMatrix:Tl,cameraWorldMatrix:_l,cbrt:Uo,cdl:Cb,ceil:Ja,checker:ET,cineonToneMapping:Ob,clamp:Go,clearcoat:En,clearcoatNormalView:ld,clearcoatRoughness:wn,code:Xb,color:Ki,colorSpaceToWorking:_u,colorToDirection:e=>Ii(e).mul(2).sub(1),compute:Du,computeKernel:Iu,computeSkinning:(e,t=null)=>{const r=new yh(e);return r.positionNode=mh(new L(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(th).toVar(),r.skinIndexNode=mh(new L(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(th).toVar(),r.skinWeightNode=mh(new L(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(th).toVar(),r.bindMatrixNode=ra(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=ra(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=dl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Ii(r)},context:ru,convert:yn,convertColorSpace:(e,t,r)=>Ii(new xu(Ii(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Yy(e,...t),cos:so,cross:Bo,cubeTexture:Ad,cubeTextureBase:wd,cubeToUV:hT,dFdx:go,dFdy:mo,dashSize:kn,debug:Yu,decrement:Ia,decrementBefore:La,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Bi,degrees:Wa,deltaTime:xy,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),ox(e,ax(t))},densityFogFactor:ax,depth:rp,depthPass:(e,t,r)=>Ii(new Ib(Ib.DEPTH,e,t,r)),determinant:_o,difference:Mo,diffuseColor:_n,directPointLight:NT,directionToColor:Rp,directionToFaceDirection:td,dispersion:Xn,distance:Co,div:ga,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),hp(e)),dot:Po,drawIndex:nh,dynamicBufferAttribute:Pu,element:fn,emissive:vn,equal:fa,equals:So,equirectUV:Pp,exp:qa,exp2:ja,expression:Wu,faceDirection:ed,faceForward:Wo,faceforward:Qo,float:Yi,floor:Za,fog:ox,fract:to,frameGroup:Zn,frameId:Ty,frontFacing:Jl,fwidth:xo,gain:(e,t)=>e.lessThan(.5)?cy(e.mul(2),t).div(2):ha(1,cy(pa(ha(1,e),2),t).div(2)),gapSize:Gn,getConstNodeType:Li,getCurrentStack:qi,getDirection:nm,getDistanceAttenuation:vT,getGeometryRoughness:Jp,getNormalFromDepth:Jy,getParallaxCorrectNormal:x_,getRoughness:eg,getScreenPosition:Zy,getShIrradianceAt:T_,getShadowMaterial:eT,getShadowRenderObjectFunction:sT,getTextureIndex:oy,getViewPosition:Qy,globalId:fx,glsl:(e,t)=>Xb(e,t,"glsl"),glslFn:(e,t)=>Yb(e,t,"glsl"),grayscale:Sb,greaterThan:xa,greaterThanEqual:_a,hash:dy,highpModelNormalViewMatrix:$l,highpModelViewMatrix:Hl,hue:Ab,increment:Fa,incrementBefore:Ba,instance:oh,instanceIndex:th,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new sb(e,r,s);return mh(i,t,e)},instancedBufferAttribute:Bu,instancedDynamicBufferAttribute:Lu,instancedMesh:lh,int:Qi,inverse:vo,inverseSqrt:Qa,inversesqrt:Zo,invocationLocalIndex:ih,invocationSubgroupIndex:sh,ior:Hn,iridescence:Cn,iridescenceIOR:Mn,iridescenceThickness:Pn,ivec2:tn,ivec3:an,ivec4:dn,js:(e,t)=>Xb(e,t,"js"),label:nu,length:co,lengthSq:Oo,lessThan:ba,lessThanEqual:Ta,lightPosition:Cx,lightProjectionUV:Rx,lightShadowMatrix:Ax,lightTargetDirection:Bx,lightTargetPosition:Mx,lightViewPosition:Px,lightingContext:Mh,lights:(e=[])=>Ii(new Dx).setLights(e),linearDepth:sp,linearToneMapping:Vb,localId:yx,log:Xa,log2:Ka,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Xa(r.div(t)));return Yi(Math.E).pow(s).mul(t).negate()},luminance:Rb,mat2:pn,mat3:gn,mat4:mn,matcapUV:Ym,materialAO:Yc,materialAlphaTest:gc,materialAnisotropy:Lc,materialAnisotropyVector:Qc,materialAttenuationColor:Gc,materialAttenuationDistance:kc,materialClearcoat:Ac,materialClearcoatNormal:Cc,materialClearcoatRoughness:Rc,materialColor:mc,materialDispersion:Xc,materialEmissive:yc,materialEnvIntensity:bd,materialEnvRotation:xd,materialIOR:Oc,materialIridescence:Fc,materialIridescenceIOR:Ic,materialIridescenceThickness:Dc,materialLightMap:Kc,materialLineDashOffset:qc,materialLineDashSize:Hc,materialLineGapSize:$c,materialLineScale:zc,materialLineWidth:Wc,materialMetalness:Ec,materialNormal:wc,materialOpacity:bc,materialPointSize:jc,materialReference:Ld,materialReflectivity:Nc,materialRefractionRatio:yd,materialRotation:Mc,materialRoughness:Sc,materialSheen:Pc,materialSheenRoughness:Bc,materialShininess:fc,materialSpecular:xc,materialSpecularColor:_c,materialSpecularIntensity:Tc,materialSpecularStrength:vc,materialThickness:Uc,materialTransmission:Vc,max:wo,maxMipLevel:sl,mediumpModelViewMatrix:zl,metalness:Sn,min:Eo,mix:ko,mixElement:jo,mod:ma,modInt:Da,modelDirection:Ll,modelNormalMatrix:Ol,modelPosition:Il,modelRadius:Ul,modelScale:Dl,modelViewMatrix:Gl,modelViewPosition:Vl,modelViewProjection:Zc,modelWorldMatrix:Fl,modelWorldMatrixInverse:kl,morphReference:wh,mrt:ly,mul:pa,mx_aastep:f_,mx_add:(e,t=Yi(0))=>ca(e,t),mx_atan2:(e=Yi(0),t=Yi(1))=>oo(e,t),mx_cell_noise_float:(e=Ju())=>ZT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Yi(e).sub(r).mul(t).add(r),mx_divide:(e,t=Yi(1))=>ga(e,t),mx_fractal_noise_float:(e=Ju(),t=3,r=2,s=.5,i=1)=>e_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Ju(),t=3,r=2,s=.5,i=1)=>r_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Ju(),t=3,r=2,s=.5,i=1)=>t_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Ju(),t=3,r=2,s=.5,i=1)=>s_(e,Qi(t),r,s).mul(i),mx_frame:()=>Ty,mx_heighttonormal:(e,t)=>(e=nn(e),t=Yi(t),cc(e,t)),mx_hsvtorgb:p_,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=Yi(1))=>ha(t,e),mx_modulo:(e,t=Yi(1))=>ma(e,t),mx_multiply:(e,t=Yi(1))=>pa(e,t),mx_noise_float:(e=Ju(),t=1,r=0)=>YT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Ju(),t=1,r=0)=>QT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Ju(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ln(QT(e),YT(e.add(en(19,73)))).mul(t).add(r)},mx_place2d:(e,t=en(.5,.5),r=en(1,1),s=Yi(0),i=en(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=en(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=Yi(1))=>Lo(e,t),mx_ramp4:(e,t,r,s,i=Ju())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ko(e,t,n),u=ko(r,s,n);return ko(o,u,a)},mx_ramplr:(e,t,r=Ju())=>y_(e,t,r,"x"),mx_ramptb:(e,t,r=Ju())=>y_(e,t,r,"y"),mx_rgbtohsv:g_,mx_rotate2d:(e,t)=>{e=en(e);const r=(t=Yi(t)).mul(Math.PI/180);return ef(e,r)},mx_rotate3d:(e,t,r)=>{e=nn(e),t=Yi(t),r=nn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=Yi(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=Yi(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Ju())=>b_(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Ju())=>b_(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:m_,mx_subtract:(e,t=Yi(0))=>ha(e,t),mx_timer:()=>by,mx_transform_uv:(e=1,t=0,r=Ju())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Ju(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>c_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Ju(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>h_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Ju(),t=1)=>u_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec2:(e=Ju(),t=1)=>l_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec3:(e=Ju(),t=1)=>d_(e.convert("vec2|vec3"),t,Qi(1)),negate:ho,neutralToneMapping:qb,nodeArray:Ui,nodeImmutable:ki,nodeObject:Ii,nodeObjectIntent:Di,nodeObjects:Vi,nodeProxy:Oi,nodeProxyIntent:Gi,normalFlat:id,normalGeometry:rd,normalLocal:sd,normalMap:oc,normalView:od,normalViewGeometry:nd,normalWorld:ud,normalWorldGeometry:ad,normalize:eo,not:Sa,notEqual:ya,numWorkgroups:gx,objectDirection:wl,objectGroup:ea,objectPosition:Rl,objectRadius:Pl,objectScale:Cl,objectViewPosition:Ml,objectWorldMatrix:Al,oneMinus:po,or:Na,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=by)=>e.fract(),oscSine:(e=by)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=by)=>e.fract().round(),oscTriangle:(e=by)=>e.add(.5).fract().mul(2).sub(1).abs(),output:On,outputStruct:ay,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),gp(e)),overloadingFn:yy,parabola:cy,parallaxDirection:ic,parallaxUV:(e,t)=>e.sub(ic.mul(t)),parameter:(e,t)=>Ii(new ey(e,t)),pass:(e,t,r)=>Ii(new Ib(Ib.COLOR,e,t,r)),passTexture:(e,t)=>Ii(new Lb(e,t)),pcurve:(e,t,r)=>Lo(ga(Lo(e,t),ca(Lo(e,t),Lo(ha(1,e),r))),1/t),perspectiveDepthToViewZ:Jh,pmremTexture:Im,pointShadow:TT,pointUV:ab,pointWidth:zn,positionGeometry:Wl,positionLocal:ql,positionPrevious:jl,positionView:Yl,positionViewDirection:Ql,positionWorld:Xl,positionWorldDirection:Kl,posterize:Pb,pow:Lo,pow2:Fo,pow3:Io,pow4:Do,premultiplyAlpha:fp,property:xn,radians:$a,rand:qo,range:cx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),ox(e,nx(t,r))},rangeFogFactor:nx,reciprocal:yo,reference:Md,referenceBuffer:Pd,reflect:Ro,reflectVector:vd,reflectView:Td,reflector:e=>Ii(new zy(e)),refract:Ho,refractVector:Nd,refractView:_d,reinhardToneMapping:Ub,remap:zu,remapClamp:Hu,renderGroup:Jn,renderOutput:Xu,rendererReference:Eu,rotate:ef,rotateUV:_y,roughness:Nn,round:fo,rtt:Yy,sRGBTransferEOTF:fu,sRGBTransferOETF:yu,sample:e=>Ii(new eb(e)),sampler:e=>(!0===e.isNode?e:ol(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:ol(e)).convert("samplerComparison"),saturate:zo,saturation:Eb,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),pp(e)),screenCoordinate:Vh,screenSize:Dh,screenUV:Ih,scriptable:sx,scriptableValue:Zb,select:eu,setCurrentStack:Wi,setName:iu,shaderStages:Hs,shadow:dT,shadowPositionWorld:Ux,shapeCircle:wT,sharedUniformGroup:Qn,sheen:An,sheenRoughness:Rn,shiftLeft:Ma,shiftRight:Pa,shininess:Un,sign:lo,sin:ro,sinc:(e,t)=>ro(ka.mul(t.mul(e).sub(1))).div(ka.mul(t.mul(e).sub(1))),skinning:bh,smoothstep:$o,smoothstepElement:Xo,specularColor:Dn,specularF90:Vn,spherizeUV:vy,split:(e,t)=>Ii(new Js(Ii(e),t)),spritesheetUV:wy,sqrt:Ya,stack:ry,step:Ao,stepElement:Ko,storage:mh,storageBarrier:()=>xx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),mh(e,t,r).setPBO(!0)),storageTexture:gb,string:(e="")=>Ii(new ii(e,"string")),struct:(e,t=null)=>{const r=new sy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;exx("texture").toStack(),textureBicubic:Cg,textureBicubicLevel:Rg,textureCubeUV:am,textureLoad:ul,textureSize:tl,textureStore:(e,t,r)=>{const s=gb(e,t,r);return null!==r&&s.toStack(),s},thickness:Wn,time:by,toneMapping:Au,toneMappingExposure:Ru,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ii(new Db(t,r,Ii(s),Ii(i),Ii(n))),transformDirection:Vo,transformNormal:dd,transformNormalToView:cd,transformedClearcoatNormalView:gd,transformedNormalView:hd,transformedNormalWorld:pd,transmission:$n,transpose:To,triNoise3D:gy,triplanarTexture:(...e)=>Ay(...e),triplanarTextures:Ay,trunc:bo,uint:Zi,uniform:ra,uniformArray:pl,uniformCubeTexture:(e=Sd)=>wd(e),uniformFlow:su,uniformGroup:Yn,uniformTexture:(e=il)=>ol(e),unpremultiplyAlpha:yp,userData:(e,t,r)=>Ii(new bb(e,t,r)),uv:Ju,uvec2:rn,uvec3:on,uvec4:cn,varying:gu,varyingProperty:Tn,vec2:en,vec3:nn,vec4:ln,vectorComponents:$s,velocity:Nb,vertexColor:dp,vertexIndex:eh,vertexStage:mu,vibrance:wb,viewZToLogarithmicDepth:ep,viewZToOrthographicDepth:Qh,viewZToPerspectiveDepth:Zh,viewport:Uh,viewportCoordinate:kh,viewportDepthTexture:Kh,viewportLinearDepth:ip,viewportMipTexture:qh,viewportResolution:zh,viewportSafeUV:Sy,viewportSharedTexture:Ep,viewportSize:Oh,viewportTexture:Wh,viewportUV:Gh,wgsl:(e,t)=>Xb(e,t,"wgsl"),wgslFn:(e,t)=>Yb(e,t,"wgsl"),workgroupArray:(e,t)=>Ii(new _x("Workgroup",e,t)),workgroupBarrier:()=>xx("workgroup").toStack(),workgroupId:mx,workingToColorSpace:Tu,xor:Ea});const v_=new Jf;class N_ extends Tf{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(v_),v_.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(v_),v_.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;v_.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=ru(ln(u).mul(cb),{getUV:()=>hb.mul(ad),getTextureLevel:()=>db});let h=Zc;h=h.setZ(h.w);const p=new bp;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=S,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new X(new Oe(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=ln(u).mul(cb),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?v_.set(0,0,0,1):"alpha-blend"===a&&v_.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=v_.r,m.g=v_.g,m.b=v_.b,m.a=v_.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let S_=0;class E_{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=S_++}}class w_{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new E_(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class A_{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class R_{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class C_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class M_ extends C_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class P_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let B_=0;class L_{constructor(e=null){this.id=B_++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class F_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class I_{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class D_ extends I_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class V_ extends I_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class U_ extends I_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class O_ extends I_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class k_ extends I_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class G_ extends I_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class z_ extends I_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class H_ extends I_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class $_ extends D_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class W_ extends V_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class q_ extends U_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class j_ extends O_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class X_ extends k_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class K_ extends G_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Y_ extends z_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Q_ extends H_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Z_=new WeakMap,J_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),ev=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class tv{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=ry(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new L_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.currentStack=null,this.subBuildFn=null}getBindGroupsCache(){let e=Z_.get(this.renderer);return void 0===e&&(e=new mf,Z_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ue(e,t,r)}createCubeRenderTarget(e,t){return new Bp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new E_(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new E_(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Hs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${ev(n.r)}, ${ev(n.g)}, ${ev(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new A_(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===_)return"int";if(t===T)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=ws(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return J_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=ry(this.stack),this.stacks.push(qi()||this.stack),Wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Wi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new A_("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new F_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new R_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new C_(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new M_(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new P_("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Kb,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ey(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new L_,this.stack=ry();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new bp),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Hs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new $_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new W_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new q_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new j_(e);if("color"===t)return new X_(e);if("mat2"===t)return new K_(e);if("mat3"===t)return new Y_(e);if("mat4"===t)return new Q_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${He} - Node System\n`}}class rv{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class sv{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}sv.isNodeFunctionInput=!0;class iv extends _T{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Bx(this.light),lightColor:e}}}const nv=new a,av=new a;let ov=null;class uv extends _T{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ra(new r).setGroup(Jn),this.halfWidth=ra(new r).setGroup(Jn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;av.identity(),nv.copy(t.matrixWorld),nv.premultiply(r),av.extractRotation(nv),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(av),this.halfHeight.value.applyMatrix4(av)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=ol(ov.LTC_FLOAT_1),r=ol(ov.LTC_FLOAT_2)):(t=ol(ov.LTC_HALF_1),r=ol(ov.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Px(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){ov=e}}class lv extends _T{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ra(0).setGroup(Jn),this.penumbraCosNode=ra(0).setGroup(Jn),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(0).setGroup(Jn),this.colorNode=ra(this.color).setGroup(Jn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return $o(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=Rx(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Bx(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=vT({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=ol(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class dv extends lv{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=ol(r,en(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const cv=$i(([e,t])=>{const r=e.abs().sub(t);return co(wo(r,0)).add(Eo(wo(r.x,r.y),0))});class hv extends lv{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=Yi(0),r=this.penumbraCosNode,s=Ax(this.light).mul(e.context.positionWorld||Xl);return ji(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=cv(e.xy.sub(en(.5)),en(.5)),n=ga(-1,ha(1,ao(r)).sub(1));t.assign(zo(i.mul(-2).mul(n)))}),t}}class pv extends _T{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class gv extends _T{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Cx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ra(new e).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=ud.dot(s).mul(.5).add(.5),n=ko(r,t,i);e.context.irradiance.addAssign(n)}}class mv extends _T{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=pl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=T_(ud,this.lightProbe);e.context.irradiance.addAssign(t)}}class fv{parseFunction(){console.warn("Abstract function.")}}class yv{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}yv.isNodeFunction=!0;const bv=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,xv=/[a-z_0-9]+/gi,Tv="#pragma main";class _v extends yv{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(Tv),r=-1!==t?e.slice(t+12):e,s=r.match(bv);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=xv.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===Z||r.mapping===J||r.mapping===he){if(e.backgroundBlurriness>0||r.mapping===he)return Im(r);{let e;return e=!0===r.isCubeTexture?Ad(r):ol(r),Vp(e)}}if(!0===r.isTexture)return ol(r,Ih.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=Md("color","color",r).setGroup(Jn),t=Md("density","float",r).setGroup(Jn);return ox(e,ax(t))}if(r.isFog){const e=Md("color","color",r).setGroup(Jn),t=Md("near","float",r).setGroup(Jn),s=Md("far","float",r).setGroup(Jn);return ox(e,nx(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?Ad(r):!0===r.isTexture?ol(r):void console.error("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return Nv.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?yb(e,nn(Ih,gl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):ol(e,Ih).renderOutput(t.toneMapping,t.currentColorSpace);return Nv.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new rv,this.nodeBuilderCache=new Map,this.cacheLib={}}}const Av=new Me;class Rv{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new Dv(i.framebufferWidth,i.framebufferHeight,{format:de,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;kv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function $v(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function Wv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new wv(this,r),this._animation=new gf(this._nodes,this.info),this._attributes=new wf(r),this._background=new N_(this,this._nodes),this._geometries=new Cf(this._attributes,this.info),this._textures=new Zf(this,r,this.info),this._pipelines=new Df(r,this._nodes),this._bindings=new Vf(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new xf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Hf(this.lighting),this._bundles=new Pv,this._renderContexts=new Yf,this._animation.start(),this._initialized=!0,e(this)})),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:qv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new Rv),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)}),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Hl,this.overrideNodes.modelNormalViewMatrix=$l):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Hl&&this.overrideNodes.modelNormalViewMatrix===$l}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=x,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(Xv),p.scissorValue.copy(y).multiplyScalar(b).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(Xv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Rv),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Yv:Kv;t.isArrayCamera||(Qv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(Qv,t.coordinateSystem,t.reversedDepth));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:E,transparent:w,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_setXRLayerSize(e,t){this._width=e,this._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:c.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()}),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls;const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.delete(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Zv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=Zv.copy(t).floor()}else t=Zv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?Yv:Kv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Zv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(Qv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Zv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?Yv:Kv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Zv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(Qv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=S;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=qe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=E}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===E&&!1===i.forceSinglePass?(i.side=S,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=qe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=E):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class eN{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class tN extends eN{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Ef-e%Ef)%Ef;var e}get buffer(){return this._buffer}update(){return!0}}class rN extends tN{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let sN=0;class iN extends rN{constructor(e,t){super("UniformBuffer_"+sN++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class nN extends rN{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.texture=null},this.texture=t,this.version=t?t.version:0,this.generation=null,this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onDisposeTexture),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onDisposeTexture))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}}let lN=0;class dN extends uN{constructor(e,t){super(e,t),this.id=lN++,this.store=!1,this.isSampledTexture=!0}}class cN extends dN{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class hN extends cN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class pN extends cN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const gN={textureDimensions:"textureSize",equals:"equal"},mN={low:"lowp",medium:"mediump",high:"highp"},fN={swizzleAssign:!0,storageBuffer:!1},yN={perspective:"smooth",linear:"noperspective"},bN={centroid:"centroid"},xN="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class TN extends tv{constructor(e,t){super(e,t,new vv),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==b}getMethod(e){return gN[e]||e}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?it:nt;2===s?n=i?lt:Ve:3===s?n=i?dt:ct:4===s&&(n=i?ht:de);const a={Float32Array:I,Uint8Array:Ce,Uint16Array:ut,Uint32Array:T,Int8Array:ot,Int16Array:at,Int32Array:_,Uint8ClampedArray:Ce},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=mN[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==_){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${yN[s.interpolationType]||s.interpolationType} ${bN[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${yN[e.interpolationType]||e.interpolationType} ${bN[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=fN[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}fN[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new cN(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new hN(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new pN(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new iN(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new oN(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let _N=null,vN=null;class NN{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void pt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void pt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return _N=_N||new t,this.renderer.getDrawingBufferSize(_N)}setScissorTest(){}getClearColor(){const e=this.renderer;return vN=vN||new Jf,e.getClearColor(vN),vN.getRGB(vN),vN}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:gt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${He} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let SN,EN,wN=0;class AN{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class RN{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===_,id:wN++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new AN(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let PN,BN,LN,FN=!1;class IN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===FN&&(this._init(),FN=!0)}_init(){const e=this.gl;PN={[Nr]:e.REPEAT,[vr]:e.CLAMP_TO_EDGE,[_r]:e.MIRRORED_REPEAT},BN={[v]:e.NEAREST,[Sr]:e.NEAREST_MIPMAP_NEAREST,[Ge]:e.NEAREST_MIPMAP_LINEAR,[Y]:e.LINEAR,[ke]:e.LINEAR_MIPMAP_NEAREST,[V]:e.LINEAR_MIPMAP_LINEAR},LN={[Pr]:e.NEVER,[Mr]:e.ALWAYS,[De]:e.LESS,[Cr]:e.LEQUAL,[Rr]:e.EQUAL,[Ar]:e.GEQUAL,[wr]:e.GREATER,[Er]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=c.getPrimaries(c.workingColorSpace),a=t.colorSpace===b?null:c.getPrimaries(t.colorSpace),o=t.colorSpace===b||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,PN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,PN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,PN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,BN[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===Y&&u?V:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,BN[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,LN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===v)return;if(t.minFilter!==Ge&&t.minFilter!==V)return;if(t.type===I&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}function DN(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class VN{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class UN{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const ON={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class kN{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce((e,t)=>e+t,0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class HN extends NN{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new VN(this),this.capabilities=new UN(this),this.attributeUtils=new RN(this),this.textureUtils=new IN(this),this.bufferRenderer=new kN(this),this.state=new CN(this),this.utils=new MN(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new zN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(o)){const i=s.framebuffers[e.getCacheKey()];let n=t.COLOR_BUFFER_BIT;o.resolveDepthBuffer&&(o.depthBuffer&&(n|=t.DEPTH_BUFFER_BIT),o.stencilBuffer&&o.resolveStencilBuffer&&(n|=t.STENCIL_BUFFER_BIT));const a=s.msaaFrameBuffer,u=s.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i),d)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(pt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):pt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eON[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=qf(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,0)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const $N="point-list",WN="line-list",qN="line-strip",jN="triangle-list",XN="triangle-strip",KN="never",YN="less",QN="equal",ZN="less-equal",JN="greater",eS="not-equal",tS="greater-equal",rS="always",sS="store",iS="load",nS="clear",aS="ccw",oS="none",uS="front",lS="back",dS="uint16",cS="uint32",hS="r8unorm",pS="r8snorm",gS="r8uint",mS="r8sint",fS="r16uint",yS="r16sint",bS="r16float",xS="rg8unorm",TS="rg8snorm",_S="rg8uint",vS="rg8sint",NS="r32uint",SS="r32sint",ES="r32float",wS="rg16uint",AS="rg16sint",RS="rg16float",CS="rgba8unorm",MS="rgba8unorm-srgb",PS="rgba8snorm",BS="rgba8uint",LS="rgba8sint",FS="bgra8unorm",IS="bgra8unorm-srgb",DS="rgb9e5ufloat",VS="rgb10a2unorm",US="rgb10a2unorm",OS="rg32uint",kS="rg32sint",GS="rg32float",zS="rgba16uint",HS="rgba16sint",$S="rgba16float",WS="rgba32uint",qS="rgba32sint",jS="rgba32float",XS="depth16unorm",KS="depth24plus",YS="depth24plus-stencil8",QS="depth32float",ZS="depth32float-stencil8",JS="bc1-rgba-unorm",eE="bc1-rgba-unorm-srgb",tE="bc2-rgba-unorm",rE="bc2-rgba-unorm-srgb",sE="bc3-rgba-unorm",iE="bc3-rgba-unorm-srgb",nE="bc4-r-unorm",aE="bc4-r-snorm",oE="bc5-rg-unorm",uE="bc5-rg-snorm",lE="bc6h-rgb-ufloat",dE="bc6h-rgb-float",cE="bc7-rgba-unorm",hE="bc7-rgba-srgb",pE="etc2-rgb8unorm",gE="etc2-rgb8unorm-srgb",mE="etc2-rgb8a1unorm",fE="etc2-rgb8a1unorm-srgb",yE="etc2-rgba8unorm",bE="etc2-rgba8unorm-srgb",xE="eac-r11unorm",TE="eac-r11snorm",_E="eac-rg11unorm",vE="eac-rg11snorm",NE="astc-4x4-unorm",SE="astc-4x4-unorm-srgb",EE="astc-5x4-unorm",wE="astc-5x4-unorm-srgb",AE="astc-5x5-unorm",RE="astc-5x5-unorm-srgb",CE="astc-6x5-unorm",ME="astc-6x5-unorm-srgb",PE="astc-6x6-unorm",BE="astc-6x6-unorm-srgb",LE="astc-8x5-unorm",FE="astc-8x5-unorm-srgb",IE="astc-8x6-unorm",DE="astc-8x6-unorm-srgb",VE="astc-8x8-unorm",UE="astc-8x8-unorm-srgb",OE="astc-10x5-unorm",kE="astc-10x5-unorm-srgb",GE="astc-10x6-unorm",zE="astc-10x6-unorm-srgb",HE="astc-10x8-unorm",$E="astc-10x8-unorm-srgb",WE="astc-10x10-unorm",qE="astc-10x10-unorm-srgb",jE="astc-12x10-unorm",XE="astc-12x10-unorm-srgb",KE="astc-12x12-unorm",YE="astc-12x12-unorm-srgb",QE="clamp-to-edge",ZE="repeat",JE="mirror-repeat",ew="linear",tw="nearest",rw="zero",sw="one",iw="src",nw="one-minus-src",aw="src-alpha",ow="one-minus-src-alpha",uw="dst",lw="one-minus-dst",dw="dst-alpha",cw="one-minus-dst-alpha",hw="src-alpha-saturated",pw="constant",gw="one-minus-constant",mw="add",fw="subtract",yw="reverse-subtract",bw="min",xw="max",Tw=0,_w=15,vw="keep",Nw="zero",Sw="replace",Ew="invert",ww="increment-clamp",Aw="decrement-clamp",Rw="increment-wrap",Cw="decrement-wrap",Mw="storage",Pw="read-only-storage",Bw="write-only",Lw="read-only",Fw="read-write",Iw="non-filtering",Dw="comparison",Vw="float",Uw="unfilterable-float",Ow="depth",kw="sint",Gw="uint",zw="2d",Hw="3d",$w="2d",Ww="2d-array",qw="cube",jw="3d",Xw="all",Kw="vertex",Yw="instance",Qw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"};class Zw extends uN{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class Jw extends tN{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let eA=0;class tA extends Jw{constructor(e,t){super("StorageBuffer_"+eA++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class rA extends Tf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:ew}),this.flipYSampler=e.createSampler({minFilter:tw}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:XN,stripIndexFormat:cS},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:XN,stripIndexFormat:cS},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:nS,storeOp:sS,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,uA=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,lA={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class dA extends yv{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(oA);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=uA.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class cA extends fv{parseFunction(e){return new dA(e)}}const hA="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},pA={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},gA={[Nr]:"repeat",[vr]:"clamp",[_r]:"mirror"},mA={vertex:hA?hA.VERTEX:1,fragment:hA?hA.FRAGMENT:2,compute:hA?hA.COMPUTE:4},fA={instance:!0,swizzleAssign:!1,storageBuffer:!0},yA={"^^":"tsl_xor"},bA={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},xA={},TA={tsl_xor:new jb("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new jb("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new jb("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new jb("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new jb("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new jb("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new jb("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new jb("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new jb("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new jb("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new jb("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new jb("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new jb("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},_A={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(TA.pow_float=new jb("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),TA.pow_vec2=new jb("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[TA.pow_float]),TA.pow_vec3=new jb("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[TA.pow_float]),TA.pow_vec4=new jb("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[TA.pow_float]),_A.pow_float="tsl_pow_float",_A.pow_vec2="tsl_pow_vec2",_A.pow_vec3="tsl_pow_vec3",_A.pow_vec4="tsl_pow_vec4");let vA="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(vA+="diagnostic( off, derivative_uniformity );\n");class NA extends tv{constructor(e,t){super(e,t,new cA),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${gA[e.wrapS]}S_${gA[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=xA[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Nr?(s.push(TA.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===vr?(s.push(TA.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===_r?(s.push(TA.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",xA[t]=r=new jb(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new au(new $u(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new au(new $u(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new au(new $u("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===I||!1===this.isSampleCompare(e)&&e.minFilter===v&&e.magFilter===v||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return!0===e.isDepthTexture&&!0===e.isArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=yA[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(console.warn("WebGPURenderer: Atomic operations are only supported in compute shaders."),ks.READ_WRITE):ks.READ_ONLY:e.access}getStorageAccess(e,t){return pA[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new pN(i.name,i.node,o,n):new cN(i.name,i.node,o,n):"cubeTexture"===t?s=new hN(i.name,i.node,o,n):"texture3D"===t&&(s=new pN(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(mA[r]),!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Zw(`${i.name}_sampler`,i.node,o);e.setVisibility(mA[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?iN:tA)(e,o);n.setVisibility(mA[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new oN(u,o),s.setVisibility(mA[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=aA(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return bA[e]||e}isAvailable(e){let t=fA[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),fA[e]=t),t}_getWGSLMethod(e){return void 0!==TA[e]&&this._include(e),_A[e]}_include(e){const t=TA[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${vA}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class SA{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=YS:e.depth&&(t=KS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?$N:e.isLineSegments||e.isMesh&&!0===t.wireframe?WN:e.isLine?qN:e.isMesh?jN:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return FS;if(e===ce)return $S;throw new Error("Unsupported outputType")}}const EA=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&EA.set(Float16Array,["float16"]);const wA=new Map([[ze,["float16"]]]),AA=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class RA{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Uw)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=Uw:s.sampleType=Ow;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===_?s.sampleType=kw:e===T?s.sampleType=Gw:e===I&&(this.backend.hasFeature("float32-filterable")?s.sampleType=Vw:s.sampleType=Uw)}r.isSampledCubeTexture?s.viewDimension=qw:r.texture.isArrayTexture||r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=Ww:r.isSampledTexture3D&&(s.viewDimension=jw),e.texture=s}else if(r.isSampler){const s={};r.texture.isDepthTexture&&(null!==r.texture.compareFunction?s.type=Dw:t.compatibilityMode&&(s.type=Iw)),e.sampler=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount;let s=`view-${e.texture.width}-${e.texture.height}`;if(e.texture.depthOrArrayLayers>1&&(s+=`-${e.texture.depthOrArrayLayers}`),s+=`-${r}`,a=e[s],void 0===a){const i=Xw;let n;n=t.isSampledCubeTexture?qw:t.isSampledTexture3D?jw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Ww:$w,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class MA{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;s.blending===H||s.blending===k&&!1===s.transparent||(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise(e=>{l.createRenderPipelineAsync(S).then(t=>{c.pipeline=t,e()})});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===je){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:mw},r={srcFactor:i,dstFactor:n,operation:mw}};if(e.premultipliedAlpha)switch(s){case k:i(sw,ow,sw,ow);break;case Bt:i(sw,sw,sw,sw);break;case Pt:i(rw,nw,rw,sw);break;case Mt:i(uw,ow,rw,sw)}else switch(s){case k:i(aw,ow,sw,ow);break;case Bt:i(aw,sw,sw,sw);break;case Pt:console.error("THREE.WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Mt:console.error("THREE.WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=rw;break;case wt:t=sw;break;case Et:t=iw;break;case Tt:t=nw;break;case St:t=aw;break;case xt:t=ow;break;case vt:t=uw;break;case bt:t=lw;break;case _t:t=dw;break;case yt:t=cw;break;case Nt:t=hw;break;case 211:t=pw;break;case 212:t=gw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case kr:t=KN;break;case Or:t=rS;break;case Ur:t=YN;break;case Vr:t=ZN;break;case Dr:t=QN;break;case Ir:t=tS;break;case Fr:t=JN;break;case Lr:t=eS;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=vw;break;case jr:t=Nw;break;case qr:t=Sw;break;case Wr:t=Ew;break;case $r:t=ww;break;case Hr:t=Aw;break;case zr:t=Rw;break;case Gr:t=Cw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=mw;break;case ft:t=fw;break;case mt:t=yw;break;case Yr:t=bw;break;case Kr:t=xw;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?dS:cS),r.side){case qe:s.frontFace=aS,s.cullMode=lS;break;case S:s.frontFace=aS,s.cullMode=uS;break;case E:s.frontFace=aS,s.cullMode=oS;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?_w:Tw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=rS;else{const r=e.depthFunc;switch(r){case kt:t=KN;break;case Ot:t=rS;break;case Ut:t=YN;break;case Vt:t=ZN;break;case Dt:t=QN;break;case It:t=tS;break;case Ft:t=JN;break;case Lt:t=eS;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class PA extends GN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class BA extends NN{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new SA(this),this.attributeUtils=new RA(this),this.bindingUtils=new CA(this),this.pipelineUtils=new MA(this),this.textureUtils=new nA(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Qw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)});const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Qw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:iS}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea&&(u[0]=Math.min(i,a),u[1]=Math.ceil(i/a)),n.dispatchSize=u}u=n.dispatchSize}else u=i;a.dispatchWorkgroups(u[0],u[1]||1,u[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{this.pipelineUtils.setPipeline(t,u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&pt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new HN(e)));super(new t(e),e),this.library=new IA,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class VA extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class UA{constructor(e,t=ln(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new bp;r.name="PostProcessing",this._quadMesh=new jy(r),this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=Xu(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}}class OA extends x{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class kA extends x{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=Y,this.minFilter=Y,this.wrapR=vr,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class GA extends x{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class zA extends ib{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class HA extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Yi()):Ii(new this.nodes[e])}}class $A extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class WA extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new HA;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new $A;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t { + let value; + if ( target[ property ] === undefined ) { - return target[ index ++ ]; + value = target[ index ++ ]; } else { - return Reflect.get( target, property, receiver ); + value = Reflect.get( target, property, receiver ); } + return value; + } + } ); } + const secureNodeBuilder = new Proxy( builder, { + + get: ( target, property, receiver ) => { + + let value; + + if ( Symbol.iterator === property ) { + + value = function* () { + + yield undefined; + + }; + + } else { + + value = Reflect.get( target, property, receiver ); + + } + + return value; + + } + + } ); + const jsFunc = shaderNode.jsFunc; - const outputNode = inputs !== null || jsFunc.length > 1 ? jsFunc( inputs || [], builder ) : jsFunc( builder ); + const outputNode = inputs !== null || jsFunc.length > 1 ? jsFunc( inputs || [], secureNodeBuilder ) : jsFunc( secureNodeBuilder ); result = nodeObject( outputNode ); @@ -3732,6 +3774,18 @@ const ConvertType = function ( type, cacheMap = null ) { return ( ...params ) => { + for ( const param of params ) { + + if ( param === undefined ) { + + console.error( `THREE.TSL: Invalid parameter for the type "${ type }".` ); + + return nodeObject( new ConstNode( 0, type ) ); + + } + + } + if ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => { const paramType = typeof param; @@ -3913,7 +3967,7 @@ class FnNode extends Node { const type = this.getNodeType( builder ); - console.warn( 'THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' ); + console.error( 'THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' ); return builder.generateConst( type ); @@ -4780,16 +4834,24 @@ class UniformNode extends InputNode { * * @tsl * @function - * @param {any} arg1 - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color, texture). - * @param {string} [arg2] - The node type. If no explicit type is defined, the node tries to derive the type from its value. + * @param {any|string} value - The value of this uniform or your type. Usually a JS primitive or three.js object (vector, matrix, color, texture). + * @param {string} [type] - The node type. If no explicit type is defined, the node tries to derive the type from its value. * @returns {UniformNode} */ -const uniform = ( arg1, arg2 ) => { +const uniform = ( value, type ) => { + + const nodeType = getConstNodeType( type || value ); + + if ( nodeType === value ) { + + // if the value is a type but no having a value - const nodeType = getConstNodeType( arg2 || arg1 ); + value = getValueFromType( nodeType ); + + } // @TODO: get ConstNode from .traverse() in the future - const value = ( arg1 && arg1.isNode === true ) ? ( arg1.node && arg1.node.value ) || arg1.value : arg1; + value = ( value && value.isNode === true ) ? ( value.node && value.node.value ) || value.value : value; return nodeObject( new UniformNode( value, nodeType ) ); @@ -5055,11 +5117,10 @@ class AssignNode extends TempNode { const needsSplitAssign = this.needsSplitAssign( builder ); + const target = targetNode.build( builder ); const targetType = targetNode.getNodeType( builder ); - const target = targetNode.build( builder ); const source = sourceNode.build( builder, targetType ); - const sourceType = sourceNode.getNodeType( builder ); const nodeData = builder.getDataFromNode( this ); @@ -7309,10 +7370,12 @@ class ConditionalNode extends Node { // + const isUniformFlow = builder.context.uniformFlow; + const properties = builder.getNodeProperties( this ); properties.condNode = condNode; - properties.ifNode = ifNode.context( { nodeBlock: ifNode } ); - properties.elseNode = elseNode ? elseNode.context( { nodeBlock: elseNode } ) : null; + properties.ifNode = isUniformFlow ? ifNode : ifNode.context( { nodeBlock: ifNode } ); + properties.elseNode = elseNode ? ( isUniformFlow ? elseNode : elseNode.context( { nodeBlock: elseNode } ) ) : null; } @@ -7337,6 +7400,20 @@ class ConditionalNode extends Node { nodeData.nodeProperty = nodeProperty; const nodeSnippet = condNode.build( builder, 'bool' ); + const isUniformFlow = builder.context.uniformFlow; + + if ( isUniformFlow && elseNode !== null ) { + + const ifSnippet = ifNode.build( builder, type ); + const elseSnippet = elseNode.build( builder, type ); + + const mathSnippet = builder.getTernary( nodeSnippet, ifSnippet, elseSnippet ); + + // TODO: If node property already exists return something else + + return builder.format( mathSnippet, type, output ); + + } builder.addFlowCode( `\n${ builder.tab }if ( ${ nodeSnippet } ) {\n\n` ).addFlowTab(); @@ -7550,6 +7627,16 @@ class ContextNode extends Node { */ const context = /*@__PURE__*/ nodeProxy( ContextNode ).setParameterLength( 1, 2 ); +/** + * TSL function for defining a uniformFlow context value for a given node. + * + * @tsl + * @function + * @param {Node} node - The node whose dependencies should all execute within a uniform control-flow path. + * @returns {ContextNode} + */ +const uniformFlow = ( node ) => context( node, { uniformFlow: true } ); + /** * TSL function for defining a name for the context value for a given node. * @@ -7581,6 +7668,7 @@ function label( node, name ) { addMethodChaining( 'context', context ); addMethodChaining( 'label', label ); +addMethodChaining( 'uniformFlow', uniformFlow ); addMethodChaining( 'setName', setName ); /** @@ -30936,13 +31024,13 @@ class StackNode extends Node { getNodeType( builder ) { - return this.outputNode ? this.outputNode.getNodeType( builder ) : 'void'; + return this.hasOutput ? this.outputNode.getNodeType( builder ) : 'void'; } getMemberType( builder, name ) { - return this.outputNode ? this.outputNode.getMemberType( builder, name ) : 'void'; + return this.hasOutput ? this.outputNode.getMemberType( builder, name ) : 'void'; } @@ -30954,6 +31042,13 @@ class StackNode extends Node { */ add( node ) { + if ( node.isNode !== true ) { + + console.error( 'THREE.TSL: Invalid node added to stack.' ); + return this; + + } + this.nodes.push( node ); return this; @@ -31047,7 +31142,7 @@ class StackNode extends Node { } else { - throw new Error( 'TSL: Invalid parameter length. Case() requires at least two parameters.' ); + console.error( 'THREE.TSL: Invalid parameter length. Case() requires at least two parameters.' ); } @@ -31131,6 +31226,12 @@ class StackNode extends Node { } + get hasOutput() { + + return this.outputNode && this.outputNode.isNode; + + } + build( builder, ...params ) { const previousBuildStack = builder.currentStack; @@ -31181,7 +31282,19 @@ class StackNode extends Node { } - const result = this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params ); + // + + let result; + + if ( this.hasOutput ) { + + result = this.outputNode.build( builder, ...params ); + + } else { + + result = super.build( builder, ...params ); + + } setCurrentStack( previousStack ); @@ -43380,6 +43493,7 @@ var TSL = /*#__PURE__*/Object.freeze({ uniform: uniform, uniformArray: uniformArray, uniformCubeTexture: uniformCubeTexture, + uniformFlow: uniformFlow, uniformGroup: uniformGroup, uniformTexture: uniformTexture, unpremultiplyAlpha: unpremultiplyAlpha, @@ -45781,6 +45895,22 @@ class NodeBuilder { } + /** + * Returns the native snippet for a ternary operation. E.g. GLSL would output + * a ternary op as `cond ? x : y` whereas WGSL would output it as `select(y, x, cond)` + * + * @abstract + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( /* condSnippet, ifSnippet, elseSnippet*/ ) { + + return null; + + } + /** * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}. * @@ -46097,7 +46227,6 @@ class NodeBuilder { } - /** * Generates the shader string for the given type and value. * @@ -47876,11 +48005,6 @@ class NodeBuilder { } - /** - * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors. - */ - *[ Symbol.iterator ]() { } - } /** @@ -56502,6 +56626,20 @@ class GLSLNodeBuilder extends NodeBuilder { } + /** + * Returns the native snippet for a ternary operation. + * + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( condSnippet, ifSnippet, elseSnippet ) { + + return `${condSnippet} ? ${ifSnippet} : ${elseSnippet}`; + + } + /** * Returns the output struct name. Not relevant for GLSL. * @@ -69029,6 +69167,21 @@ ${ flowData.code } } + /** + * Returns the native snippet for a ternary operation. + * + * @param {string} condSnippet - The condition determining which expression gets resolved. + * @param {string} ifSnippet - The expression to resolve to if the condition is true. + * @param {string} elseSnippet - The expression to resolve to if the condition is false. + * @return {string} The resolved method name. + */ + getTernary( condSnippet, ifSnippet, elseSnippet ) { + + return `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`; + + } + + /** * Returns the WGSL type of the given node data type. * diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index d2f43331fcd2ae..23c86635850f57 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,EventDispatcher as o,MathUtils as u,WebGLCoordinateSystem as l,WebGPUCoordinateSystem as d,ColorManagement as c,SRGBTransfer as h,NoToneMapping as p,StaticDrawUsage as g,InterleavedBuffer as m,InterleavedBufferAttribute as f,DynamicDrawUsage as y,NoColorSpace as b,Texture as x,UnsignedIntType as T,IntType as _,NearestFilter as v,Sphere as N,BackSide as S,DoubleSide as E,Euler as w,CubeTexture as A,CubeReflectionMapping as R,CubeRefractionMapping as C,TangentSpaceNormalMap as M,ObjectSpaceNormalMap as P,InstancedInterleavedBuffer as B,InstancedBufferAttribute as L,DataArrayTexture as F,FloatType as I,FramebufferTexture as D,LinearMipmapLinearFilter as V,DepthTexture as U,Material as O,NormalBlending as k,LineBasicMaterial as G,LineDashedMaterial as z,NoBlending as H,MeshNormalMaterial as $,SRGBColorSpace as W,WebGLCubeRenderTarget as q,BoxGeometry as j,Mesh as X,Scene as K,LinearFilter as Y,CubeCamera as Q,EquirectangularReflectionMapping as Z,EquirectangularRefractionMapping as J,AddOperation as ee,MixOperation as te,MultiplyOperation as re,MeshBasicMaterial as se,MeshLambertMaterial as ie,MeshPhongMaterial as ne,OrthographicCamera as ae,PerspectiveCamera as oe,RenderTarget as ue,LinearSRGBColorSpace as le,RGBAFormat as de,HalfFloatType as ce,CubeUVReflectionMapping as he,BufferGeometry as pe,BufferAttribute as ge,MeshStandardMaterial as me,MeshPhysicalMaterial as fe,MeshToonMaterial as ye,MeshMatcapMaterial as be,SpriteMaterial as xe,PointsMaterial as Te,ShadowMaterial as _e,Uint32BufferAttribute as ve,Uint16BufferAttribute as Ne,arrayNeedsUint32 as Se,Camera as Ee,DepthStencilFormat as we,DepthFormat as Ae,UnsignedInt248Type as Re,UnsignedByteType as Ce,Plane as Me,Object3D as Pe,LinearMipMapLinearFilter as Be,Float32BufferAttribute as Le,UVMapping as Fe,VSMShadowMap as Ie,LessCompare as De,RGFormat as Ve,BasicShadowMap as Ue,SphereGeometry as Oe,LinearMipmapNearestFilter as ke,NearestMipmapLinearFilter as Ge,Float16BufferAttribute as ze,REVISION as He,ArrayCamera as $e,PlaneGeometry as We,FrontSide as qe,CustomBlending as je,AddEquation as Xe,ZeroFactor as Ke,CylinderGeometry as Ye,Quaternion as Qe,WebXRController as Ze,RAD2DEG as Je,PCFShadowMap as et,FrustumArray as tt,Frustum as rt,DataTexture as st,RedIntegerFormat as it,RedFormat as nt,ShortType as at,ByteType as ot,UnsignedShortType as ut,RGIntegerFormat as lt,RGBIntegerFormat as dt,RGBFormat as ct,RGBAIntegerFormat as ht,warnOnce as pt,createCanvasElement as gt,ReverseSubtractEquation as mt,SubtractEquation as ft,OneMinusDstAlphaFactor as yt,OneMinusDstColorFactor as bt,OneMinusSrcAlphaFactor as xt,OneMinusSrcColorFactor as Tt,DstAlphaFactor as _t,DstColorFactor as vt,SrcAlphaSaturateFactor as Nt,SrcAlphaFactor as St,SrcColorFactor as Et,OneFactor as wt,CullFaceNone as At,CullFaceBack as Rt,CullFaceFront as Ct,MultiplyBlending as Mt,SubtractiveBlending as Pt,AdditiveBlending as Bt,NotEqualDepth as Lt,GreaterDepth as Ft,GreaterEqualDepth as It,EqualDepth as Dt,LessEqualDepth as Vt,LessDepth as Ut,AlwaysDepth as Ot,NeverDepth as kt,UnsignedShort4444Type as Gt,UnsignedShort5551Type as zt,UnsignedInt5999Type as Ht,AlphaFormat as $t,RGB_S3TC_DXT1_Format as Wt,RGBA_S3TC_DXT1_Format as qt,RGBA_S3TC_DXT3_Format as jt,RGBA_S3TC_DXT5_Format as Xt,RGB_PVRTC_4BPPV1_Format as Kt,RGB_PVRTC_2BPPV1_Format as Yt,RGBA_PVRTC_4BPPV1_Format as Qt,RGBA_PVRTC_2BPPV1_Format as Zt,RGB_ETC1_Format as Jt,RGB_ETC2_Format as er,RGBA_ETC2_EAC_Format as tr,RGBA_ASTC_4x4_Format as rr,RGBA_ASTC_5x4_Format as sr,RGBA_ASTC_5x5_Format as ir,RGBA_ASTC_6x5_Format as nr,RGBA_ASTC_6x6_Format as ar,RGBA_ASTC_8x5_Format as or,RGBA_ASTC_8x6_Format as ur,RGBA_ASTC_8x8_Format as lr,RGBA_ASTC_10x5_Format as dr,RGBA_ASTC_10x6_Format as cr,RGBA_ASTC_10x8_Format as hr,RGBA_ASTC_10x10_Format as pr,RGBA_ASTC_12x10_Format as gr,RGBA_ASTC_12x12_Format as mr,RGBA_BPTC_Format as fr,RED_RGTC1_Format as yr,SIGNED_RED_RGTC1_Format as br,RED_GREEN_RGTC2_Format as xr,SIGNED_RED_GREEN_RGTC2_Format as Tr,MirroredRepeatWrapping as _r,ClampToEdgeWrapping as vr,RepeatWrapping as Nr,NearestMipmapNearestFilter as Sr,NotEqualCompare as Er,GreaterCompare as wr,GreaterEqualCompare as Ar,EqualCompare as Rr,LessEqualCompare as Cr,AlwaysCompare as Mr,NeverCompare as Pr,LinearTransfer as Br,NotEqualStencilFunc as Lr,GreaterStencilFunc as Fr,GreaterEqualStencilFunc as Ir,EqualStencilFunc as Dr,LessEqualStencilFunc as Vr,LessStencilFunc as Ur,AlwaysStencilFunc as Or,NeverStencilFunc as kr,DecrementWrapStencilOp as Gr,IncrementWrapStencilOp as zr,DecrementStencilOp as Hr,IncrementStencilOp as $r,InvertStencilOp as Wr,ReplaceStencilOp as qr,ZeroStencilOp as jr,KeepStencilOp as Xr,MaxEquation as Kr,MinEquation as Yr,SpotLight as Qr,PointLight as Zr,DirectionalLight as Jr,RectAreaLight as es,AmbientLight as ts,HemisphereLight as rs,LightProbe as ss,LinearToneMapping as is,ReinhardToneMapping as ns,CineonToneMapping as as,ACESFilmicToneMapping as os,AgXToneMapping as us,NeutralToneMapping as ls,Group as ds,Loader as cs,FileLoader as hs,MaterialLoader as ps,ObjectLoader as gs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],fs=new WeakMap;class ys{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>bs(e),Ts=e=>bs(e),_s=(...e)=>bs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(bs(s.slice(0,-4)),i.getCacheKey(t));return bs(r)}function*Ns(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0)).buffer}var Ds=Object.freeze({__proto__:null,arrayBufferToBase64:Fs,base64ToArrayBuffer:Is,getByteBoundaryFromType:Ms,getCacheKey:vs,getDataFromObject:Ls,getLengthFromType:Rs,getMemoryLengthFromType:Cs,getNodeChildren:Ns,getTypeFromLength:ws,getTypedArrayFromType:As,getValueFromType:Bs,getValueType:Ps,hash:_s,hashArray:Ts,hashString:xs});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],Hs=[...Gs,"compute"],$s=["x","y","z","w"],Ws={analyze:"setup",generate:"analyze"};let qs=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:qs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of Ns(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=_s(vs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}getArrayCount(){return null}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e,t=null){const r=e.increaseUsage(this);if(!0===this.parents){const r=e.getDataFromNode(this,"any");r.stages=r.stages||{},r.stages[e.shaderStage]=r.stages[e.shaderStage]||[],r.stages[e.shaderStage].push(t)}if(1===r){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e,this)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);const s=e.getDataFromNode(this);s.buildStages=s.buildStages||{},s.buildStages[e.buildStage]=!0;const i=Ws[e.buildStage];if(i&&!0!==s.buildStages[i]){const t=e.getBuildStage();e.setBuildStage(i),this.build(e),e.setBuildStage(t)}e.addNode(this),e.addChain(this);let n=null;const a=e.getBuildStage();if("setup"===a){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0,t.outputNode=this.setup(e)||t.outputNode||null;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}}n=t.outputNode}else if("analyze"===a)this.analyze(e,t);else if("generate"===a){if(1===this.generate.length){const r=this.getNodeType(e),s=e.getDataFromNode(this);n=s.snippet,void 0===n?void 0===s.generated?(s.generated=!0,n=this.generate(e)||"",s.snippet=n):(console.warn("THREE.Node: Recursion detected.",this),n="/* Recursion detected. */"):void 0!==s.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),n=e.format(n,r,t)}else n=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),n}getSerializeChildren(){return Ns(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Xs extends js{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ks extends js{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Ys extends js{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Qs extends Ys{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Zs=$s.join("");class Js extends js{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max($s.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Zs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class ei extends Ys{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),di=e=>li(e).split("").sort().join(""),ci={setup(e,t){const r=t.shift();return e(Vi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ai.assign(r,...e),r);if(oi.has(t)){const s=oi.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("toVarIntent"===t)return()=>r;if("self"===t)return e;if(t.endsWith("Assign")&&oi.has(t.slice(0,t.length-6))){const s=oi.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=li(t),Ii(new Js(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(3).toLowerCase()),r=>Ii(new ei(e,t,Ii(r)));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(4).toLowerCase()),()=>Ii(new ti(Ii(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ii(new Js(e,t));if(!0===/^\d+$/.test(t))return Ii(new Xs(r,new ii(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Ii(new ni(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},hi=new WeakMap,pi=new WeakMap,gi=function(e,t=null){for(const r in e)e[r]=Ii(e[r],t);return e},mi=function(e,t=null){const r=e.length;for(let s=0;so?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ui(l(t)))):null!==r?(r=Ii(r),n=(...s)=>i(new e(t,...Ui(l(s)),r))):n=(...r)=>i(new e(t,...Ui(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},yi=function(e,...t){return Ii(new e(...Ui(t)))};class bi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn;e.subBuildFn=i;let o=null;if(t.layout){let s=pi.get(e.constructor);void 0===s&&(s=new WeakMap,pi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Ii(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i),o=Ii(i.call(r))}else{let s=r;if(Array.isArray(s)){let e=0;s=new Proxy(s,{get:(t,r,s)=>void 0===t[r]?t[e++]:Reflect.get(t,r,s)})}const i=t.jsFunc,n=null!==s||i.length>1?i(s||[],e):i(e);o=Ii(n)}return e.subBuildFn=a,t.once&&(s[n]=o),o}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e);if("setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return r}}class xi extends js{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Vi(e),Ii(new bi(this,e))}setup(){return this.call()}}const Ti=[!1,!0],_i=[0,1,2,3],vi=[-1,-2],Ni=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Si=new Map;for(const e of Ti)Si.set(e,new ii(e));const Ei=new Map;for(const e of _i)Ei.set(e,new ii(e,"uint"));const wi=new Map([...Ei].map(e=>new ii(e.value,"int")));for(const e of vi)wi.set(e,new ii(e,"int"));const Ai=new Map([...wi].map(e=>new ii(e.value)));for(const e of Ni)Ai.set(e,new ii(e));for(const e of Ni)Ai.set(-e,new ii(-e));const Ri={bool:Si,uint:Ei,ints:wi,float:Ai},Ci=new Map([...Si,...Ai]),Mi=(e,t)=>Ci.has(e)?Ci.get(e):!0===e.isNode?e:new ii(e,t),Pi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Bs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Di(t.get(r[0]));if(1===r.length){const t=Mi(r[0],e);return t.nodeType===e?Di(t):Di(new Ks(t,e))}const s=r.map(e=>Mi(e));return Di(new Qs(s,e))}},Bi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),ci)}const Ii=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=hi.get(e);return void 0===t&&(t=new Proxy(e,ci),hi.set(e,t),hi.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ii(Mi(e,t)):"shader"===r?e.isFn?e:$i(e):e}(e,t),Di=(e,t=null)=>Ii(e,t).toVarIntent(),Vi=(e,t=null)=>new gi(e,t),Ui=(e,t=null)=>new mi(e,t),Oi=(e,t=null,r=null,s=null)=>new fi(e,t,r,s),ki=(e,...t)=>new yi(e,...t),Gi=(e,t=null,r=null,s={})=>new fi(e,t,r,{intent:!0,...s});let zi=0;class Hi extends js{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null)),this.shaderNode=new Fi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+zi++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){let t;Vi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];const r=this.shaderNode.call(t);return"void"===this.shaderNode.nodeType&&r.toStack(),r.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return console.warn('THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function $i(e,t=null){const r=new Hi(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const Wi=e=>{ai=e},qi=()=>ai,ji=(...e)=>ai.If(...e);function Xi(e){return ai&&ai.add(e),e}ui("toStack",Xi);const Ki=new Pi("color"),Yi=new Pi("float",Ri.float),Qi=new Pi("int",Ri.ints),Zi=new Pi("uint",Ri.uint),Ji=new Pi("bool",Ri.bool),en=new Pi("vec2"),tn=new Pi("ivec2"),rn=new Pi("uvec2"),sn=new Pi("bvec2"),nn=new Pi("vec3"),an=new Pi("ivec3"),on=new Pi("uvec3"),un=new Pi("bvec3"),ln=new Pi("vec4"),dn=new Pi("ivec4"),cn=new Pi("uvec4"),hn=new Pi("bvec4"),pn=new Pi("mat2"),gn=new Pi("mat3"),mn=new Pi("mat4");ui("toColor",Ki),ui("toFloat",Yi),ui("toInt",Qi),ui("toUint",Zi),ui("toBool",Ji),ui("toVec2",en),ui("toIVec2",tn),ui("toUVec2",rn),ui("toBVec2",sn),ui("toVec3",nn),ui("toIVec3",an),ui("toUVec3",on),ui("toBVec3",un),ui("toVec4",ln),ui("toIVec4",dn),ui("toUVec4",cn),ui("toBVec4",hn),ui("toMat2",pn),ui("toMat3",gn),ui("toMat4",mn);const fn=Oi(Xs).setParameterLength(2),yn=(e,t)=>Ii(new Ks(Ii(e),t));ui("element",fn),ui("convert",yn);ui("append",e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),Xi(e)));class bn extends js{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const xn=(e,t)=>Ii(new bn(e,t)),Tn=(e,t)=>Ii(new bn(e,t,!0)),_n=ki(bn,"vec4","DiffuseColor"),vn=ki(bn,"vec3","EmissiveColor"),Nn=ki(bn,"float","Roughness"),Sn=ki(bn,"float","Metalness"),En=ki(bn,"float","Clearcoat"),wn=ki(bn,"float","ClearcoatRoughness"),An=ki(bn,"vec3","Sheen"),Rn=ki(bn,"float","SheenRoughness"),Cn=ki(bn,"float","Iridescence"),Mn=ki(bn,"float","IridescenceIOR"),Pn=ki(bn,"float","IridescenceThickness"),Bn=ki(bn,"float","AlphaT"),Ln=ki(bn,"float","Anisotropy"),Fn=ki(bn,"vec3","AnisotropyT"),In=ki(bn,"vec3","AnisotropyB"),Dn=ki(bn,"color","SpecularColor"),Vn=ki(bn,"float","SpecularF90"),Un=ki(bn,"float","Shininess"),On=ki(bn,"vec4","Output"),kn=ki(bn,"float","dashSize"),Gn=ki(bn,"float","gapSize"),zn=ki(bn,"float","pointWidth"),Hn=ki(bn,"float","IOR"),$n=ki(bn,"float","Transmission"),Wn=ki(bn,"float","Thickness"),qn=ki(bn,"float","AttenuationDistance"),jn=ki(bn,"color","AttenuationColor"),Xn=ki(bn,"float","Dispersion");class Kn extends js{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Yn=e=>new Kn(e),Qn=(e,t=0)=>new Kn(e,!0,t),Zn=Qn("frame"),Jn=Qn("render"),ea=Yn("object");class ta extends ri{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ea}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate(t=>{const s=e(t,r);void 0!==s&&(this.value=s)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const ra=(e,t)=>{const r=Li(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Ii(new ta(s,r))};class sa extends Ys{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ia=(...e)=>{let t;if(1===e.length){const r=e[0];t=new sa(null,r.length,r)}else{const r=e[0],s=e[1];t=new sa(r,s)}return Ii(t)};ui("toArray",(e,t)=>ia(Array(t).fill(e)));class na extends Ys{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return $s.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this;e.getNodeProperties(t).assign=!0;const s=e.getNodeProperties(this);s.sourceNode=r,s.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ui(t):Vi(t[0]),Ii(new oa(Ii(e),t)));ui("call",ua);const la={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class da extends Ys{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new da(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const ca=Gi(da,"+").setParameterLength(2,1/0).setName("add"),ha=Gi(da,"-").setParameterLength(2,1/0).setName("sub"),pa=Gi(da,"*").setParameterLength(2,1/0).setName("mul"),ga=Gi(da,"/").setParameterLength(2,1/0).setName("div"),ma=Gi(da,"%").setParameterLength(2).setName("mod"),fa=Gi(da,"==").setParameterLength(2).setName("equal"),ya=Gi(da,"!=").setParameterLength(2).setName("notEqual"),ba=Gi(da,"<").setParameterLength(2).setName("lessThan"),xa=Gi(da,">").setParameterLength(2).setName("greaterThan"),Ta=Gi(da,"<=").setParameterLength(2).setName("lessThanEqual"),_a=Gi(da,">=").setParameterLength(2).setName("greaterThanEqual"),va=Gi(da,"&&").setParameterLength(2,1/0).setName("and"),Na=Gi(da,"||").setParameterLength(2,1/0).setName("or"),Sa=Gi(da,"!").setParameterLength(1).setName("not"),Ea=Gi(da,"^^").setParameterLength(2).setName("xor"),wa=Gi(da,"&").setParameterLength(2).setName("bitAnd"),Aa=Gi(da,"~").setParameterLength(2).setName("bitNot"),Ra=Gi(da,"|").setParameterLength(2).setName("bitOr"),Ca=Gi(da,"^").setParameterLength(2).setName("bitXor"),Ma=Gi(da,"<<").setParameterLength(2).setName("shiftLeft"),Pa=Gi(da,">>").setParameterLength(2).setName("shiftRight"),Ba=$i(([e])=>(e.addAssign(1),e)),La=$i(([e])=>(e.subAssign(1),e)),Fa=$i(([e])=>{const t=Qi(e).toConst();return e.addAssign(1),t}),Ia=$i(([e])=>{const t=Qi(e).toConst();return e.subAssign(1),t});ui("add",ca),ui("sub",ha),ui("mul",pa),ui("div",ga),ui("mod",ma),ui("equal",fa),ui("notEqual",ya),ui("lessThan",ba),ui("greaterThan",xa),ui("lessThanEqual",Ta),ui("greaterThanEqual",_a),ui("and",va),ui("or",Na),ui("not",Sa),ui("xor",Ea),ui("bitAnd",wa),ui("bitNot",Aa),ui("bitOr",Ra),ui("bitXor",Ca),ui("shiftLeft",Ma),ui("shiftRight",Pa),ui("incrementBefore",Ba),ui("decrementBefore",La),ui("increment",Fa),ui("decrement",Ia);const Da=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ma(Qi(e),Qi(t)));ui("modInt",Da);class Va extends Ys{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Va.MAX||e===Va.MIN)&&arguments.length>3){let i=new Va(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Va.LENGTH||t===Va.DISTANCE||t===Va.DOT?"float":t===Va.CROSS?"vec3":t===Va.ALL||t===Va.ANY?"bool":t===Va.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===Va.ONE_MINUS)i=ha(1,t);else if(s===Va.RECIPROCAL)i=ga(1,t);else if(s===Va.DIFFERENCE)i=uo(ha(t,r));else if(s===Va.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=ln(nn(n),0):s=ln(nn(s),0);const a=pa(s,n).xyz;i=eo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Va.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const c=[];return r===Va.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Va.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Va.MIN&&r!==Va.MAX?r===Va.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Va.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Va.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Va.DFDX&&r!==Va.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Va.ALL="all",Va.ANY="any",Va.RADIANS="radians",Va.DEGREES="degrees",Va.EXP="exp",Va.EXP2="exp2",Va.LOG="log",Va.LOG2="log2",Va.SQRT="sqrt",Va.INVERSE_SQRT="inversesqrt",Va.FLOOR="floor",Va.CEIL="ceil",Va.NORMALIZE="normalize",Va.FRACT="fract",Va.SIN="sin",Va.COS="cos",Va.TAN="tan",Va.ASIN="asin",Va.ACOS="acos",Va.ATAN="atan",Va.ABS="abs",Va.SIGN="sign",Va.LENGTH="length",Va.NEGATE="negate",Va.ONE_MINUS="oneMinus",Va.DFDX="dFdx",Va.DFDY="dFdy",Va.ROUND="round",Va.RECIPROCAL="reciprocal",Va.TRUNC="trunc",Va.FWIDTH="fwidth",Va.TRANSPOSE="transpose",Va.DETERMINANT="determinant",Va.INVERSE="inverse",Va.BITCAST="bitcast",Va.EQUALS="equals",Va.MIN="min",Va.MAX="max",Va.STEP="step",Va.REFLECT="reflect",Va.DISTANCE="distance",Va.DIFFERENCE="difference",Va.DOT="dot",Va.CROSS="cross",Va.POW="pow",Va.TRANSFORM_DIRECTION="transformDirection",Va.MIX="mix",Va.CLAMP="clamp",Va.REFRACT="refract",Va.SMOOTHSTEP="smoothstep",Va.FACEFORWARD="faceforward";const Ua=Yi(1e-6),Oa=Yi(1e6),ka=Yi(Math.PI),Ga=Yi(2*Math.PI),za=Gi(Va,Va.ALL).setParameterLength(1),Ha=Gi(Va,Va.ANY).setParameterLength(1),$a=Gi(Va,Va.RADIANS).setParameterLength(1),Wa=Gi(Va,Va.DEGREES).setParameterLength(1),qa=Gi(Va,Va.EXP).setParameterLength(1),ja=Gi(Va,Va.EXP2).setParameterLength(1),Xa=Gi(Va,Va.LOG).setParameterLength(1),Ka=Gi(Va,Va.LOG2).setParameterLength(1),Ya=Gi(Va,Va.SQRT).setParameterLength(1),Qa=Gi(Va,Va.INVERSE_SQRT).setParameterLength(1),Za=Gi(Va,Va.FLOOR).setParameterLength(1),Ja=Gi(Va,Va.CEIL).setParameterLength(1),eo=Gi(Va,Va.NORMALIZE).setParameterLength(1),to=Gi(Va,Va.FRACT).setParameterLength(1),ro=Gi(Va,Va.SIN).setParameterLength(1),so=Gi(Va,Va.COS).setParameterLength(1),io=Gi(Va,Va.TAN).setParameterLength(1),no=Gi(Va,Va.ASIN).setParameterLength(1),ao=Gi(Va,Va.ACOS).setParameterLength(1),oo=Gi(Va,Va.ATAN).setParameterLength(1,2),uo=Gi(Va,Va.ABS).setParameterLength(1),lo=Gi(Va,Va.SIGN).setParameterLength(1),co=Gi(Va,Va.LENGTH).setParameterLength(1),ho=Gi(Va,Va.NEGATE).setParameterLength(1),po=Gi(Va,Va.ONE_MINUS).setParameterLength(1),go=Gi(Va,Va.DFDX).setParameterLength(1),mo=Gi(Va,Va.DFDY).setParameterLength(1),fo=Gi(Va,Va.ROUND).setParameterLength(1),yo=Gi(Va,Va.RECIPROCAL).setParameterLength(1),bo=Gi(Va,Va.TRUNC).setParameterLength(1),xo=Gi(Va,Va.FWIDTH).setParameterLength(1),To=Gi(Va,Va.TRANSPOSE).setParameterLength(1),_o=Gi(Va,Va.DETERMINANT).setParameterLength(1),vo=Gi(Va,Va.INVERSE).setParameterLength(1),No=Gi(Va,Va.BITCAST).setParameterLength(2),So=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),fa(e,t)),Eo=Gi(Va,Va.MIN).setParameterLength(2,1/0),wo=Gi(Va,Va.MAX).setParameterLength(2,1/0),Ao=Gi(Va,Va.STEP).setParameterLength(2),Ro=Gi(Va,Va.REFLECT).setParameterLength(2),Co=Gi(Va,Va.DISTANCE).setParameterLength(2),Mo=Gi(Va,Va.DIFFERENCE).setParameterLength(2),Po=Gi(Va,Va.DOT).setParameterLength(2),Bo=Gi(Va,Va.CROSS).setParameterLength(2),Lo=Gi(Va,Va.POW).setParameterLength(2),Fo=Gi(Va,Va.POW,2).setParameterLength(1),Io=Gi(Va,Va.POW,3).setParameterLength(1),Do=Gi(Va,Va.POW,4).setParameterLength(1),Vo=Gi(Va,Va.TRANSFORM_DIRECTION).setParameterLength(2),Uo=e=>pa(lo(e),Lo(uo(e),1/3)),Oo=e=>Po(e,e),ko=Gi(Va,Va.MIX).setParameterLength(3),Go=(e,t=0,r=1)=>Ii(new Va(Va.CLAMP,Ii(e),Ii(t),Ii(r))),zo=e=>Go(e),Ho=Gi(Va,Va.REFRACT).setParameterLength(3),$o=Gi(Va,Va.SMOOTHSTEP).setParameterLength(3),Wo=Gi(Va,Va.FACEFORWARD).setParameterLength(3),qo=$i(([e])=>{const t=Po(e.xy,en(12.9898,78.233)),r=ma(t,ka);return to(ro(r).mul(43758.5453))}),jo=(e,t,r)=>ko(t,r,e),Xo=(e,t,r)=>$o(t,r,e),Ko=(e,t)=>Ao(t,e),Yo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),oo(e,t)),Qo=Wo,Zo=Qa;ui("all",za),ui("any",Ha),ui("equals",So),ui("radians",$a),ui("degrees",Wa),ui("exp",qa),ui("exp2",ja),ui("log",Xa),ui("log2",Ka),ui("sqrt",Ya),ui("inverseSqrt",Qa),ui("floor",Za),ui("ceil",Ja),ui("normalize",eo),ui("fract",to),ui("sin",ro),ui("cos",so),ui("tan",io),ui("asin",no),ui("acos",ao),ui("atan",oo),ui("abs",uo),ui("sign",lo),ui("length",co),ui("lengthSq",Oo),ui("negate",ho),ui("oneMinus",po),ui("dFdx",go),ui("dFdy",mo),ui("round",fo),ui("reciprocal",yo),ui("trunc",bo),ui("fwidth",xo),ui("atan2",Yo),ui("min",Eo),ui("max",wo),ui("step",Ko),ui("reflect",Ro),ui("distance",Co),ui("dot",Po),ui("cross",Bo),ui("pow",Lo),ui("pow2",Fo),ui("pow3",Io),ui("pow4",Do),ui("transformDirection",Vo),ui("mix",jo),ui("clamp",Go),ui("refract",Ho),ui("smoothstep",Xo),ui("faceForward",Wo),ui("difference",Mo),ui("saturate",zo),ui("cbrt",Uo),ui("transpose",To),ui("determinant",_o),ui("inverse",vo),ui("rand",qo);class Jo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?xn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const eu=Oi(Jo).setParameterLength(2,3);ui("select",eu);class tu extends js{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const ru=Oi(tu).setParameterLength(1,2),su=(e,t)=>ru(e,{nodeName:t});function iu(e,t){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),su(e,t)}ui("context",ru),ui("label",iu),ui("setName",su);class nu extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}build(...e){if(!0===this.intent){if(!0!==e[0].getNodeProperties(this).assign)return this.node.build(...e)}return super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=t.getArrayCount(e);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const au=Oi(nu),ou=(e,t=null)=>au(e,t).toStack(),uu=(e,t=null)=>au(e,t,!0).toStack(),lu=e=>null===qi()?e:au(e).setIntent(!0).toStack();ui("toVar",ou),ui("toConst",uu),ui("toVarIntent",lu);class du extends js{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const cu=(e,t,r=null)=>Ii(new du(Ii(e),t,r));class hu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=cu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const pu=Oi(hu).setParameterLength(1,2),gu=e=>pu(e);ui("toVarying",pu),ui("toVertexStage",gu),ui("varying",(...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),pu(...e))),ui("vertexStage",(...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),pu(...e)));const mu=$i(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ko(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),fu=$i(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ko(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),yu="WorkingColorSpace";class bu extends Ys{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===yu?c.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=ln(mu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=ln(gn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=ln(fu(i.rgb),i.a)),i):i}}const xu=(e,t)=>Ii(new bu(Ii(e),yu,t)),Tu=(e,t)=>Ii(new bu(Ii(e),t,yu));ui("workingToColorSpace",xu),ui("colorSpaceToWorking",Tu);let _u=class extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class vu extends js{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ii(new _u(this,Ii(e)))}setNodeType(e){const t=ra(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Nu(e,t,r));class Eu extends Ys{static get type(){return"ToneMappingNode"}constructor(e,t=Au,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ln(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const wu=(e,t,r)=>Ii(new Eu(e,Ii(t),Ii(r))),Au=Su("toneMappingExposure","float");ui("toneMapping",(e,t,r)=>wu(t,r,e));class Ru extends ri{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const Cu=(e,t=null,r=0,s=0)=>Ii(new Ru(e,t,r,s)),Mu=(e,t=null,r=0,s=0)=>Cu(e,t,r,s).setUsage(y),Pu=(e,t=null,r=0,s=0)=>Cu(e,t,r,s).setInstanced(!0),Bu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setInstanced(!0);ui("toAttribute",e=>Cu(e.value));class Lu extends js{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const Fu=(e,t=[64])=>{(0===t.length||t.length>3)&&console.error("THREE.TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;eFu(e,r).setCount(t);ui("compute",Iu),ui("computeKernel",Fu);class Du extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Vu=(e,t)=>Ii(new Du(Ii(e),t));ui("cache",Vu);class Uu extends js{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Ou=Oi(Uu).setParameterLength(2);ui("bypass",Ou);class ku extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=Yi(0),i=Yi(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Gu=Oi(ku,null,null,{doClamp:!1}).setParameterLength(3,5),zu=Oi(ku).setParameterLength(3,5);ui("remap",Gu),ui("remapClamp",zu);class Hu extends js{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const $u=Oi(Hu).setParameterLength(1,2),Wu=e=>(e?eu(e,$u("discard")):$u("discard")).toStack();ui("discard",Wu);class qu extends Ys{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||b;return r!==p&&(t=t.toneMapping(r)),s!==b&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ju=(e,t=null,r=null)=>Ii(new qu(Ii(e),t,r));ui("renderOutput",ju);class Xu extends Ys{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Ku=(e,t=null)=>Ii(new Xu(Ii(e),t)).toStack();ui("debug",Ku);class Yu extends js{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return pu(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Qu=(e,t=null)=>Ii(new Yu(e,t)),Zu=(e=0)=>Qu("uv"+(e>0?e:""),"vec2");class Ju extends js{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const el=Oi(Ju).setParameterLength(1,2);class tl extends ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const rl=Oi(tl).setParameterLength(1),sl=new x;class il extends ta{static get type(){return"TextureNode"}constructor(e=sl,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Us.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===T?"uvec4":this.value.type===_?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Zu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ra(this.value.matrix)),this._matrixUniform.mul(nn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Qi(el(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${b}`,this),n.snippet=b,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=Tu($u(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Ii(e).mul(rl(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===v||r.magFilter===v)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Ii(t)}level(e){const t=this.clone();return t.levelNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}size(e){return el(this,e)}bias(e){const t=this.clone();return t.biasNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}compare(e){const t=this.clone();return t.compareNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ii(e),Ii(t)],r.referenceNode=this.getSelf(),Ii(r)}depth(e){const t=this.clone();return t.depthNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const nl=Oi(il).setParameterLength(1,4).setName("texture"),al=(e=sl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=nl(e,t,r,s),i},ol=(...e)=>al(...e).setSampler(!1);class ul extends ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const ll=(e,t,r)=>Ii(new ul(e,t,r));class dl extends Xs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class cl extends ul{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rIi(new cl(e,t));const pl=Oi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),gl=ra(0,"uint").setName("u_cameraIndex").setGroup(Qn("cameraIndex")).toVarying("v_cameraIndex"),ml=ra("float").setName("cameraNear").setGroup(Jn).onRenderUpdate(({camera:e})=>e.near),fl=ra("float").setName("cameraFar").setGroup(Jn).onRenderUpdate(({camera:e})=>e.far),yl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=hl(r).setGroup(Jn).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraProjectionMatrix")}else t=ra("mat4").setName("cameraProjectionMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),bl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=hl(r).setGroup(Jn).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraProjectionMatrixInverse")}else t=ra("mat4").setName("cameraProjectionMatrixInverse").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),xl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=hl(r).setGroup(Jn).setName("cameraViewMatrices").element(e.isMultiViewCamera?pl("gl_ViewID_OVR"):gl).toVar("cameraViewMatrix")}else t=ra("mat4").setName("cameraViewMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),Tl=ra("mat4").setName("cameraWorldMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorld),_l=ra("mat3").setName("cameraNormalMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.normalMatrix),vl=ra(new r).setName("cameraPosition").setGroup(Jn).onRenderUpdate(({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)),Nl=new N;class Sl extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this.uniformNode=new ta(null)}getNodeType(){const e=this.scope;return e===Sl.WORLD_MATRIX?"mat4":e===Sl.POSITION||e===Sl.VIEW_POSITION||e===Sl.DIRECTION||e===Sl.SCALE?"vec3":e===Sl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===Sl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===Sl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===Sl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===Sl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===Sl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===Sl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Nl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Nl.radius}}generate(e){const t=this.scope;return t===Sl.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===Sl.POSITION||t===Sl.VIEW_POSITION||t===Sl.DIRECTION||t===Sl.SCALE?this.uniformNode.nodeType="vec3":t===Sl.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}Sl.WORLD_MATRIX="worldMatrix",Sl.POSITION="position",Sl.SCALE="scale",Sl.VIEW_POSITION="viewPosition",Sl.DIRECTION="direction",Sl.RADIUS="radius";const El=Oi(Sl,Sl.DIRECTION).setParameterLength(1),wl=Oi(Sl,Sl.WORLD_MATRIX).setParameterLength(1),Al=Oi(Sl,Sl.POSITION).setParameterLength(1),Rl=Oi(Sl,Sl.SCALE).setParameterLength(1),Cl=Oi(Sl,Sl.VIEW_POSITION).setParameterLength(1),Ml=Oi(Sl,Sl.RADIUS).setParameterLength(1);class Pl extends Sl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Bl=ki(Pl,Pl.DIRECTION),Ll=ki(Pl,Pl.WORLD_MATRIX),Fl=ki(Pl,Pl.POSITION),Il=ki(Pl,Pl.SCALE),Dl=ki(Pl,Pl.VIEW_POSITION),Vl=ki(Pl,Pl.RADIUS),Ul=ra(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Ol=ra(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),kl=$i(e=>e.renderer.overrideNodes.modelViewMatrix||Gl).once()().toVar("modelViewMatrix"),Gl=xl.mul(Ll),zl=$i(e=>(e.context.isHighPrecisionModelViewMatrix=!0,ra("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Hl=$i(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ra("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),$l=Qu("position","vec3"),Wl=$l.toVarying("positionLocal"),ql=$l.toVarying("positionPrevious"),jl=$i(e=>Ll.mul(Wl).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Xl=$i(()=>Wl.transformDirection(Ll).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Kl=$i(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Yl=Kl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ql extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===S?"false":e.getFrontFacing()}}const Zl=ki(Ql),Jl=Yi(Zl).mul(2).sub(1),ed=$i(([e],{material:t})=>{const r=t.side;return r===S?e=e.mul(-1):r===E&&(e=e.mul(Jl)),e}),td=Qu("normal","vec3"),rd=$i(e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),nn(0,1,0)):td,"vec3").once()().toVar("normalLocal"),sd=Kl.dFdx().cross(Kl.dFdy()).normalize().toVar("normalFlat"),id=$i(e=>{let t;return t=!0===e.material.flatShading?sd:dd(rd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),nd=$i(e=>{let t=id.transformDirection(xl);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),ad=$i(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=id,!0!==t.flatShading&&(s=ed(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),od=ad.transformDirection(xl).toVar("normalWorld"),ud=$i(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?ad:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),ld=$i(([e,t=Ll])=>{const r=gn(t),s=e.div(nn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),dd=$i(([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ul.mul(e);return xl.transformDirection(s)}),cd=$i(()=>(console.warn('THREE.TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),ad)).once(["NORMAL","VERTEX"])(),hd=$i(()=>(console.warn('THREE.TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),od)).once(["NORMAL","VERTEX"])(),pd=$i(()=>(console.warn('THREE.TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),ud)).once(["NORMAL","VERTEX"])(),gd=new w,md=new a,fd=ra(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),yd=ra(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),bd=ra(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(gd.copy(r),md.makeRotationFromEuler(gd)):md.identity(),md}),xd=Yl.negate().reflect(ad),Td=Yl.negate().refract(ad,fd),_d=xd.transformDirection(xl).toVar("reflectVector"),vd=Td.transformDirection(xl).toVar("reflectVector"),Nd=new A;class Sd extends il{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===R?_d:e.mapping===C?vd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),nn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=nn(t.x.negate(),t.yz)),bd.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const Ed=Oi(Sd).setParameterLength(1,4).setName("cubeTexture"),wd=(e=Nd,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=Ed(e,t,r,s),i};class Ad extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Rd extends js{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Us.OBJECT}element(e){return Ii(new Ad(this,Ii(e)))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?ll(null,e,this.count):Array.isArray(this.getValueFromReference())?hl(null,e):"texture"===e?al(null):"cubeTexture"===e?wd(null):ra(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Rd(e,t,r)),Md=(e,t,r,s)=>Ii(new Rd(e,t,s,r));class Pd extends Rd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Bd=(e,t,r=null)=>Ii(new Pd(e,t,r)),Ld=Zu(),Fd=Kl.dFdx(),Id=Kl.dFdy(),Dd=Ld.dFdx(),Vd=Ld.dFdy(),Ud=ad,Od=Id.cross(Ud),kd=Ud.cross(Fd),Gd=Od.mul(Dd.x).add(kd.mul(Vd.x)),zd=Od.mul(Dd.y).add(kd.mul(Vd.y)),Hd=Gd.dot(Gd).max(zd.dot(zd)),$d=Hd.equal(0).select(0,Hd.inverseSqrt()),Wd=Gd.mul($d).toVar("tangentViewFrame"),qd=zd.mul($d).toVar("bitangentViewFrame"),jd=$i(e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Qu("tangent","vec4")))(),Xd=jd.xyz.toVar("tangentLocal"),Kd=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?kl.mul(ln(Xd,0)).xyz.toVarying("v_tangentView").normalize():Wd,!0!==r.flatShading&&(s=ed(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Yd=Kd.transformDirection(xl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Qd=$i(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(jd.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Zd=Qd(td.cross(jd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Jd=Qd(rd.cross(Xd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),ec=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Qd(ad.cross(Kd),"v_bitangentView").normalize():qd,!0!==r.flatShading&&(s=ed(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),tc=Qd(od.cross(Yd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),rc=gn(Kd,ec,ad).toVar("TBNViewMatrix"),sc=Yl.mul(rc),ic=$i(()=>{let e=In.cross(Yl);return e=e.cross(In).normalize(),e=ko(e,ad,Ln.mul(Nn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()();class nc extends Ys{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=M}setup({material:e}){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);if(null!==r){let t=r;!0===e.flatShading&&(t=ed(t)),s=nn(s.xy.mul(t),s.z)}let i=null;return t===P?i=dd(s):t===M?i=rc.mul(s).normalize():(console.error(`THREE.NodeMaterial: Unsupported normal map type: ${t}`),i=ad),i}}const ac=Oi(nc).setParameterLength(1,2),oc=$i(({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Zu()),forceUVContext:!0}),s=Yi(r(e=>e));return en(Yi(r(e=>e.add(e.dFdx()))).sub(s),Yi(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),uc=$i(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Jl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class lc extends Ys{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=oc({textureNode:this.textureNode,bumpScale:e});return uc({surf_pos:Kl,surf_norm:ad,dHdxy:t})}}const dc=Oi(lc).setParameterLength(1,2),cc=new Map;class hc extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=cc.get(e);return void 0===r&&(r=Bd(e,t),cc.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===hc.COLOR){const e=void 0!==t.color?this.getColor(r):nn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===hc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===hc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Yi(1);else if(r===hc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===hc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===hc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===hc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===hc.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===hc.NORMAL)t.normalMap?(s=ac(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?dc(this.getTexture("bump").r,this.getFloat("bumpScale")):ad;else if(r===hc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===hc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===hc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?ac(this.getTexture(r),this.getCache(r+"Scale","vec2")):ad;else if(r===hc.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===hc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===hc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=pn(Yc.x,Yc.y,Yc.y.negate(),Yc.x).mul(e.rg.mul(2).sub(en(1)).normalize().mul(e.b))}else s=Yc;else if(r===hc.IRIDESCENCE_THICKNESS){const e=Cd("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Cd("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===hc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===hc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===hc.IOR)s=this.getFloat(r);else if(r===hc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===hc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===hc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):Yi(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}hc.ALPHA_TEST="alphaTest",hc.COLOR="color",hc.OPACITY="opacity",hc.SHININESS="shininess",hc.SPECULAR="specular",hc.SPECULAR_STRENGTH="specularStrength",hc.SPECULAR_INTENSITY="specularIntensity",hc.SPECULAR_COLOR="specularColor",hc.REFLECTIVITY="reflectivity",hc.ROUGHNESS="roughness",hc.METALNESS="metalness",hc.NORMAL="normal",hc.CLEARCOAT="clearcoat",hc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",hc.CLEARCOAT_NORMAL="clearcoatNormal",hc.EMISSIVE="emissive",hc.ROTATION="rotation",hc.SHEEN="sheen",hc.SHEEN_ROUGHNESS="sheenRoughness",hc.ANISOTROPY="anisotropy",hc.IRIDESCENCE="iridescence",hc.IRIDESCENCE_IOR="iridescenceIOR",hc.IRIDESCENCE_THICKNESS="iridescenceThickness",hc.IOR="ior",hc.TRANSMISSION="transmission",hc.THICKNESS="thickness",hc.ATTENUATION_DISTANCE="attenuationDistance",hc.ATTENUATION_COLOR="attenuationColor",hc.LINE_SCALE="scale",hc.LINE_DASH_SIZE="dashSize",hc.LINE_GAP_SIZE="gapSize",hc.LINE_WIDTH="linewidth",hc.LINE_DASH_OFFSET="dashOffset",hc.POINT_SIZE="size",hc.DISPERSION="dispersion",hc.LIGHT_MAP="light",hc.AO="ao";const pc=ki(hc,hc.ALPHA_TEST),gc=ki(hc,hc.COLOR),mc=ki(hc,hc.SHININESS),fc=ki(hc,hc.EMISSIVE),yc=ki(hc,hc.OPACITY),bc=ki(hc,hc.SPECULAR),xc=ki(hc,hc.SPECULAR_INTENSITY),Tc=ki(hc,hc.SPECULAR_COLOR),_c=ki(hc,hc.SPECULAR_STRENGTH),vc=ki(hc,hc.REFLECTIVITY),Nc=ki(hc,hc.ROUGHNESS),Sc=ki(hc,hc.METALNESS),Ec=ki(hc,hc.NORMAL),wc=ki(hc,hc.CLEARCOAT),Ac=ki(hc,hc.CLEARCOAT_ROUGHNESS),Rc=ki(hc,hc.CLEARCOAT_NORMAL),Cc=ki(hc,hc.ROTATION),Mc=ki(hc,hc.SHEEN),Pc=ki(hc,hc.SHEEN_ROUGHNESS),Bc=ki(hc,hc.ANISOTROPY),Lc=ki(hc,hc.IRIDESCENCE),Fc=ki(hc,hc.IRIDESCENCE_IOR),Ic=ki(hc,hc.IRIDESCENCE_THICKNESS),Dc=ki(hc,hc.TRANSMISSION),Vc=ki(hc,hc.THICKNESS),Uc=ki(hc,hc.IOR),Oc=ki(hc,hc.ATTENUATION_DISTANCE),kc=ki(hc,hc.ATTENUATION_COLOR),Gc=ki(hc,hc.LINE_SCALE),zc=ki(hc,hc.LINE_DASH_SIZE),Hc=ki(hc,hc.LINE_GAP_SIZE),$c=ki(hc,hc.LINE_WIDTH),Wc=ki(hc,hc.LINE_DASH_OFFSET),qc=ki(hc,hc.POINT_SIZE),jc=ki(hc,hc.DISPERSION),Xc=ki(hc,hc.LIGHT_MAP),Kc=ki(hc,hc.AO),Yc=ra(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Qc=$i(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Zc extends js{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Zc.VERTEX)s=e.getVertexIndex();else if(r===Zc.INSTANCE)s=e.getInstanceIndex();else if(r===Zc.DRAW)s=e.getDrawIndex();else if(r===Zc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Zc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Zc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=pu(this).build(e,t)}return i}}Zc.VERTEX="vertex",Zc.INSTANCE="instance",Zc.SUBGROUP="subgroup",Zc.INVOCATION_LOCAL="invocationLocal",Zc.INVOCATION_SUBGROUP="invocationSubgroup",Zc.DRAW="draw";const Jc=ki(Zc,Zc.VERTEX),eh=ki(Zc,Zc.INSTANCE),th=ki(Zc,Zc.SUBGROUP),rh=ki(Zc,Zc.INVOCATION_SUBGROUP),sh=ki(Zc,Zc.INVOCATION_LOCAL),ih=ki(Zc,Zc.DRAW);class nh extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=ll(r.array,"mat4",Math.max(t,1)).element(eh);else{const e=new B(r.array,16,1);this.buffer=e;const t=r.usage===y?Bu:Pu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=mn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new L(s.array,3),t=s.usage===y?Bu:Pu;this.bufferColor=e,n=nn(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Wl).xyz;if(Wl.assign(a),e.hasGeometryAttribute("normal")){const e=ld(rd,i);rd.assign(e)}null!==this.instanceColorNode&&Tn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const ah=Oi(nh).setParameterLength(2,3);class oh extends nh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const uh=Oi(oh).setParameterLength(1);class lh extends js{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=eh:this.batchingIdNode=ih);const t=$i(([e])=>{const t=Qi(el(ol(this.batchMesh._indirectTexture),0).x),r=Qi(e).mod(t),s=Qi(e).div(t);return ol(this.batchMesh._indirectTexture,tn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Qi(el(ol(s),0).x),n=Yi(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=mn(ol(s,tn(a,o)),ol(s,tn(a.add(1),o)),ol(s,tn(a.add(2),o)),ol(s,tn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=$i(([e])=>{const t=Qi(el(ol(l),0).x),r=e,s=r.mod(t),i=r.div(t);return ol(l,tn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Tn("vec3","vBatchColor").assign(t)}const d=gn(u);Wl.assign(u.mul(Wl));const c=rd.div(nn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;rd.assign(h),e.hasGeometryAttribute("tangent")&&Xd.mulAssign(d)}}const dh=Oi(lh).setParameterLength(1);class ch extends Xs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const hh=Oi(ch).setParameterLength(2);class ph extends ul{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=ws(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return hh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Cu(this.value),this._varying=pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const gh=(e,t=null,r=0)=>Ii(new ph(e,t,r)),mh=new WeakMap;class fh extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Qu("skinIndex","uvec4"),this.skinWeightNode=Qu("skinWeight","vec4"),this.bindMatrixNode=Cd("bindMatrix","mat4"),this.bindMatrixInverseNode=Cd("bindMatrixInverse","mat4"),this.boneMatricesNode=Md("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Wl,this.toPositionNode=Wl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=ca(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=rd){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Md("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,ql)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ls(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&ql.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();rd.assign(t),e.hasGeometryAttribute("tangent")&&Xd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;mh.get(t)!==e.frameId&&(mh.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const yh=e=>Ii(new fh(e));class bh extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tIi(new bh(Ui(e,"int"))).toStack(),Th=()=>$u("break").toStack(),_h=new WeakMap,vh=new s,Nh=$i(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Qi(Jc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return ol(e,tn(u,o)).depth(i).xyz.mul(t)});class Sh extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ra(1),this.updateType=Us.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=_h.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new F(m,h,p,a);f.type=I,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Yi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(ol(this.mesh.morphTexture,tn(Qi(e).add(1),Qi(eh))).r):t.assign(Cd("morphTargetInfluences","float").element(e).toVar()),ji(t.notEqual(0),()=>{!0===s&&Wl.addAssign(Nh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(0)})),!0===i&&rd.addAssign(Nh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const Eh=Oi(Sh).setParameterLength(1);class wh extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Ah extends wh{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Rh extends tu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:nn().toVar("directDiffuse"),directSpecular:nn().toVar("directSpecular"),indirectDiffuse:nn().toVar("indirectDiffuse"),indirectSpecular:nn().toVar("indirectSpecular")};return{radiance:nn().toVar("radiance"),irradiance:nn().toVar("irradiance"),iblIrradiance:nn().toVar("iblIrradiance"),ambientOcclusion:Yi(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Ch=Oi(Rh);class Mh extends wh{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Ph,Bh;class Lh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Lh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==Lh.SIZE&&this.scope!==Lh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Lh.VIEWPORT?null!==t?Bh.copy(t.viewport):(e.getViewport(Bh),Bh.multiplyScalar(e.getPixelRatio())):null!==t?(Ph.width=t.width,Ph.height=t.height):e.getDrawingBufferSize(Ph)}setup(){const e=this.scope;let r=null;return r=e===Lh.SIZE?ra(Ph||(Ph=new t)):e===Lh.VIEWPORT?ra(Bh||(Bh=new s)):en(Dh.div(Ih)),r}generate(e){if(this.scope===Lh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Ih).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Lh.COORDINATE="coordinate",Lh.VIEWPORT="viewport",Lh.SIZE="size",Lh.UV="uv";const Fh=ki(Lh,Lh.UV),Ih=ki(Lh,Lh.SIZE),Dh=ki(Lh,Lh.COORDINATE),Vh=ki(Lh,Lh.VIEWPORT),Uh=Vh.zw,Oh=Dh.sub(Vh.xy),kh=Oh.div(Uh),Gh=$i(()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Ih),"vec2").once()(),zh=new t;class Hh extends il{static get type(){return"ViewportTextureNode"}constructor(e=Fh,t=null,r=null){let s=null;null===r?(s=new D,s.minFilter=V,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Us.RENDER,this._textures=new WeakMap}getFrameBufferTexture(e=null){const t=this.referenceNode?this.referenceNode.defaultFramebuffer:this.defaultFramebuffer;if(null===e)return t;if(!1===this._textures.has(e)){const r=t.clone();this._textures.set(e,r)}return this._textures.get(e)}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(zh):zh.set(r.width,r.height);const s=this.getFrameBufferTexture(r);s.image.width===zh.width&&s.image.height===zh.height||(s.image.width=zh.width,s.image.height=zh.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i,this.value=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const $h=Oi(Hh).setParameterLength(0,3),Wh=Oi(Hh,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let qh=null;class jh extends Hh{static get type(){return"ViewportDepthTextureNode"}constructor(e=Fh,t=null){null===qh&&(qh=new U),super(e,t,qh)}}const Xh=Oi(jh).setParameterLength(0,2);class Kh extends js{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Kh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Kh.DEPTH_BASE)null!==r&&(s=ep().assign(r));else if(t===Kh.DEPTH)s=e.isPerspectiveCamera?Qh(Kl.z,ml,fl):Yh(Kl.z,ml,fl);else if(t===Kh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Zh(r,ml,fl);s=Yh(e,ml,fl)}else s=r;else s=Yh(Kl.z,ml,fl);return s}}Kh.DEPTH_BASE="depthBase",Kh.DEPTH="depth",Kh.LINEAR_DEPTH="linearDepth";const Yh=(e,t,r)=>e.add(t).div(t.sub(r)),Qh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Zh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Jh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ka(e.negate().div(t)),i=Ka(r.div(t));return s.div(i)},ep=Oi(Kh,Kh.DEPTH_BASE),tp=ki(Kh,Kh.DEPTH),rp=Oi(Kh,Kh.LINEAR_DEPTH).setParameterLength(0,1),sp=rp(Xh());tp.assign=e=>ep(e);class ip extends js{static get type(){return"ClippingNode"}constructor(e=ip.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===ip.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===ip.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return $i(()=>{const r=Yi().toVar("distanceToPlane"),s=Yi().toVar("distanceToGradient"),i=Yi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=hl(t);xh(n,({i:t})=>{const n=e.element(t);r.assign(Kl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign($o(s.negate(),s,r))})}const a=e.length;if(a>0){const t=hl(e),n=Yi(1).toVar("intersectionClipOpacity");xh(a,({i:e})=>{const i=t.element(e);r.assign(Kl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign($o(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}_n.a.mulAssign(i),_n.a.equal(0).discard()})()}setupDefault(e,t){return $i(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=hl(t);xh(r,({i:t})=>{const r=e.element(t);Kl.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=hl(e),r=Ji(!0).toVar("clipped");xh(s,({i:e})=>{const s=t.element(e);r.assign(Kl.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),$i(()=>{const s=hl(e),i=pl(t.getClipDistance());xh(r,({i:e})=>{const t=s.element(e),r=Kl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}ip.ALPHA_TO_COVERAGE="alphaToCoverage",ip.DEFAULT="default",ip.HARDWARE="hardware";const np=$i(([e])=>to(pa(1e4,ro(pa(17,e.x).add(pa(.1,e.y)))).mul(ca(.1,uo(ro(pa(13,e.y).add(e.x))))))),ap=$i(([e])=>np(en(np(e.xy),e.z))),op=$i(([e])=>{const t=wo(co(go(e.xyz)),co(mo(e.xyz))),r=Yi(1).div(Yi(.05).mul(t)).toVar("pixScale"),s=en(ja(Za(Ka(r))),ja(Ja(Ka(r)))),i=en(ap(Za(s.x.mul(e.xyz))),ap(Za(s.y.mul(e.xyz)))),n=to(Ka(r)),a=ca(pa(n.oneMinus(),i.x),pa(n,i.y)),o=Eo(n,n.oneMinus()),u=nn(a.mul(a).div(pa(2,o).mul(ha(1,o))),a.sub(pa(.5,o)).div(ha(1,o)),ha(1,ha(1,a).mul(ha(1,a)).div(pa(2,o).mul(ha(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Go(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class up extends Yu{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const lp=(e=0)=>Ii(new up(e)),dp=$i(([e,t])=>Eo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),cp=$i(([e,t])=>Eo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hp=$i(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pp=$i(([e,t])=>ko(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ao(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),gp=$i(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ln(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),mp=$i(([e])=>ln(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),fp=$i(([e])=>(ji(e.a.equal(0),()=>ln(0)),ln(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class yp extends O{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>cu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=cu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.add(a);const i=ln(s,_n.a).max(0);n=this.setupOutput(e,i),On.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&On.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ln(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Ii(new ip(ip.ALPHA_TO_COVERAGE)):e.stack.add(Ii(new ip))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Ii(new ip(ip.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Jh(Kl.z,ml,fl):Yh(Kl.z,ml,fl))}null!==s&&tp.assign(s).toStack()}setupPositionView(){return kl.mul(Wl).xyz}setupModelViewProjection(){return yl.mul(Kl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Qc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&Eh(t).toStack(),!0===t.isSkinnedMesh&&yh(t).toStack(),this.displacementMap){const e=Bd("displacementMap","texture"),t=Bd("displacementScale","float"),r=Bd("displacementBias","float");Wl.addAssign(rd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&dh(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&uh(t).toStack(),null!==this.positionNode&&Wl.assign(cu(this.positionNode,"POSITION","vec3")),Wl}setupDiffuseColor({object:e,geometry:t}){null!==this.maskNode&&Ji(this.maskNode).not().discard();let r=this.colorNode?ln(this.colorNode):gc;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(lp())),e.instanceColor){r=Tn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Tn("vec3","vBatchColor").mul(r)}_n.assign(r);const s=this.opacityNode?Yi(this.opacityNode):yc;_n.a.assign(_n.a.mul(s));let i=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(i=null!==this.alphaTestNode?Yi(this.alphaTestNode):pc,_n.a.lessThanEqual(i).discard()),!0===this.alphaHash&&_n.a.lessThan(op(Wl)).discard();!1===this.transparent&&this.blending===k&&!1===this.alphaToCoverage?_n.a.assign(1):null===i&&_n.a.lessThanEqual(0).discard()}setupVariants(){}setupOutgoingLight(){return!0===this.lights?nn(0):_n.rgb}setupNormal(){return this.normalNode?nn(this.normalNode):Ec}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Bd("envMap","cubeTexture"):Bd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Mh(Xc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Kc;t.push(new Ah(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Ch(n,t,r,s)}else null!==r&&(a=nn(null!==s?ko(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(vn.assign(nn(i||fc)),a=a.add(vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(On.assign(t),t=ln(r.toVar())),t}setupPremultipliedAlpha(e,t){return mp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=O.prototype.toJSON.call(this,e),s=Ns(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const bp=new G;class xp extends yp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(bp),this.setValues(e)}}const Tp=new z;class _p extends yp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Tp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Yi(this.offsetNode):Wc,t=this.dashScaleNode?Yi(this.dashScaleNode):Gc,r=this.dashSizeNode?Yi(this.dashSizeNode):zc,s=this.gapSizeNode?Yi(this.gapSizeNode):Hc;kn.assign(r),Gn.assign(s);const i=pu(Qu("lineDistance").mul(t));(e?i.add(e):i).mod(kn.add(Gn)).greaterThan(kn).discard()}}let vp=null;class Np extends Hh{static get type(){return"ViewportSharedTextureNode"}constructor(e=Fh,t=null){null===vp&&(vp=new D),super(e,t,vp)}updateReference(){return this}}const Sp=Oi(Np).setParameterLength(0,2),Ep=new z;class wp extends yp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Ep),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=H,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=$i(({start:e,end:t})=>{const r=yl.element(2).element(2),s=yl.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ln(ko(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=$i(()=>{const e=Qu("instanceStart"),t=Qu("instanceEnd"),r=ln(kl.mul(ln(e,1))).toVar("start"),s=ln(kl.mul(ln(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Yi(this.dashScaleNode):Gc,t=this.offsetNode?Yi(this.offsetNode):Wc,r=Qu("instanceDistanceStart"),s=Qu("instanceDistanceEnd");let i=$l.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Tn("float","lineDistance").assign(i)}n&&(Tn("vec3","worldStart").assign(r.xyz),Tn("vec3","worldEnd").assign(s.xyz));const o=Vh.z.div(Vh.w),u=yl.element(2).element(3).equal(-1);ji(u,()=>{ji(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=yl.mul(r),d=yl.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=ln().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ko(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Tn("vec4","worldPos");o.assign($l.y.lessThan(.5).select(r,s));const u=$c.mul(.5);o.addAssign(ln($l.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(ln($l.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(ln(a.mul(u),0)),ji($l.y.greaterThan(1).or($l.y.lessThan(0)),()=>{o.subAssign(ln(a.mul(2).mul(u),0))})),g.assign(yl.mul(o));const l=nn().toVar();l.assign($l.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=en(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign($l.x.lessThan(0).select(e.negate(),e)),ji($l.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf($l.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul($c)),e.assign(e.div(Vh.w)),g.assign($l.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ln(e,0,0)))}return g})();const o=$i(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return en(h,p)});if(this.colorNode=$i(()=>{const e=Zu();if(i){const t=this.dashSizeNode?Yi(this.dashSizeNode):zc,r=this.gapSizeNode?Yi(this.gapSizeNode):Hc;kn.assign(t),Gn.assign(r);const s=Tn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(kn.add(Gn)).greaterThan(kn).discard()}const a=Yi(1).toVar("alpha");if(n){const e=Tn("vec3","worldStart"),s=Tn("vec3","worldEnd"),n=Tn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:nn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div($c);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign($o(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=Yi(s.fwidth()).toVar("dlen");ji(e.y.abs().greaterThan(1),()=>{a.assign($o(i.oneMinus(),i.add(1),s).oneMinus())})}else ji(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Qu("instanceColorStart"),t=Qu("instanceColorEnd");u=$l.y.lessThan(.5).select(e,t).mul(gc)}else u=gc;return ln(u,a)})(),this.transparent){const e=this.opacityNode?Yi(this.opacityNode):yc;this.outputNode=ln(this.colorNode.rgb.mul(e).add(Sp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Ap=e=>Ii(e).mul(.5).add(.5),Rp=new $;class Cp extends yp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Rp),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Yi(this.opacityNode):yc;_n.assign(Tu(ln(Ap(ad),e),W))}}const Mp=$i(([e=Xl])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return en(t,r)});class Pp extends q{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new j(5,5,5),n=Mp(Xl),a=new yp;a.colorNode=al(t,n,0),a.side=S,a.blending=H;const o=new X(i,a),u=new K;u.add(o),t.minFilter===V&&(t.minFilter=Y);const l=new Q(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Bp=new WeakMap;class Lp extends Ys{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=wd(null);const t=new A;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Z||r===J){if(Bp.has(e)){const t=Bp.get(e);Ip(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Pp(r.height);s.fromEquirectangularTexture(t,e),Ip(s.texture,e.mapping),this._cubeTexture=s.texture,Bp.set(e,s.texture),e.addEventListener("dispose",Fp)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Fp(e){const t=e.target;t.removeEventListener("dispose",Fp);const r=Bp.get(t);void 0!==r&&(Bp.delete(t),r.dispose())}function Ip(e,t){t===Z?e.mapping=R:t===J&&(e.mapping=C)}const Dp=Oi(Lp).setParameterLength(1);class Vp extends wh{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Dp(this.envNode)}}class Up extends wh{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Yi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class Op{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class kp extends Op{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(ln(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(ln(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(_n.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case re:s.rgb.assign(ko(s.rgb,s.rgb.mul(i.rgb),_c.mul(vc)));break;case te:s.rgb.assign(ko(s.rgb,i.rgb,_c.mul(vc)));break;case ee:s.rgb.addAssign(i.rgb.mul(_c.mul(vc)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const Gp=new se;class zp extends yp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Gp),this.setValues(e)}setupNormal(){return ed(id)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Up(Xc)),t}setupOutgoingLight(){return _n.rgb}setupLightingModel(){return new kp}}const Hp=$i(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),$p=$i(e=>e.diffuseColor.mul(1/Math.PI)),Wp=$i(({dotNH:e})=>Un.mul(Yi(.5)).add(1).mul(Yi(1/Math.PI)).mul(e.pow(Un))),qp=$i(({lightDirection:e})=>{const t=e.add(Yl).normalize(),r=ad.dot(t).clamp(),s=Yl.dot(t).clamp(),i=Hp({f0:Dn,f90:1,dotVH:s}),n=Yi(.25),a=Wp({dotNH:r});return i.mul(n).mul(a)});class jp extends kp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=ad.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul($p({diffuseColor:_n.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(qp({lightDirection:e})).mul(_c))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul($p({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Xp=new ie;class Kp extends yp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Xp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightingModel(){return new jp(!1)}}const Yp=new ne;class Qp extends yp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Yp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Vp(t):null}setupLightingModel(){return new jp}setupVariants(){const e=(this.shininessNode?Yi(this.shininessNode):mc).max(1e-4);Un.assign(e);const t=this.specularNode||bc;Dn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Zp=$i(e=>{if(!1===e.geometry.hasAttribute("normal"))return Yi(0);const t=id.dFdx().abs().max(id.dFdy().abs());return t.x.max(t.y).max(t.z)}),Jp=$i(e=>{const{roughness:t}=e,r=Zp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),eg=$i(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return ga(.5,i.add(n).max(Ua))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),tg=$i(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(nn(e.mul(r),t.mul(s),a).length()),l=a.mul(nn(e.mul(i),t.mul(n),o).length());return ga(.5,u.add(l)).saturate()}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),rg=$i(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),sg=Yi(1/Math.PI),ig=$i(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=nn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return sg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),ng=$i(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=ad,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Yl).normalize(),d=n.dot(e).clamp(),c=n.dot(Yl).clamp(),h=n.dot(l).clamp(),p=Yl.dot(l).clamp();let g,m,f=Hp({f0:t,f90:r,dotVH:p});if(Bi(a)&&(f=Cn.mix(f,i)),Bi(o)){const t=Fn.dot(e),r=Fn.dot(Yl),s=Fn.dot(l),i=In.dot(e),n=In.dot(Yl),a=In.dot(l);g=tg({alphaT:Bn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=ig({alphaT:Bn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=eg({alpha:u,dotNL:d,dotNV:c}),m=rg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),ag=$i(({roughness:e,dotNV:t})=>{const r=ln(-1,-.0275,-.572,.022),s=ln(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return en(-1.04,1.04).mul(n).add(i.zw)}).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),og=$i(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=ag({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),ug=$i(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(nn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),lg=$i(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Yi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Yi(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),dg=$i(({dotNV:e,dotNL:t})=>Yi(1).div(Yi(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),cg=$i(({lightDirection:e})=>{const t=e.add(Yl).normalize(),r=ad.dot(e).clamp(),s=ad.dot(Yl).clamp(),i=ad.dot(t).clamp(),n=lg({roughness:Rn,dotNH:i}),a=dg({dotNV:s,dotNL:r});return An.mul(n).mul(a)}),hg=$i(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=en(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),pg=$i(({f:e})=>{const t=e.length();return wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),gg=$i(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,wo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),mg=$i(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=nn().toVar();return ji(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(gn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=nn(0).toVar();f.addAssign(gg({v1:h,v2:p})),f.addAssign(gg({v1:p,v2:g})),f.addAssign(gg({v1:g,v2:m})),f.addAssign(gg({v1:m,v2:h})),c.assign(nn(pg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),fg=$i(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=nn().toVar();return ji(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=nn(0).toVar();d.addAssign(gg({v1:n,v2:a})),d.addAssign(gg({v1:a,v2:o})),d.addAssign(gg({v1:o,v2:l})),d.addAssign(gg({v1:l,v2:n})),u.assign(nn(pg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),yg=1/6,bg=e=>pa(yg,pa(e,pa(e,e.negate().add(3)).sub(3)).add(1)),xg=e=>pa(yg,pa(e,pa(e,pa(3,e).sub(6))).add(4)),Tg=e=>pa(yg,pa(e,pa(e,pa(-3,e).add(3)).add(3)).add(1)),_g=e=>pa(yg,Lo(e,3)),vg=e=>bg(e).add(xg(e)),Ng=e=>Tg(e).add(_g(e)),Sg=e=>ca(-1,xg(e).div(bg(e).add(xg(e)))),Eg=e=>ca(1,_g(e).div(Tg(e).add(_g(e)))),wg=(e,t,r)=>{const s=e.uvNode,i=pa(s,t.zw).add(.5),n=Za(i),a=to(i),o=vg(a.x),u=Ng(a.x),l=Sg(a.x),d=Eg(a.x),c=Sg(a.y),h=Eg(a.y),p=en(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=en(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=en(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=en(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=vg(a.y).mul(ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Ng(a.y).mul(ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Ag=$i(([e,t])=>{const r=en(e.size(Qi(t))),s=en(e.size(Qi(t.add(1)))),i=ga(1,r),n=ga(1,s),a=wg(e,ln(i,r),Za(t)),o=wg(e,ln(n,s),Ja(t));return to(t).mix(a,o)}),Rg=$i(([e,t])=>{const r=t.mul(rl(e));return Ag(e,r)}),Cg=$i(([e,t,r,s,i])=>{const n=nn(Ho(t.negate(),eo(e),ga(1,s))),a=nn(co(i[0].xyz),co(i[1].xyz),co(i[2].xyz));return eo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),Mg=$i(([e,t])=>e.mul(Go(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Pg=Wh(),Bg=Wh(),Lg=$i(([e,t,r],{material:s})=>{const i=(s.side===S?Pg:Bg).sample(e),n=Ka(Ih.x).mul(Mg(t,r));return Ag(i,n)}),Fg=$i(([e,t,r])=>(ji(r.notEqual(0),()=>{const s=Xa(t).negate().div(r);return qa(s.negate().mul(e))}),nn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Ig=$i(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ln().toVar(),f=nn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=nn(d.sub(i),d,d.add(i));xh({start:0,end:3},({i:i})=>{const d=n.element(i),g=Cg(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(ln(y,1))),x=en(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(en(x.x,x.y.oneMinus()));const T=Lg(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Fg(co(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Cg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(ln(n,1))),y=en(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(en(y.x,y.y.oneMinus())),m=Lg(y,r,d),f=s.mul(Fg(co(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=nn(og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ln(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Dg=gn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Vg=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Ug=$i(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ko(e,t,$o(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ji(a.lessThan(0),()=>nn(1));const o=a.sqrt(),u=Vg(n,e),l=Hp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Yi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return nn(1).add(t).div(nn(1).sub(t))})(i.clamp(0,.9999)),g=Vg(p,n.toVec3()),m=Hp({f0:g,f90:1,dotVH:o}),f=nn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=nn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(nn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return xh({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=nn(54856e-17,44201e-17,52481e-17),i=nn(1681e3,1795300,2208400),n=nn(43278e5,93046e5,66121e5),a=Yi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=nn(o.x.add(a),o.y,o.z).div(1.0685e-7),Dg.mul(o)})(Yi(e).mul(y),Yi(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(nn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),Og=$i(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=eu(r.lessThan(.25),Yi(-339.2).mul(i).add(Yi(161.4).mul(r)).sub(25.9),Yi(-8.48).mul(i).add(Yi(14.3).mul(r)).sub(9.95)),a=eu(r.lessThan(.25),Yi(44).mul(i).sub(Yi(23.7).mul(r)).add(3.26),Yi(1.97).mul(i).sub(Yi(3.27).mul(r)).add(.72));return eu(r.lessThan(.25),0,Yi(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()}),kg=nn(.04),Gg=Yi(1);class zg extends Op{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=nn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=nn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=nn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=nn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=nn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=ad.dot(Yl).clamp();this.iridescenceFresnel=Ug({outsideIOR:Yi(1),eta2:Mn,cosTheta1:e,thinFilmThickness:Pn,baseF0:Dn}),this.iridescenceF0=ug({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=jl,r=vl.sub(jl).normalize(),s=od,i=e.context;i.backdrop=Ig(s,r,Nn,_n,Dn,Vn,t,Ll,xl,yl,Hn,Wn,jn,qn,this.dispersion?Xn:null),i.backdropAlpha=$n,_n.a.mulAssign(ko(1,i.backdrop.a,$n))}super.start(e)}computeMultiscattering(e,t,r){const s=ad.dot(Yl).clamp(),i=ag({roughness:Nn,dotNV:s}),n=(this.iridescenceF0?Cn.mix(Dn,this.iridescenceF0):Dn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Dn.add(Dn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=ad.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(cg({lightDirection:e}))),!0===this.clearcoat){const r=ud.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(ng({lightDirection:e,f0:kg,f90:Gg,roughness:wn,normalView:ud})))}r.directDiffuse.addAssign(s.mul($p({diffuseColor:_n.rgb}))),r.directSpecular.addAssign(s.mul(ng({lightDirection:e,f0:Dn,f90:1,roughness:Nn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=ad,h=Yl,p=Kl.toVar(),g=hg({N:c,V:h,roughness:Nn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=gn(nn(m.x,0,m.y),nn(0,1,0),nn(m.z,0,m.w)).toVar(),b=Dn.mul(f.x).add(Dn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(mg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(_n).mul(mg({N:c,V:h,P:p,mInv:gn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul($p({diffuseColor:_n})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(An,Og({normal:ad,viewDir:Yl,roughness:Rn}))),!0===this.clearcoat){const e=ud.dot(Yl).clamp(),t=og({dotNV:e,specularColor:kg,specularF90:Gg,roughness:wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=nn().toVar("singleScattering"),n=nn().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Vn);const o=i.add(n),u=_n.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=ad.dot(Yl).clamp().add(t),i=Nn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ud.dot(Yl).clamp(),r=Hp({dotVH:e,f0:kg,f90:Gg}),s=t.mul(En.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(En));t.assign(s)}if(!0===this.sheen){const e=An.r.max(An.g).max(An.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Hg=Yi(1),$g=Yi(-2),Wg=Yi(.8),qg=Yi(-1),jg=Yi(.4),Xg=Yi(2),Kg=Yi(.305),Yg=Yi(3),Qg=Yi(.21),Zg=Yi(4),Jg=Yi(4),em=Yi(16),tm=$i(([e])=>{const t=nn(uo(e)).toVar(),r=Yi(-1).toVar();return ji(t.x.greaterThan(t.z),()=>{ji(t.x.greaterThan(t.y),()=>{r.assign(eu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}).Else(()=>{ji(t.z.greaterThan(t.y),()=>{r.assign(eu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),rm=$i(([e,t])=>{const r=en().toVar();return ji(t.equal(0),()=>{r.assign(en(e.z,e.y).div(uo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(en(e.x.negate(),e.z.negate()).div(uo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(en(e.x.negate(),e.y).div(uo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(en(e.z.negate(),e.y).div(uo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(en(e.x.negate(),e.z).div(uo(e.y)))}).Else(()=>{r.assign(en(e.x,e.y).div(uo(e.z)))}),pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),sm=$i(([e])=>{const t=Yi(0).toVar();return ji(e.greaterThanEqual(Wg),()=>{t.assign(Hg.sub(e).mul(qg.sub($g)).div(Hg.sub(Wg)).add($g))}).ElseIf(e.greaterThanEqual(jg),()=>{t.assign(Wg.sub(e).mul(Xg.sub(qg)).div(Wg.sub(jg)).add(qg))}).ElseIf(e.greaterThanEqual(Kg),()=>{t.assign(jg.sub(e).mul(Yg.sub(Xg)).div(jg.sub(Kg)).add(Xg))}).ElseIf(e.greaterThanEqual(Qg),()=>{t.assign(Kg.sub(e).mul(Zg.sub(Yg)).div(Kg.sub(Qg)).add(Yg))}).Else(()=>{t.assign(Yi(-2).mul(Ka(pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),im=$i(([e,t])=>{const r=e.toVar();r.assign(pa(2,r).sub(1));const s=nn(r,1).toVar();return ji(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),nm=$i(([e,t,r,s,i,n])=>{const a=Yi(r),o=nn(t),u=Go(sm(a),$g,n),l=to(u),d=Za(u),c=nn(am(e,o,d,s,i,n)).toVar();return ji(l.notEqual(0),()=>{const t=nn(am(e,o,d.add(1),s,i,n)).toVar();c.assign(ko(c,t,l))}),c}),am=$i(([e,t,r,s,i,n])=>{const a=Yi(r).toVar(),o=nn(t),u=Yi(tm(o)).toVar(),l=Yi(wo(Jg.sub(a),0)).toVar();a.assign(wo(a,Jg));const d=Yi(ja(a)).toVar(),c=en(rm(o,u).mul(d.sub(2)).add(1)).toVar();return ji(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(pa(3,em))),c.y.addAssign(pa(4,ja(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(en(),en())}),om=$i(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=so(s),l=r.mul(u).add(i.cross(r).mul(ro(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return am(e,l,t,n,a,o)}),um=$i(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=nn(eu(t,r,Bo(r,s))).toVar();ji(h.equal(nn(0)),()=>{h.assign(nn(s.z,0,s.x.negate()))}),h.assign(eo(h));const p=nn().toVar();return p.addAssign(i.element(0).mul(om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),xh({start:Qi(1),end:e},({i:e})=>{ji(e.greaterThanEqual(n),()=>{Th()});const t=Yi(a.mul(Yi(e))).toVar();p.addAssign(i.element(e).mul(om({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),ln(p,1)}),lm=[.125,.215,.35,.446,.526,.582],dm=20,cm=new ae(-1,1,1,-1,0,1),hm=new oe(90,1),pm=new e;let gm=null,mm=0,fm=0;const ym=(1+Math.sqrt(5))/2,bm=1/ym,xm=[new r(-ym,bm,0),new r(ym,bm,0),new r(-bm,0,ym),new r(bm,0,ym),new r(0,ym,-bm),new r(0,ym,bm),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Tm=new r,_m=new WeakMap,vm=[3,1,5,0,4,2],Nm=im(Zu(),Qu("faceIndex")).normalize(),Sm=nn(Nm.x,Nm.y,Nm.z);class Em{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Tm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}gm=this._renderer.getRenderTarget(),mm=this._renderer.getActiveCubeFace(),fm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Cm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Mm(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===R||e.mapping===C?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=lm[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=vm[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new pe;_.setAttribute("position",new ge(b,m)),_.setAttribute("uv",new ge(x,f)),_.setAttribute("faceIndex",new ge(T,y)),t.push(_),i.push(new X(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(t)),this._blurMaterial=function(e,t,s){const i=hl(new Array(dm).fill(0)),n=ra(new r(0,1,0)),a=ra(0),o=Yi(dm),u=ra(0),l=ra(1),d=al(null),c=ra(0),h=Yi(1/t),p=Yi(1/s),g=Yi(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Sm,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Rm("blur");return f.fragmentNode=um({...m,latitudinal:u.equal(1)}),_m.set(f,m),f}(t,e.width,e.height)}}async _compileMaterial(e){const t=new X(this._lodPlanes[0],e);await this._renderer.compile(t,cm)}_sceneToCubeUV(e,t,r,s,i){const n=hm;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(pm),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new se({name:"PMREM.Background",side:S,depthWrite:!1,depthTest:!1});d=new X(new j,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(pm),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Am(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===R||e.mapping===C;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Cm(e)):null===this._equirectMaterial&&(this._equirectMaterial=Mm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Am(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,cm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tdm&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),o.setRenderTarget(t),o.render(l,cm)}}function wm(e,t){const r=new ue(e,t,{magFilter:Y,minFilter:Y,generateMipmaps:!1,type:ce,format:de,colorSpace:le});return r.texture.mapping=he,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Am(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Rm(e){const t=new yp;return t.depthTest=!1,t.depthWrite=!1,t.blending=H,t.name=`PMREM_${e}`,t}function Cm(e){const t=Rm("cubemap");return t.fragmentNode=wd(e,Sm),t}function Mm(e){const t=Rm("equirect");return t.fragmentNode=al(e,Mp(Sm),0),t}const Pm=new WeakMap;function Bm(e,t,r){const s=function(e){let t=Pm.get(e);void 0===t&&(t=new WeakMap,Pm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Lm extends Ys{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new x;s.isRenderTargetTexture=!0,this._texture=al(s),this._width=ra(0),this._height=ra(0),this._maxMip=ra(0),this.updateBeforeType=Us.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Bm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Em(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=bd.mul(nn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),nm(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Fm=Oi(Lm).setParameterLength(1,3),Im=new WeakMap;class Dm extends wh{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Im.get(e);void 0===s&&(s=Fm(e),Im.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?ic:ad,i=r.context(Vm(Nn,s)).mul(yd),n=r.context(Um(od)).mul(Math.PI).mul(yd),a=Vu(i),o=Vu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Vm(wn,ud)).mul(yd),t=Vu(e);u.addAssign(t)}}}const Vm=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Yl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(xl)),r),getTextureLevel:()=>e}},Um=e=>({getUV:()=>e,getTextureLevel:()=>Yi(1)}),Om=new me;class km extends yp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Om),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Dm(t):null}setupLightingModel(){return new zg}setupSpecular(){const e=ko(nn(.04),_n.rgb,Sn);Dn.assign(e),Vn.assign(1)}setupVariants(){const e=this.metalnessNode?Yi(this.metalnessNode):Sc;Sn.assign(e);let t=this.roughnessNode?Yi(this.roughnessNode):Nc;t=Jp({roughness:t}),Nn.assign(t),this.setupSpecular(),_n.assign(ln(_n.rgb.mul(e.oneMinus()),_n.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Gm=new fe;class zm extends km{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(Gm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Yi(this.iorNode):Uc;Hn.assign(e),Dn.assign(ko(Eo(Fo(Hn.sub(1).div(Hn.add(1))).mul(Tc),nn(1)).mul(xc),_n.rgb,Sn)),Vn.assign(ko(xc,1,Sn))}setupLightingModel(){return new zg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Yi(this.clearcoatNode):wc,t=this.clearcoatRoughnessNode?Yi(this.clearcoatRoughnessNode):Ac;En.assign(e),wn.assign(Jp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?nn(this.sheenNode):Mc,t=this.sheenRoughnessNode?Yi(this.sheenRoughnessNode):Pc;An.assign(e),Rn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Yi(this.iridescenceNode):Lc,t=this.iridescenceIORNode?Yi(this.iridescenceIORNode):Fc,r=this.iridescenceThicknessNode?Yi(this.iridescenceThicknessNode):Ic;Cn.assign(e),Mn.assign(t),Pn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?en(this.anisotropyNode):Bc).toVar();Ln.assign(e.length()),ji(Ln.equal(0),()=>{e.assign(en(1,0))}).Else(()=>{e.divAssign(en(Ln)),Ln.assign(Ln.saturate())}),Bn.assign(Ln.pow2().mix(Nn.pow2(),1)),Fn.assign(rc[0].mul(e.x).add(rc[1].mul(e.y))),In.assign(rc[1].mul(e.x).sub(rc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Yi(this.transmissionNode):Dc,t=this.thicknessNode?Yi(this.thicknessNode):Vc,r=this.attenuationDistanceNode?Yi(this.attenuationDistanceNode):Oc,s=this.attenuationColorNode?nn(this.attenuationColorNode):kc;if($n.assign(e),Wn.assign(t),qn.assign(r),jn.assign(s),this.useDispersion){const e=this.dispersionNode?Yi(this.dispersionNode):jc;Xn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?nn(this.clearcoatNormalNode):Rc}setup(e){e.context.setupClearcoatNormal=()=>cu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Hm extends zg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(ad.mul(a)).normalize(),h=Yi(Yl.dot(c.negate()).saturate().pow(l).mul(d)),p=nn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class $m extends zm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Yi(.1),this.thicknessAmbientNode=Yi(0),this.thicknessAttenuationNode=Yi(.1),this.thicknessPowerNode=Yi(2),this.thicknessScaleNode=Yi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Hm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Wm=$i(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=en(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Bd("gradientMap","texture").context({getUV:()=>i});return nn(e.r)}{const e=i.fwidth().mul(.5);return ko(nn(.7),nn(1),$o(Yi(.7).sub(e.x),Yi(.7).add(e.x),i.x))}});class qm extends Op{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Wm({normal:td,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul($p({diffuseColor:_n.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul($p({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const jm=new ye;class Xm extends yp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(jm),this.setValues(e)}setupLightingModel(){return new qm}}const Km=$i(()=>{const e=nn(Yl.z,0,Yl.x.negate()).normalize(),t=Yl.cross(e);return en(e.dot(ad),t.dot(ad)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Ym=new be;class Qm extends yp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Ym),this.setValues(e)}setupVariants(e){const t=Km;let r;r=e.material.matcap?Bd("matcap","texture").context({getUV:()=>t}):nn(ko(.2,.8,t.y)),_n.rgb.mulAssign(r.rgb)}}class Zm extends Ys{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return pn(e,s,s.negate(),e).mul(r)}{const e=t,s=mn(ln(1,0,0,0),ln(0,so(e.x),ro(e.x).negate(),0),ln(0,ro(e.x),so(e.x),0),ln(0,0,0,1)),i=mn(ln(so(e.y),0,ro(e.y),0),ln(0,1,0,0),ln(ro(e.y).negate(),0,so(e.y),0),ln(0,0,0,1)),n=mn(ln(so(e.z),ro(e.z).negate(),0,0),ln(ro(e.z),so(e.z),0,0),ln(0,0,1,0),ln(0,0,0,1));return s.mul(i).mul(n).mul(ln(r,1)).xyz}}}const Jm=Oi(Zm).setParameterLength(2),ef=new xe;class tf extends yp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ef),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=kl.mul(nn(i||0));let u=en(Ll[0].xyz.length(),Ll[1].xyz.length());if(null!==a&&(u=u.mul(en(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=Yi(2).div(yl.element(1).element(1));u=u.mul(e.mul(2))}let l=$l.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ii(new vu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Yi(n||Cc),c=Jm(l,d);return ln(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const rf=new Te;class sf extends tf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(rf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return kl.mul(nn(e||Wl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=$l.xy.toVar(),a=Vh.z.div(Vh.w);if(r&&r.isNode){const e=Yi(r);n.assign(Jm(n,e))}let o=null!==i?en(i):qc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Kl.z.negate()))),s&&s.isNode&&(o=o.mul(en(s))),n.mulAssign(o.mul(2)),n.assign(n.div(Vh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(ln(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class nf extends Op{constructor(){super(),this.shadowNode=Yi(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){_n.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(_n.rgb)}}const af=new _e;class of extends yp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(af),this.setValues(e)}setupLightingModel(){return new nf}}const uf=xn("vec3"),lf=xn("vec3"),df=xn("vec3");class cf extends Op{constructor(){super()}start(e){const{material:t,context:r}=e,s=xn("vec3"),i=xn("vec3");ji(vl.sub(jl).length().greaterThan(Vl.mul(2)),()=>{s.assign(vl),i.assign(jl)}).Else(()=>{s.assign(jl),i.assign(vl)});const n=i.sub(s),a=ra("int").onRenderUpdate(({material:e})=>e.steps),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=Yi(0).toVar(),d=nn(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),xh(a,()=>{const i=s.add(u.mul(l)),n=xl.mul(ln(i,1)).xyz;let a;null!==t.depthNode&&(lf.assign(rp(Qh(n.z,ml,fl))),r.sceneDepthNode=rp(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,uf.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&uf.mulAssign(a);const c=uf.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)}),df.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ji(r.greaterThanEqual(lf),()=>{uf.addAssign(e)}):uf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(fg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(df)}}class hf extends yp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=S,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new cf}}class pf{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class gf{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const yf=[];class bf{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);yf[0]=e,yf[1]=t,yf[2]=n,yf[3]=i;let l=u.get(yf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(yf,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),yf.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new gf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new ff(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class xf{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Tf=1,_f=2,vf=3,Nf=4,Sf=16;class Ef extends xf{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Tf?this.backend.createAttribute(e):t===_f?this.backend.createIndexAttribute(e):t===vf?this.backend.createStorageAttribute(e):t===Nf&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,vf):this.updateAttribute(e,Tf);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,_f);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Nf)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Af(t),e.set(t,r)):r.version!==wf(t)&&(this.attributes.delete(r),r=Af(t),e.set(t,r)),s=r}return s}}class Cf{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class Mf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Pf extends Mf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Bf extends Mf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Lf=0;class Ff{constructor(e,t,r,s=null,i=null){this.id=Lf++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class If extends xf{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ff(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ff(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ff(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Bf(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new Pf(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Df extends xf{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Nf:vf;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Nf:vf;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else t.isSampler&&t.update()}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Vf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Of(e){return(e.transmission>0||e.transmissionNode)&&e.side===E&&!1===e.forceSinglePass}class kf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Of(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(Of(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Vf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Uf),this.transparent.length>1&&this.transparent.sort(t||Uf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new U,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:T,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Yf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Zf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class Jf extends bn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class ey extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Fi(t);return this._currentCond=eu(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=eu(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Ii(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=0;for(const r of this.membersLayout){const s=r.type,i=Cs(s)*e,n=t%8,a=n%Ms(s),o=n+a;t+=a,0!==o&&8-oe.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class sy extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class iy extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),dy=(e,t)=>Lo(pa(4,e.mul(ha(1,e))),t),cy=$i(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),hy=$i(([e])=>nn(cy(e.z.add(cy(e.y.mul(1)))),cy(e.z.add(cy(e.x.mul(1)))),cy(e.y.add(cy(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),py=$i(([e,t,r])=>{const s=nn(e).toVar(),i=Yi(1.4).toVar(),n=Yi(0).toVar(),a=nn(s).toVar();return xh({start:Yi(0),end:Yi(3),type:"float",condition:"<="},()=>{const e=nn(hy(a.mul(2))).toVar();s.addAssign(e.add(r.mul(Yi(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=Yi(cy(s.z.add(cy(s.x.add(cy(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class gy extends js{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const my=Oi(gy),fy=e=>(...t)=>my(e,...t),yy=ra(0).setGroup(Jn).onRenderUpdate(e=>e.time),by=ra(0).setGroup(Jn).onRenderUpdate(e=>e.deltaTime),xy=ra(0,"uint").setGroup(Jn).onRenderUpdate(e=>e.frameId),Ty=$i(([e,t,r=en(.5)])=>Jm(e.sub(r),t).add(r)),_y=$i(([e,t,r=en(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),vy=$i(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Ll.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Ll;const i=xl.mul(s);return Bi(t)&&(i[0][0]=Ll[0].length(),i[0][1]=0,i[0][2]=0),Bi(r)&&(i[1][0]=0,i[1][1]=Ll[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,yl.mul(i).mul(Wl)}),Ny=$i(([e=null])=>{const t=rp();return rp(Xh(e)).sub(t).lessThan(0).select(Fh,e)});class Sy extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Zu(),r=Yi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=en(a,o);return t.add(l).mul(u)}}const Ey=Oi(Sy).setParameterLength(3),wy=$i(([e,t=null,r=null,s=Yi(1),i=Wl,n=rd])=>{let a=n.abs().normalize();a=a.div(a.dot(nn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=al(d,o).mul(a.x),g=al(c,u).mul(a.y),m=al(h,l).mul(a.z);return ca(p,g,m)}),Ay=new Me,Ry=new r,Cy=new r,My=new r,Py=new a,By=new r(0,0,-1),Ly=new s,Fy=new r,Iy=new r,Dy=new s,Vy=new t,Uy=new ue,Oy=Fh.flipX();Uy.depthTexture=new U(1,1);let ky=!1;class Gy extends il{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Uy.texture,Oy),this._reflectorBaseNode=e.reflector||new zy(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Ii(new Gy({defaultTexture:Uy.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class zy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Vy),e.setSize(Math.round(Vy.width*r),Math.round(Vy.height*r))}setup(e){return this._updateResolution(Uy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ue(0,0,{type:ce,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new U),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&ky)return!1;ky=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Vy),this._updateResolution(o,s),Cy.setFromMatrixPosition(n.matrixWorld),My.setFromMatrixPosition(r.matrixWorld),Py.extractRotation(n.matrixWorld),Ry.set(0,0,1),Ry.applyMatrix4(Py),Fy.subVectors(Cy,My);let u=!1;if(!0===Fy.dot(Ry)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(ky=!1);u=!0}Fy.reflect(Ry).negate(),Fy.add(Cy),Py.extractRotation(r.matrixWorld),By.set(0,0,-1),By.applyMatrix4(Py),By.add(My),Iy.subVectors(Cy,By),Iy.reflect(Ry).negate(),Iy.add(Cy),a.coordinateSystem=r.coordinateSystem,a.position.copy(Fy),a.up.set(0,1,0),a.up.applyMatrix4(Py),a.up.reflect(Ry),a.lookAt(Iy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Ay.setFromNormalAndCoplanarPoint(Ry,Cy),Ay.applyMatrix4(a.matrixWorldInverse),Ly.set(Ay.normal.x,Ay.normal.y,Ay.normal.z,Ay.constant);const l=a.projectionMatrix;Dy.x=(Math.sign(Ly.x)+l.elements[8])/l.elements[0],Dy.y=(Math.sign(Ly.y)+l.elements[9])/l.elements[5],Dy.z=-1,Dy.w=(1+l.elements[10])/l.elements[14],Ly.multiplyScalar(1/Ly.dot(Dy));l.elements[2]=Ly.x,l.elements[6]=Ly.y,l.elements[10]=s.coordinateSystem===d?Ly.z-0:Ly.z+1-0,l.elements[14]=Ly.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const c=s.getRenderTarget(),h=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),s.setMRT(h),s.setRenderTarget(c),s.autoClear=p,i.visible=!0,ky=!1,this.forceUpdate=!1}}const Hy=new ae(-1,1,1,-1,0,1);class $y extends pe{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Le([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Le(t,2))}}const Wy=new $y;class qy extends X{constructor(e=null){super(Wy,e),this.camera=Hy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,Hy)}render(e){e.render(this,Hy)}}const jy=new t;class Xy extends il{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ce}){const i=new ue(t,r,s);super(i.texture,Zu()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new qy(new yp),this.updateBeforeType=Us.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(jy),s=r.width*t,i=r.height*t;s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new il(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Ky=(e,...t)=>Ii(new Xy(Ii(e),...t)),Yy=$i(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=en(e.x,e.y.oneMinus()).mul(2).sub(1),i=ln(nn(e,t),1)):i=ln(nn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ln(r.mul(i));return n.xyz.div(n.w)}),Qy=$i(([e,t])=>{const r=t.mul(ln(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return en(s.x,s.y.oneMinus())}),Zy=$i(([e,t,r])=>{const s=el(ol(t)),i=tn(e.mul(s)).toVar(),n=ol(t,i).toVar(),a=ol(t,i.sub(tn(2,0))).toVar(),o=ol(t,i.sub(tn(1,0))).toVar(),u=ol(t,i.add(tn(1,0))).toVar(),l=ol(t,i.add(tn(2,0))).toVar(),d=ol(t,i.add(tn(0,2))).toVar(),c=ol(t,i.add(tn(0,1))).toVar(),h=ol(t,i.sub(tn(0,1))).toVar(),p=ol(t,i.sub(tn(0,2))).toVar(),g=uo(ha(Yi(2).mul(o).sub(a),n)).toVar(),m=uo(ha(Yi(2).mul(u).sub(l),n)).toVar(),f=uo(ha(Yi(2).mul(c).sub(d),n)).toVar(),y=uo(ha(Yi(2).mul(h).sub(p),n)).toVar(),b=Yy(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Yy(e.sub(en(Yi(1).div(s.x),0)),o,r)),b.negate().add(Yy(e.add(en(Yi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Yy(e.add(en(0,Yi(1).div(s.y))),c,r)),b.negate().add(Yy(e.sub(en(0,Yi(1).div(s.y))),h,r)));return eo(Bo(x,T))});class Jy extends js{static get type(){return"SampleNode"}constructor(e){super(),this.callback=e,this.isSampleNode=!0}setup(){return this.sample(Zu())}sample(e){return this.callback(e)}}class eb extends js{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===eb.OBJECT?this.updateType=Us.OBJECT:e===eb.MATERIAL&&(this.updateType=Us.RENDER)}update(e){this.callback(e)}}eb.OBJECT="object",eb.MATERIAL="material";const tb=(e,t)=>Ii(new eb(e,t)).toStack();class rb extends L{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class sb extends ge{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class ib extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const nb=ki(ib),ab=new w,ob=new a;class ub extends js{static get type(){return"SceneNode"}constructor(e=ub.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ub.BACKGROUND_BLURRINESS?s=Cd("backgroundBlurriness","float",r):t===ub.BACKGROUND_INTENSITY?s=Cd("backgroundIntensity","float",r):t===ub.BACKGROUND_ROTATION?s=ra("mat4").setName("backgroundRotation").setGroup(Jn).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Fe?(ab.copy(r.backgroundRotation),ab.x*=-1,ab.y*=-1,ab.z*=-1,ob.makeRotationFromEuler(ab)):ob.identity(),ob}):console.error("THREE.SceneNode: Unknown scope:",t),s}}ub.BACKGROUND_BLURRINESS="backgroundBlurriness",ub.BACKGROUND_INTENSITY="backgroundIntensity",ub.BACKGROUND_ROTATION="backgroundRotation";const lb=ki(ub,ub.BACKGROUND_BLURRINESS),db=ki(ub,ub.BACKGROUND_INTENSITY),cb=ki(ub,ub.BACKGROUND_ROTATION);class hb extends il{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e}}const pb=Oi(hb).setParameterLength(1,3),gb=$i(({texture:e,uv:t})=>{const r=1e-4,s=nn().toVar();return ji(t.x.lessThan(r),()=>{s.assign(nn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(nn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(nn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(nn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(nn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(nn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(nn(-.01,0,0))).r.sub(e.sample(t.add(nn(r,0,0))).r),n=e.sample(t.add(nn(0,-.01,0))).r.sub(e.sample(t.add(nn(0,r,0))).r),a=e.sample(t.add(nn(0,0,-.01))).r.sub(e.sample(t.add(nn(0,0,r))).r);s.assign(nn(i,n,a))}),s.normalize()});class mb extends il{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return nn(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Qi(el(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return gb({texture:this,uv:e})}}const fb=Oi(mb).setParameterLength(1,3);class yb extends Rd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const bb=new WeakMap;class xb extends Ys{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=ra(new a),this.previousProjectionMatrix=ra(new a).setGroup(Jn),this.previousCameraViewMatrix=ra(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=_b(r);this.previousModelWorldMatrix.value.copy(s);const i=Tb(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){_b(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?yl:ra(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(kl).mul(Wl),s=this.previousProjectionMatrix.mul(t).mul(ql),i=r.xy.div(r.w),n=s.xy.div(s.w);return ha(i,n)}}function Tb(e){let t=bb.get(e);return void 0===t&&(t={},bb.set(e,t)),t}function _b(e,t=0){const r=Tb(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const vb=ki(xb),Nb=$i(([e])=>Ab(e.rgb)),Sb=$i(([e,t=Yi(1)])=>t.mix(Ab(e.rgb),e.rgb)),Eb=$i(([e,t=Yi(1)])=>{const r=ca(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return ko(e.rgb,s,i)}),wb=$i(([e,t=Yi(1)])=>{const r=nn(.57735,.57735,.57735),s=t.cos();return nn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Po(r,e.rgb).mul(s.oneMinus())))))}),Ab=(e,t=nn(c.getLuminanceCoefficients(new r)))=>Po(e,t),Rb=$i(([e,t=nn(1),s=nn(0),i=nn(1),n=Yi(1),a=nn(c.getLuminanceCoefficients(new r,le))])=>{const o=e.rgb.dot(nn(a)),u=wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ji(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ji(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ji(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),ln(u.rgb,e.a)});class Cb extends Ys{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Mb=Oi(Cb).setParameterLength(2),Pb=new t;class Bb extends il{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Lb extends Bb{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}class Fb extends Ys{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new U;i.isRenderTargetTexture=!0,i.name="depth";const n=new ue(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ce,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ra(0),this._cameraFar=ra(0),this._mrt=null,this._layers=null,this._resolution=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Us.FRAME,this.global=!0}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Ii(new Lb(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Ii(new Lb(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Zh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Yh(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getColorBufferType(),this.scope===Fb.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Pb.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Pb)),this._pixelRatio=i,this.setSize(Pb.width,Pb.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolution).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolution).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Fb.COLOR="color",Fb.DEPTH="depth";class Ib extends Fb{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Fb.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new yp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=S;const t=rd.negate(),r=yl.mul(kl),s=Yi(1),i=r.mul(ln(Wl,1)),n=r.mul(ln(Wl.add(t),1)),a=eo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ln(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Db=$i(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vb=$i(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ub=$i(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ob=$i(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),kb=$i(([e,t])=>{const r=gn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=gn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Ob(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gb=gn(nn(1.6605,-.1246,-.0182),nn(-.5876,1.1329,-.1006),nn(-.0728,-.0083,1.1187)),zb=gn(nn(.6274,.0691,.0164),nn(.3293,.9195,.088),nn(.0433,.0113,.8956)),Hb=$i(([e])=>{const t=nn(e).toVar(),r=nn(t.mul(t)).toVar(),s=nn(r.mul(r)).toVar();return Yi(15.5).mul(s.mul(r)).sub(pa(40.14,s.mul(t))).add(pa(31.96,s).sub(pa(6.868,r.mul(t))).add(pa(.4298,r).add(pa(.1191,t).sub(.00232))))}),$b=$i(([e,t])=>{const r=nn(e).toVar(),s=gn(nn(.856627153315983,.137318972929847,.11189821299995),nn(.0951212405381588,.761241990602591,.0767994186031903),nn(.0482516061458583,.101439036467562,.811302368396859)),i=gn(nn(1.1271005818144368,-.1413297634984383,-.14132976349843826),nn(-.11060664309660323,1.157823702216272,-.11060664309660294),nn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Yi(-12.47393),a=Yi(4.026069);return r.mulAssign(t),r.assign(zb.mul(r)),r.assign(s.mul(r)),r.assign(wo(r,1e-10)),r.assign(Ka(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Go(r,0,1)),r.assign(Hb(r)),r.assign(i.mul(r)),r.assign(Lo(wo(nn(0),r),nn(2.2))),r.assign(Gb.mul(r)),r.assign(Go(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Wb=$i(([e,t])=>{const r=Yi(.76),s=Yi(.15);e=e.mul(t);const i=Eo(e.r,Eo(e.g,e.b)),n=eu(i.lessThan(.08),i.sub(pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=wo(e.r,wo(e.g,e.b));ji(a.lessThan(r),()=>e);const o=ha(1,r),u=ha(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ha(1,ga(1,s.mul(a.sub(u)).add(1)));return ko(e,nn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class qb extends js{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const jb=Oi(qb).setParameterLength(1,3);class Xb extends qb{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Kb=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Yb extends js{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Yi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Fs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Is(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Qb=Oi(Yb).setParameterLength(1);class Zb extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Jb{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const ex=new Zb;class tx extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Zb,this._output=Qb(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Qb(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Qb(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Jb(this),t=ex.get("THREE"),r=ex.get("TSL"),s=this.getMethod(),i=[e,this._local,ex,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Yi()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const rx=Oi(tx).setParameterLength(1,2);function sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Kl.z).negate()}const ix=$i(([e,t],r)=>{const s=sx(r);return $o(e,t,s)}),nx=$i(([e],t)=>{const r=sx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),ax=$i(([e,t])=>ln(t.toFloat().mix(On.rgb,e.toVec3()),On.a));let ox=null,ux=null;class lx extends js{static get type(){return"RangeNode"}constructor(e=Yi(),t=Yi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));ox=ox||new s,ux=ux||new s,ox.setScalar(0),ux.setScalar(0),1===a?ox.setScalar(i):i.isColor?ox.set(i.r,i.g,i.b,1):ox.set(i.x,i.y,i.z||0,i.w||0),1===o?ux.setScalar(n):n.isColor?ux.set(n.r,n.g,n.b,1):ux.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eIi(new cx(e,t)),px=hx("numWorkgroups","uvec3"),gx=hx("workgroupId","uvec3"),mx=hx("globalId","uvec3"),fx=hx("localId","uvec3"),yx=hx("subgroupSize","uint");const bx=Oi(class extends js{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class xx extends Xs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Tx extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ii(new xx(this,e))}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class _x extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=$u(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}_x.ATOMIC_LOAD="atomicLoad",_x.ATOMIC_STORE="atomicStore",_x.ATOMIC_ADD="atomicAdd",_x.ATOMIC_SUB="atomicSub",_x.ATOMIC_MAX="atomicMax",_x.ATOMIC_MIN="atomicMin",_x.ATOMIC_AND="atomicAnd",_x.ATOMIC_OR="atomicOr",_x.ATOMIC_XOR="atomicXor";const vx=Oi(_x),Nx=(e,t,r)=>vx(e,t,r).toStack();let Sx;function Ex(e){Sx=Sx||new WeakMap;let t=Sx.get(e);return void 0===t&&Sx.set(e,t={}),t}function wx(e){const t=Ex(e);return t.shadowMatrix||(t.shadowMatrix=ra("mat4").setGroup(Jn).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||e.shadow.updateMatrices(e),e.shadow.matrix)))}function Ax(e,t=jl){const r=wx(e).mul(t);return r.xyz.div(r.w)}function Rx(e){const t=Ex(e);return t.position||(t.position=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function Cx(e){const t=Ex(e);return t.targetPosition||(t.targetPosition=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function Mx(e){const t=Ex(e);return t.viewPosition||(t.viewPosition=ra(new r).setGroup(Jn).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const Px=e=>xl.transformDirection(Rx(e).sub(Cx(e))),Bx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},Lx=new WeakMap,Fx=[];class Ix extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=xn("vec3","totalDiffuse"),this.totalSpecularNode=xn("vec3","totalSpecular"),this.outgoingLightNode=xn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ii(e));else{let s=null;if(null!==r&&(s=Bx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;Lx.has(e)?s=Lx.get(e):(s=Ii(new r(e)),Lx.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=nn(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class Dx extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){Vx.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||jl)}}const Vx=xn("vec3","shadowPositionWorld");function Ux(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function Ox(e,t){return t=Ux(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function kx(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function Gx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function zx(e,t){return t=Gx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function Hx(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function $x(e,t,r){return r=zx(t,r=Ox(e,r))}function Wx(e,t,r){kx(e,r),Hx(t,r)}var qx=Object.freeze({__proto__:null,resetRendererAndSceneState:$x,resetRendererState:Ox,resetSceneState:zx,restoreRendererAndSceneState:Wx,restoreRendererState:kx,restoreSceneState:Hx,saveRendererAndSceneState:function(e,t,r={}){return r=Gx(t,r=Ux(e,r))},saveRendererState:Ux,saveSceneState:Gx});const jx=new WeakMap,Xx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=al(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),Kx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=al(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Cd("mapSize","vec2",r).setGroup(Jn),a=Cd("radius","float",r).setGroup(Jn),o=en(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return ca(i(t.xy.add(en(u,l)),t.z),i(t.xy.add(en(0,l)),t.z),i(t.xy.add(en(d,l)),t.z),i(t.xy.add(en(h,p)),t.z),i(t.xy.add(en(0,p)),t.z),i(t.xy.add(en(g,p)),t.z),i(t.xy.add(en(u,0)),t.z),i(t.xy.add(en(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(en(g,0)),t.z),i(t.xy.add(en(d,0)),t.z),i(t.xy.add(en(h,m)),t.z),i(t.xy.add(en(0,m)),t.z),i(t.xy.add(en(g,m)),t.z),i(t.xy.add(en(u,c)),t.z),i(t.xy.add(en(0,c)),t.z),i(t.xy.add(en(d,c)),t.z)).mul(1/17)}),Yx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=al(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Cd("mapSize","vec2",r).setGroup(Jn),a=en(1).div(n),o=a.x,u=a.y,l=t.xy,d=to(l.mul(n).add(.5));return l.subAssign(d.mul(a)),ca(i(l,t.z),i(l.add(en(o,0)),t.z),i(l.add(en(0,u)),t.z),i(l.add(a),t.z),ko(i(l.add(en(o.negate(),0)),t.z),i(l.add(en(o.mul(2),0)),t.z),d.x),ko(i(l.add(en(o.negate(),u)),t.z),i(l.add(en(o.mul(2),u)),t.z),d.x),ko(i(l.add(en(0,u.negate())),t.z),i(l.add(en(0,u.mul(2))),t.z),d.y),ko(i(l.add(en(o,u.negate())),t.z),i(l.add(en(o,u.mul(2))),t.z),d.y),ko(ko(i(l.add(en(o.negate(),u.negate())),t.z),i(l.add(en(o.mul(2),u.negate())),t.z),d.x),ko(i(l.add(en(o.negate(),u.mul(2))),t.z),i(l.add(en(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),Qx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=Yi(1).toVar();let i=al(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=Ao(t.z,i.x);return ji(n.notEqual(Yi(1)),()=>{const e=t.z.sub(i.x),r=wo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Go(ha(a,.3).div(.95-.3)),s.assign(Go(wo(n,a)))}),s}),Zx=$i(([e,t,r])=>{let s=jl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),Jx=e=>{let t=jx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Cd("near","float",t).setGroup(Jn),s=Cd("far","float",t).setGroup(Jn),i=Al(e);return Zx(i,r,s)})(e):null;t=new yp,t.colorNode=ln(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,jx.set(e,t)}return t},eT=new gf,tT=[],rT=(e,t,r,s)=>{tT[0]=e,tT[1]=t;let i=eT.get(tT);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ls(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,eT.set(tT,i)),tT[0]=null,tT[1]=null,i},sT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanVertical"),a=Yi(0).toVar("squareMeanVertical"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));xh({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Dh.xy,en(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),iT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanHorizontal"),a=Yi(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));xh({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Dh.xy,en(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),nT=[Xx,Kx,Yx,Qx];let aT;const oT=new qy;class uT extends Dx{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,Yi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Cd("bias","float",r).setGroup(Jn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=Cd("near","float",r.camera).setGroup(Jn),s=Cd("far","float",r.camera).setGroup(Jn);n=Jh(e.negate(),t,s)}return a=nn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return nT[e]}setupRenderTarget(e,t){const r=new U(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=De;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie&&!0!==s.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}));let t=al(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=al(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const i=Cd("blurSamples","float",s).setGroup(Jn),o=Cd("radius","float",s).setGroup(Jn),u=Cd("mapSize","vec2",s).setGroup(Jn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new yp);l.fragmentNode=sT({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new yp),l.fragmentNode=iT({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=Cd("intensity","float",s).setGroup(Jn),u=Cd("normalBias","float",s).setGroup(Jn),l=wx(r).mul(Vx.add(od.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ie&&!0!==s.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=al(a.texture,d);n.isArrayTexture&&(g=g.depth(this.depthLayer));const m=ko(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return $i(()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");aT=$x(i,n,aT),n.overrideMaterial=Jx(r),i.setRenderObjectFunction(rT(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ie&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,Wx(i,n,aT)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),oT.material=this.vsmMaterialVertical,oT.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),oT.material=this.vsmMaterialHorizontal,oT.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const lT=(e,t)=>Ii(new uT(e,t)),dT=new e,cT=$i(([e,t])=>{const r=e.toVar(),s=uo(r),i=ga(1,wo(s.x,wo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=en(r.xy).toVar(),a=t.mul(1.5).oneMinus();return ji(s.z.greaterThanEqual(a),()=>{ji(r.z.greaterThan(0),()=>{n.x.assign(ha(4,r.x))})}).ElseIf(s.x.greaterThanEqual(a),()=>{const e=lo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))}).ElseIf(s.y.greaterThanEqual(a),()=>{const e=lo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))}),en(.125,.25).mul(n).add(en(.375,.75)).flipY()}).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),hT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>al(e,cT(t,s.y)).compare(r)),pT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Cd("radius","float",i).setGroup(Jn),a=en(-1,1).mul(n).mul(s.y);return al(e,cT(t.add(a.xyy),s.y)).compare(r).add(al(e,cT(t.add(a.yyy),s.y)).compare(r)).add(al(e,cT(t.add(a.xyx),s.y)).compare(r)).add(al(e,cT(t.add(a.yyx),s.y)).compare(r)).add(al(e,cT(t,s.y)).compare(r)).add(al(e,cT(t.add(a.xxy),s.y)).compare(r)).add(al(e,cT(t.add(a.yxy),s.y)).compare(r)).add(al(e,cT(t.add(a.xxx),s.y)).compare(r)).add(al(e,cT(t.add(a.yxx),s.y)).compare(r)).mul(1/9)}),gT=$i(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.near),o=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.far),u=Cd("bias","float",s).setGroup(Jn),l=ra(s.mapSize).setGroup(Jn),d=Yi(1).toVar();return ji(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=en(1).div(l.mul(en(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))}),d}),mT=new s,fT=new t,yT=new t;class bT extends uT{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?hT:pT}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return gT({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();yT.copy(t.mapSize),yT.multiply(a),r.setSize(yT.width,yT.height),fT.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(dT),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eIi(new bT(e,t));class TT extends wh{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ra(this.color).setGroup(Jn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}getHash(){return this.light.uuid}getLightVector(e){return Mx(this.light).sub(e.context.positionView||Kl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return lT(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Ii(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const _T=$i(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),vT=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=_T({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class NT extends TT{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(2).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return xT(this.light)}setupDirect(e){return vT({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const ST=$i(([e=Zu()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),ET=$i(([e=Zu()],{renderer:t,material:r})=>{const s=Oo(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.samples>1){const e=Yi(s.fwidth()).toVar();i=$o(e.oneMinus(),e.add(1),s).oneMinus()}else i=eu(s.greaterThan(1),0,1);return i}),wT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Ji(e).toVar();return eu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),AT=$i(([e,t])=>{const r=Ji(t).toVar(),s=Yi(e).toVar();return eu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),RT=$i(([e])=>{const t=Yi(e).toVar();return Qi(Za(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),CT=$i(([e,t])=>{const r=Yi(e).toVar();return t.assign(RT(r)),r.sub(Yi(t))}),MT=fy([$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=Yi(s).toVar(),l=Yi(r).toVar(),d=Yi(t).toVar(),c=Yi(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=nn(s).toVar(),l=nn(r).toVar(),d=nn(t).toVar(),c=nn(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),PT=fy([$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=Yi(o).toVar(),m=Yi(a).toVar(),f=Yi(n).toVar(),y=Yi(i).toVar(),b=Yi(s).toVar(),x=Yi(r).toVar(),T=Yi(t).toVar(),_=Yi(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=nn(o).toVar(),m=nn(a).toVar(),f=nn(n).toVar(),y=nn(i).toVar(),b=nn(s).toVar(),x=nn(r).toVar(),T=nn(t).toVar(),_=nn(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),BT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Zi(e).toVar(),a=Zi(n.bitAnd(Zi(7))).toVar(),o=Yi(wT(a.lessThan(Zi(4)),i,s)).toVar(),u=Yi(pa(2,wT(a.lessThan(Zi(4)),s,i))).toVar();return AT(o,Ji(a.bitAnd(Zi(1)))).add(AT(u,Ji(a.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),LT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=Zi(e).toVar(),u=Zi(o.bitAnd(Zi(15))).toVar(),l=Yi(wT(u.lessThan(Zi(8)),a,n)).toVar(),d=Yi(wT(u.lessThan(Zi(4)),n,wT(u.equal(Zi(12)).or(u.equal(Zi(14))),a,i))).toVar();return AT(l,Ji(u.bitAnd(Zi(1)))).add(AT(d,Ji(u.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),FT=fy([BT,LT]),IT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=on(e).toVar();return nn(FT(n.x,i,s),FT(n.y,i,s),FT(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),DT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=on(e).toVar();return nn(FT(o.x,a,n,i),FT(o.y,a,n,i),FT(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),VT=fy([IT,DT]),UT=$i(([e])=>{const t=Yi(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),OT=$i(([e])=>{const t=Yi(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),kT=fy([UT,$i(([e])=>{const t=nn(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),GT=fy([OT,$i(([e])=>{const t=nn(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),zT=$i(([e,t])=>{const r=Qi(t).toVar(),s=Zi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Qi(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),HT=$i(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(zT(r,Qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(zT(e,Qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(zT(t,Qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(zT(r,Qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(zT(e,Qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(zT(t,Qi(4))),t.addAssign(e)}),$T=$i(([e,t,r])=>{const s=Zi(r).toVar(),i=Zi(t).toVar(),n=Zi(e).toVar();return s.bitXorAssign(i),s.subAssign(zT(i,Qi(14))),n.bitXorAssign(s),n.subAssign(zT(s,Qi(11))),i.bitXorAssign(n),i.subAssign(zT(n,Qi(25))),s.bitXorAssign(i),s.subAssign(zT(i,Qi(16))),n.bitXorAssign(s),n.subAssign(zT(s,Qi(4))),i.bitXorAssign(n),i.subAssign(zT(n,Qi(14))),s.bitXorAssign(i),s.subAssign(zT(i,Qi(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),WT=$i(([e])=>{const t=Zi(e).toVar();return Yi(t).div(Yi(Zi(Qi(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),qT=$i(([e])=>{const t=Yi(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),jT=fy([$i(([e])=>{const t=Qi(e).toVar(),r=Zi(Zi(1)).toVar(),s=Zi(Zi(Qi(3735928559)).add(r.shiftLeft(Zi(2))).add(Zi(13))).toVar();return $T(s.add(Zi(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(Zi(2)).toVar(),n=Zi().toVar(),a=Zi().toVar(),o=Zi().toVar();return n.assign(a.assign(o.assign(Zi(Qi(3735928559)).add(i.shiftLeft(Zi(2))).add(Zi(13))))),n.addAssign(Zi(s)),a.addAssign(Zi(r)),$T(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(Zi(3)).toVar(),o=Zi().toVar(),u=Zi().toVar(),l=Zi().toVar();return o.assign(u.assign(l.assign(Zi(Qi(3735928559)).add(a.shiftLeft(Zi(2))).add(Zi(13))))),o.addAssign(Zi(n)),u.addAssign(Zi(i)),l.addAssign(Zi(s)),$T(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),$i(([e,t,r,s])=>{const i=Qi(s).toVar(),n=Qi(r).toVar(),a=Qi(t).toVar(),o=Qi(e).toVar(),u=Zi(Zi(4)).toVar(),l=Zi().toVar(),d=Zi().toVar(),c=Zi().toVar();return l.assign(d.assign(c.assign(Zi(Qi(3735928559)).add(u.shiftLeft(Zi(2))).add(Zi(13))))),l.addAssign(Zi(o)),d.addAssign(Zi(a)),c.addAssign(Zi(n)),HT(l,d,c),l.addAssign(Zi(i)),$T(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),$i(([e,t,r,s,i])=>{const n=Qi(i).toVar(),a=Qi(s).toVar(),o=Qi(r).toVar(),u=Qi(t).toVar(),l=Qi(e).toVar(),d=Zi(Zi(5)).toVar(),c=Zi().toVar(),h=Zi().toVar(),p=Zi().toVar();return c.assign(h.assign(p.assign(Zi(Qi(3735928559)).add(d.shiftLeft(Zi(2))).add(Zi(13))))),c.addAssign(Zi(l)),h.addAssign(Zi(u)),p.addAssign(Zi(o)),HT(c,h,p),c.addAssign(Zi(a)),h.addAssign(Zi(n)),$T(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),XT=fy([$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(jT(s,r)).toVar(),n=on().toVar();return n.x.assign(i.bitAnd(Qi(255))),n.y.assign(i.shiftRight(Qi(8)).bitAnd(Qi(255))),n.z.assign(i.shiftRight(Qi(16)).bitAnd(Qi(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(jT(n,i,s)).toVar(),o=on().toVar();return o.x.assign(a.bitAnd(Qi(255))),o.y.assign(a.shiftRight(Qi(8)).bitAnd(Qi(255))),o.z.assign(a.shiftRight(Qi(16)).bitAnd(Qi(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),KT=fy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(CT(t.x,r)).toVar(),n=Yi(CT(t.y,s)).toVar(),a=Yi(qT(i)).toVar(),o=Yi(qT(n)).toVar(),u=Yi(MT(FT(jT(r,s),i,n),FT(jT(r.add(Qi(1)),s),i.sub(1),n),FT(jT(r,s.add(Qi(1))),i,n.sub(1)),FT(jT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return kT(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(CT(t.x,r)).toVar(),a=Yi(CT(t.y,s)).toVar(),o=Yi(CT(t.z,i)).toVar(),u=Yi(qT(n)).toVar(),l=Yi(qT(a)).toVar(),d=Yi(qT(o)).toVar(),c=Yi(PT(FT(jT(r,s,i),n,a,o),FT(jT(r.add(Qi(1)),s,i),n.sub(1),a,o),FT(jT(r,s.add(Qi(1)),i),n,a.sub(1),o),FT(jT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),FT(jT(r,s,i.add(Qi(1))),n,a,o.sub(1)),FT(jT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),FT(jT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),FT(jT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return GT(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),YT=fy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(CT(t.x,r)).toVar(),n=Yi(CT(t.y,s)).toVar(),a=Yi(qT(i)).toVar(),o=Yi(qT(n)).toVar(),u=nn(MT(VT(XT(r,s),i,n),VT(XT(r.add(Qi(1)),s),i.sub(1),n),VT(XT(r,s.add(Qi(1))),i,n.sub(1)),VT(XT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return kT(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(CT(t.x,r)).toVar(),a=Yi(CT(t.y,s)).toVar(),o=Yi(CT(t.z,i)).toVar(),u=Yi(qT(n)).toVar(),l=Yi(qT(a)).toVar(),d=Yi(qT(o)).toVar(),c=nn(PT(VT(XT(r,s,i),n,a,o),VT(XT(r.add(Qi(1)),s,i),n.sub(1),a,o),VT(XT(r,s.add(Qi(1)),i),n,a.sub(1),o),VT(XT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),VT(XT(r,s,i.add(Qi(1))),n,a,o.sub(1)),VT(XT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),VT(XT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),VT(XT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return GT(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),QT=fy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(RT(t)).toVar();return WT(jT(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar();return WT(jT(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar();return WT(jT(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar(),n=Qi(RT(t.w)).toVar();return WT(jT(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),ZT=fy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(RT(t)).toVar();return nn(WT(jT(r,Qi(0))),WT(jT(r,Qi(1))),WT(jT(r,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar();return nn(WT(jT(r,s,Qi(0))),WT(jT(r,s,Qi(1))),WT(jT(r,s,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar();return nn(WT(jT(r,s,i,Qi(0))),WT(jT(r,s,i,Qi(1))),WT(jT(r,s,i,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(RT(t.x)).toVar(),s=Qi(RT(t.y)).toVar(),i=Qi(RT(t.z)).toVar(),n=Qi(RT(t.w)).toVar();return nn(WT(jT(r,s,i,n,Qi(0))),WT(jT(r,s,i,n,Qi(1))),WT(jT(r,s,i,n,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),JT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=Yi(0).toVar(),l=Yi(1).toVar();return xh(a,()=>{u.addAssign(l.mul(KT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),e_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(0).toVar(),l=Yi(1).toVar();return xh(a,()=>{u.addAssign(l.mul(YT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),t_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar();return en(JT(o,a,n,i),JT(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),r_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(e_(o,a,n,i)).toVar(),l=Yi(JT(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i)).toVar();return ln(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),s_=fy([$i(([e,t,r,s,i,n,a])=>{const o=Qi(a).toVar(),u=Yi(n).toVar(),l=Qi(i).toVar(),d=Qi(s).toVar(),c=Qi(r).toVar(),h=Qi(t).toVar(),p=en(e).toVar(),g=nn(ZT(en(h.add(d),c.add(l)))).toVar(),m=en(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=en(en(Yi(h),Yi(c)).add(m)).toVar(),y=en(f.sub(p)).toVar();return ji(o.equal(Qi(2)),()=>uo(y.x).add(uo(y.y))),ji(o.equal(Qi(3)),()=>wo(uo(y.x),uo(y.y))),Po(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),$i(([e,t,r,s,i,n,a,o,u])=>{const l=Qi(u).toVar(),d=Yi(o).toVar(),c=Qi(a).toVar(),h=Qi(n).toVar(),p=Qi(i).toVar(),g=Qi(s).toVar(),m=Qi(r).toVar(),f=Qi(t).toVar(),y=nn(e).toVar(),b=nn(ZT(nn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=nn(nn(Yi(f),Yi(m),Yi(g)).add(b)).toVar(),T=nn(x.sub(y)).toVar();return ji(l.equal(Qi(2)),()=>uo(T.x).add(uo(T.y)).add(uo(T.z))),ji(l.equal(Qi(3)),()=>wo(uo(T.x),uo(T.y),uo(T.z))),Po(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),i_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=Yi(1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();l.assign(Eo(l,r))})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),n_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=en(1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),a_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(CT(n.x,a),CT(n.y,o)).toVar(),l=nn(1e6,1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(s_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),o_=fy([i_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=Yi(1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Eo(d,n))})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),u_=fy([n_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=en(1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),l_=fy([a_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(CT(n.x,a),CT(n.y,o),CT(n.z,u)).toVar(),d=nn(1e6,1e6,1e6).toVar();return xh({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{xh({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{xh({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(s_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),d_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=en(t).toVar(),p=en(r).toVar(),g=en(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(YT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(ZT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(l_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(e_(nn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),c_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=nn(t).toVar(),p=nn(r).toVar(),g=nn(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(YT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(ZT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(l_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(e_(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),h_=$i(([e])=>{const t=e.y,r=e.z,s=nn().toVar();return ji(t.lessThan(1e-4),()=>{s.assign(nn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(Za(i)).mul(6).toVar();const n=Qi(bo(i)),a=i.sub(Yi(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ji(n.equal(Qi(0)),()=>{s.assign(nn(r,l,o))}).ElseIf(n.equal(Qi(1)),()=>{s.assign(nn(u,r,o))}).ElseIf(n.equal(Qi(2)),()=>{s.assign(nn(o,r,l))}).ElseIf(n.equal(Qi(3)),()=>{s.assign(nn(o,u,r))}).ElseIf(n.equal(Qi(4)),()=>{s.assign(nn(l,o,r))}).Else(()=>{s.assign(nn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),p_=$i(([e])=>{const t=nn(e).toVar(),r=Yi(t.x).toVar(),s=Yi(t.y).toVar(),i=Yi(t.z).toVar(),n=Yi(Eo(r,Eo(s,i))).toVar(),a=Yi(wo(r,wo(s,i))).toVar(),o=Yi(a.sub(n)).toVar(),u=Yi().toVar(),l=Yi().toVar(),d=Yi().toVar();return d.assign(a),ji(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ji(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ji(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ji(u.lessThan(0),()=>{u.addAssign(1)})}),nn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),g_=$i(([e])=>{const t=nn(e).toVar(),r=un(xa(t,nn(.04045))).toVar(),s=nn(t.div(12.92)).toVar(),i=nn(Lo(wo(t.add(nn(.055)),nn(0)).div(1.055),nn(2.4))).toVar();return ko(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),m_=(e,t)=>{e=Yi(e),t=Yi(t);const r=en(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return $o(e.sub(r),e.add(r),t)},f_=(e,t,r,s)=>ko(e,t,r[s].clamp()),y_=(e,t,r,s,i)=>ko(e,t,m_(r,s[i])),b_=$i(([e,t,r])=>{const s=eo(e).toVar(),i=ha(Yi(.5).mul(t.sub(r)),jl).div(s).toVar(),n=ha(Yi(-.5).mul(t.sub(r)),jl).div(s).toVar(),a=nn().toVar();a.x=s.x.greaterThan(Yi(0)).select(i.x,n.x),a.y=s.y.greaterThan(Yi(0)).select(i.y,n.y),a.z=s.z.greaterThan(Yi(0)).select(i.z,n.z);const o=Eo(a.x,a.y,a.z).toVar();return jl.add(s.mul(o)).toVar().sub(r)}),x_=$i(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(pa(r,r).sub(pa(s,s)))),n});var T_=Object.freeze({__proto__:null,BRDF_GGX:ng,BRDF_Lambert:$p,BasicPointShadowFilter:hT,BasicShadowFilter:Xx,Break:Th,Const:uu,Continue:()=>$u("continue").toStack(),DFGApprox:ag,D_GGX:rg,Discard:Wu,EPSILON:Ua,F_Schlick:Hp,Fn:$i,INFINITY:Oa,If:ji,Loop:xh,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,OnMaterialUpdate:e=>tb(eb.MATERIAL,e),OnObjectUpdate:e=>tb(eb.OBJECT,e),PCFShadowFilter:Kx,PCFSoftShadowFilter:Yx,PI:ka,PI2:Ga,PointShadowFilter:pT,Return:()=>$u("return").toStack(),Schlick_to_F0:ug,ScriptableNodeResources:ex,ShaderNode:Fi,Stack:Xi,Switch:(...e)=>ai.Switch(...e),TBNViewMatrix:rc,VSMShadowFilter:Qx,V_GGX_SmithCorrelated:eg,Var:ou,VarIntent:lu,abs:uo,acesFilmicToneMapping:kb,acos:ao,add:ca,addMethodChaining:ui,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:$b,all:za,alphaT:Bn,and:va,anisotropy:Ln,anisotropyB:In,anisotropyT:Fn,any:Ha,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),Xi(e)),array:ia,arrayBuffer:e=>Ii(new ii(e,"ArrayBuffer")),asin:no,assign:aa,atan:oo,atan2:Yo,atomicAdd:(e,t)=>Nx(_x.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Nx(_x.ATOMIC_AND,e,t),atomicFunc:Nx,atomicLoad:e=>Nx(_x.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Nx(_x.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Nx(_x.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Nx(_x.ATOMIC_OR,e,t),atomicStore:(e,t)=>Nx(_x.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Nx(_x.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Nx(_x.ATOMIC_XOR,e,t),attenuationColor:jn,attenuationDistance:qn,attribute:Qu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new sb(e,r,s);return gh(i,t,e)},backgroundBlurriness:lb,backgroundIntensity:db,backgroundRotation:cb,batch:dh,bentNormalView:ic,billboarding:vy,bitAnd:wa,bitNot:Aa,bitOr:Ra,bitXor:Ca,bitangentGeometry:Zd,bitangentLocal:Jd,bitangentView:ec,bitangentWorld:tc,bitcast:No,blendBurn:dp,blendColor:gp,blendDodge:cp,blendOverlay:pp,blendScreen:hp,blur:um,bool:Ji,buffer:ll,bufferAttribute:Cu,bumpMap:dc,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),dp(e)),bvec2:sn,bvec3:un,bvec4:hn,bypass:Ou,cache:Vu,call:ua,cameraFar:fl,cameraIndex:gl,cameraNear:ml,cameraNormalMatrix:_l,cameraPosition:vl,cameraProjectionMatrix:yl,cameraProjectionMatrixInverse:bl,cameraViewMatrix:xl,cameraWorldMatrix:Tl,cbrt:Uo,cdl:Rb,ceil:Ja,checker:ST,cineonToneMapping:Ub,clamp:Go,clearcoat:En,clearcoatNormalView:ud,clearcoatRoughness:wn,code:jb,color:Ki,colorSpaceToWorking:Tu,colorToDirection:e=>Ii(e).mul(2).sub(1),compute:Iu,computeKernel:Fu,computeSkinning:(e,t=null)=>{const r=new fh(e);return r.positionNode=gh(new L(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(eh).toVar(),r.skinIndexNode=gh(new L(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(eh).toVar(),r.skinWeightNode=gh(new L(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(eh).toVar(),r.bindMatrixNode=ra(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=ra(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=ll(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Ii(r)},context:ru,convert:yn,convertColorSpace:(e,t,r)=>Ii(new bu(Ii(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Ky(e,...t),cos:so,cross:Bo,cubeTexture:wd,cubeTextureBase:Ed,cubeToUV:cT,dFdx:go,dFdy:mo,dashSize:kn,debug:Ku,decrement:Ia,decrementBefore:La,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Bi,degrees:Wa,deltaTime:by,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),ax(e,nx(t))},densityFogFactor:nx,depth:tp,depthPass:(e,t,r)=>Ii(new Fb(Fb.DEPTH,e,t,r)),determinant:_o,difference:Mo,diffuseColor:_n,directPointLight:vT,directionToColor:Ap,directionToFaceDirection:ed,dispersion:Xn,distance:Co,div:ga,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),cp(e)),dot:Po,drawIndex:ih,dynamicBufferAttribute:Mu,element:fn,emissive:vn,equal:fa,equals:So,equirectUV:Mp,exp:qa,exp2:ja,expression:$u,faceDirection:Jl,faceForward:Wo,faceforward:Qo,float:Yi,floor:Za,fog:ax,fract:to,frameGroup:Zn,frameId:xy,frontFacing:Zl,fwidth:xo,gain:(e,t)=>e.lessThan(.5)?dy(e.mul(2),t).div(2):ha(1,dy(pa(ha(1,e),2),t).div(2)),gapSize:Gn,getConstNodeType:Li,getCurrentStack:qi,getDirection:im,getDistanceAttenuation:_T,getGeometryRoughness:Zp,getNormalFromDepth:Zy,getParallaxCorrectNormal:b_,getRoughness:Jp,getScreenPosition:Qy,getShIrradianceAt:x_,getShadowMaterial:Jx,getShadowRenderObjectFunction:rT,getTextureIndex:ay,getViewPosition:Yy,globalId:mx,glsl:(e,t)=>jb(e,t,"glsl"),glslFn:(e,t)=>Kb(e,t,"glsl"),grayscale:Nb,greaterThan:xa,greaterThanEqual:_a,hash:ly,highpModelNormalViewMatrix:Hl,highpModelViewMatrix:zl,hue:wb,increment:Fa,incrementBefore:Ba,instance:ah,instanceIndex:eh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new rb(e,r,s);return gh(i,t,e)},instancedBufferAttribute:Pu,instancedDynamicBufferAttribute:Bu,instancedMesh:uh,int:Qi,inverse:vo,inverseSqrt:Qa,inversesqrt:Zo,invocationLocalIndex:sh,invocationSubgroupIndex:rh,ior:Hn,iridescence:Cn,iridescenceIOR:Mn,iridescenceThickness:Pn,ivec2:tn,ivec3:an,ivec4:dn,js:(e,t)=>jb(e,t,"js"),label:iu,length:co,lengthSq:Oo,lessThan:ba,lessThanEqual:Ta,lightPosition:Rx,lightProjectionUV:Ax,lightShadowMatrix:wx,lightTargetDirection:Px,lightTargetPosition:Cx,lightViewPosition:Mx,lightingContext:Ch,lights:(e=[])=>Ii(new Ix).setLights(e),linearDepth:rp,linearToneMapping:Db,localId:fx,log:Xa,log2:Ka,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Xa(r.div(t)));return Yi(Math.E).pow(s).mul(t).negate()},luminance:Ab,mat2:pn,mat3:gn,mat4:mn,matcapUV:Km,materialAO:Kc,materialAlphaTest:pc,materialAnisotropy:Bc,materialAnisotropyVector:Yc,materialAttenuationColor:kc,materialAttenuationDistance:Oc,materialClearcoat:wc,materialClearcoatNormal:Rc,materialClearcoatRoughness:Ac,materialColor:gc,materialDispersion:jc,materialEmissive:fc,materialEnvIntensity:yd,materialEnvRotation:bd,materialIOR:Uc,materialIridescence:Lc,materialIridescenceIOR:Fc,materialIridescenceThickness:Ic,materialLightMap:Xc,materialLineDashOffset:Wc,materialLineDashSize:zc,materialLineGapSize:Hc,materialLineScale:Gc,materialLineWidth:$c,materialMetalness:Sc,materialNormal:Ec,materialOpacity:yc,materialPointSize:qc,materialReference:Bd,materialReflectivity:vc,materialRefractionRatio:fd,materialRotation:Cc,materialRoughness:Nc,materialSheen:Mc,materialSheenRoughness:Pc,materialShininess:mc,materialSpecular:bc,materialSpecularColor:Tc,materialSpecularIntensity:xc,materialSpecularStrength:_c,materialThickness:Vc,materialTransmission:Dc,max:wo,maxMipLevel:rl,mediumpModelViewMatrix:Gl,metalness:Sn,min:Eo,mix:ko,mixElement:jo,mod:ma,modInt:Da,modelDirection:Bl,modelNormalMatrix:Ul,modelPosition:Fl,modelRadius:Vl,modelScale:Il,modelViewMatrix:kl,modelViewPosition:Dl,modelViewProjection:Qc,modelWorldMatrix:Ll,modelWorldMatrixInverse:Ol,morphReference:Eh,mrt:uy,mul:pa,mx_aastep:m_,mx_add:(e,t=Yi(0))=>ca(e,t),mx_atan2:(e=Yi(0),t=Yi(1))=>oo(e,t),mx_cell_noise_float:(e=Zu())=>QT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Yi(e).sub(r).mul(t).add(r),mx_divide:(e,t=Yi(1))=>ga(e,t),mx_fractal_noise_float:(e=Zu(),t=3,r=2,s=.5,i=1)=>JT(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Zu(),t=3,r=2,s=.5,i=1)=>t_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Zu(),t=3,r=2,s=.5,i=1)=>e_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Zu(),t=3,r=2,s=.5,i=1)=>r_(e,Qi(t),r,s).mul(i),mx_frame:()=>xy,mx_heighttonormal:(e,t)=>(e=nn(e),t=Yi(t),dc(e,t)),mx_hsvtorgb:h_,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=Yi(1))=>ha(t,e),mx_modulo:(e,t=Yi(1))=>ma(e,t),mx_multiply:(e,t=Yi(1))=>pa(e,t),mx_noise_float:(e=Zu(),t=1,r=0)=>KT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Zu(),t=1,r=0)=>YT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Zu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ln(YT(e),KT(e.add(en(19,73)))).mul(t).add(r)},mx_place2d:(e,t=en(.5,.5),r=en(1,1),s=Yi(0),i=en(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=en(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=Yi(1))=>Lo(e,t),mx_ramp4:(e,t,r,s,i=Zu())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ko(e,t,n),u=ko(r,s,n);return ko(o,u,a)},mx_ramplr:(e,t,r=Zu())=>f_(e,t,r,"x"),mx_ramptb:(e,t,r=Zu())=>f_(e,t,r,"y"),mx_rgbtohsv:p_,mx_rotate2d:(e,t)=>{e=en(e);const r=(t=Yi(t)).mul(Math.PI/180);return Jm(e,r)},mx_rotate3d:(e,t,r)=>{e=nn(e),t=Yi(t),r=nn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=Yi(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=Yi(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Zu())=>y_(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Zu())=>y_(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:g_,mx_subtract:(e,t=Yi(0))=>ha(e,t),mx_timer:()=>yy,mx_transform_uv:(e=1,t=0,r=Zu())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Zu(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>d_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Zu(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>c_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Zu(),t=1)=>o_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec2:(e=Zu(),t=1)=>u_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec3:(e=Zu(),t=1)=>l_(e.convert("vec2|vec3"),t,Qi(1)),negate:ho,neutralToneMapping:Wb,nodeArray:Ui,nodeImmutable:ki,nodeObject:Ii,nodeObjectIntent:Di,nodeObjects:Vi,nodeProxy:Oi,nodeProxyIntent:Gi,normalFlat:sd,normalGeometry:td,normalLocal:rd,normalMap:ac,normalView:ad,normalViewGeometry:id,normalWorld:od,normalWorldGeometry:nd,normalize:eo,not:Sa,notEqual:ya,numWorkgroups:px,objectDirection:El,objectGroup:ea,objectPosition:Al,objectRadius:Ml,objectScale:Rl,objectViewPosition:Cl,objectWorldMatrix:wl,oneMinus:po,or:Na,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=yy)=>e.fract(),oscSine:(e=yy)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=yy)=>e.fract().round(),oscTriangle:(e=yy)=>e.add(.5).fract().mul(2).sub(1).abs(),output:On,outputStruct:ny,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),pp(e)),overloadingFn:fy,parabola:dy,parallaxDirection:sc,parallaxUV:(e,t)=>e.sub(sc.mul(t)),parameter:(e,t)=>Ii(new Jf(e,t)),pass:(e,t,r)=>Ii(new Fb(Fb.COLOR,e,t,r)),passTexture:(e,t)=>Ii(new Bb(e,t)),pcurve:(e,t,r)=>Lo(ga(Lo(e,t),ca(Lo(e,t),Lo(ha(1,e),r))),1/t),perspectiveDepthToViewZ:Zh,pmremTexture:Fm,pointShadow:xT,pointUV:nb,pointWidth:zn,positionGeometry:$l,positionLocal:Wl,positionPrevious:ql,positionView:Kl,positionViewDirection:Yl,positionWorld:jl,positionWorldDirection:Xl,posterize:Mb,pow:Lo,pow2:Fo,pow3:Io,pow4:Do,premultiplyAlpha:mp,property:xn,radians:$a,rand:qo,range:dx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),ax(e,ix(t,r))},rangeFogFactor:ix,reciprocal:yo,reference:Cd,referenceBuffer:Md,reflect:Ro,reflectVector:_d,reflectView:xd,reflector:e=>Ii(new Gy(e)),refract:Ho,refractVector:vd,refractView:Td,reinhardToneMapping:Vb,remap:Gu,remapClamp:zu,renderGroup:Jn,renderOutput:ju,rendererReference:Su,rotate:Jm,rotateUV:Ty,roughness:Nn,round:fo,rtt:Ky,sRGBTransferEOTF:mu,sRGBTransferOETF:fu,sample:e=>Ii(new Jy(e)),sampler:e=>(!0===e.isNode?e:al(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:al(e)).convert("samplerComparison"),saturate:zo,saturation:Sb,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),hp(e)),screenCoordinate:Dh,screenSize:Ih,screenUV:Fh,scriptable:rx,scriptableValue:Qb,select:eu,setCurrentStack:Wi,setName:su,shaderStages:Hs,shadow:lT,shadowPositionWorld:Vx,shapeCircle:ET,sharedUniformGroup:Qn,sheen:An,sheenRoughness:Rn,shiftLeft:Ma,shiftRight:Pa,shininess:Un,sign:lo,sin:ro,sinc:(e,t)=>ro(ka.mul(t.mul(e).sub(1))).div(ka.mul(t.mul(e).sub(1))),skinning:yh,smoothstep:$o,smoothstepElement:Xo,specularColor:Dn,specularF90:Vn,spherizeUV:_y,split:(e,t)=>Ii(new Js(Ii(e),t)),spritesheetUV:Ey,sqrt:Ya,stack:ty,step:Ao,stepElement:Ko,storage:gh,storageBarrier:()=>bx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),gh(e,t,r).setPBO(!0)),storageTexture:pb,string:(e="")=>Ii(new ii(e,"string")),struct:(e,t=null)=>{const r=new ry(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;ebx("texture").toStack(),textureBicubic:Rg,textureBicubicLevel:Ag,textureCubeUV:nm,textureLoad:ol,textureSize:el,textureStore:(e,t,r)=>{const s=pb(e,t,r);return null!==r&&s.toStack(),s},thickness:Wn,time:yy,toneMapping:wu,toneMappingExposure:Au,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ii(new Ib(t,r,Ii(s),Ii(i),Ii(n))),transformDirection:Vo,transformNormal:ld,transformNormalToView:dd,transformedClearcoatNormalView:pd,transformedNormalView:cd,transformedNormalWorld:hd,transmission:$n,transpose:To,triNoise3D:py,triplanarTexture:(...e)=>wy(...e),triplanarTextures:wy,trunc:bo,uint:Zi,uniform:ra,uniformArray:hl,uniformCubeTexture:(e=Nd)=>Ed(e),uniformGroup:Yn,uniformTexture:(e=sl)=>al(e),unpremultiplyAlpha:fp,userData:(e,t,r)=>Ii(new yb(e,t,r)),uv:Zu,uvec2:rn,uvec3:on,uvec4:cn,varying:pu,varyingProperty:Tn,vec2:en,vec3:nn,vec4:ln,vectorComponents:$s,velocity:vb,vertexColor:lp,vertexIndex:Jc,vertexStage:gu,vibrance:Eb,viewZToLogarithmicDepth:Jh,viewZToOrthographicDepth:Yh,viewZToPerspectiveDepth:Qh,viewport:Vh,viewportCoordinate:Oh,viewportDepthTexture:Xh,viewportLinearDepth:sp,viewportMipTexture:Wh,viewportResolution:Gh,viewportSafeUV:Ny,viewportSharedTexture:Sp,viewportSize:Uh,viewportTexture:$h,viewportUV:kh,wgsl:(e,t)=>jb(e,t,"wgsl"),wgslFn:(e,t)=>Kb(e,t,"wgsl"),workgroupArray:(e,t)=>Ii(new Tx("Workgroup",e,t)),workgroupBarrier:()=>bx("workgroup").toStack(),workgroupId:gx,workingToColorSpace:xu,xor:Ea});const __=new Zf;class v_ extends xf{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(__),__.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(__),__.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;__.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=ru(ln(u).mul(db),{getUV:()=>cb.mul(nd),getTextureLevel:()=>lb});let h=Qc;h=h.setZ(h.w);const p=new yp;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=S,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new X(new Oe(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=ln(u).mul(db),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?__.set(0,0,0,1):"alpha-blend"===a&&__.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=__.r,m.g=__.g,m.b=__.b,m.a=__.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let N_=0;class S_{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=N_++}}class E_{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new S_(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class w_{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class A_{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class R_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class C_ extends R_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class M_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let P_=0;class B_{constructor(e=null){this.id=P_++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class L_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class F_{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class I_ extends F_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class D_ extends F_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class V_ extends F_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class U_ extends F_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class O_ extends F_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class k_ extends F_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class G_ extends F_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class z_ extends F_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class H_ extends I_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class $_ extends D_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class W_ extends V_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class q_ extends U_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class j_ extends O_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class X_ extends k_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class K_ extends G_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Y_ extends z_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Q_=new WeakMap,Z_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),J_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class ev{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=ty(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new B_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.currentStack=null,this.subBuildFn=null}getBindGroupsCache(){let e=Q_.get(this.renderer);return void 0===e&&(e=new gf,Q_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ue(e,t,r)}createCubeRenderTarget(e,t){return new Pp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new S_(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new S_(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Hs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${J_(n.r)}, ${J_(n.g)}, ${J_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new w_(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===_)return"int";if(t===T)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=ws(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return Z_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=ty(this.stack),this.stacks.push(qi()||this.stack),Wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Wi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new w_("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new L_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new A_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new R_(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new C_(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new M_("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Xb,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Jf(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new B_,this.stack=ty();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new yp),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Hs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new H_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new $_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new W_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new q_(e);if("color"===t)return new j_(e);if("mat2"===t)return new X_(e);if("mat3"===t)return new K_(e);if("mat4"===t)return new Y_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${He} - Node System\n`}*[Symbol.iterator](){}}class tv{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class rv{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}rv.isNodeFunctionInput=!0;class sv extends TT{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Px(this.light),lightColor:e}}}const iv=new a,nv=new a;let av=null;class ov extends TT{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ra(new r).setGroup(Jn),this.halfWidth=ra(new r).setGroup(Jn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;nv.identity(),iv.copy(t.matrixWorld),iv.premultiply(r),nv.extractRotation(iv),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(nv),this.halfHeight.value.applyMatrix4(nv)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=al(av.LTC_FLOAT_1),r=al(av.LTC_FLOAT_2)):(t=al(av.LTC_HALF_1),r=al(av.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Mx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){av=e}}class uv extends TT{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ra(0).setGroup(Jn),this.penumbraCosNode=ra(0).setGroup(Jn),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(0).setGroup(Jn),this.colorNode=ra(this.color).setGroup(Jn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return $o(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=Ax(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Px(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=_T({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=al(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class lv extends uv{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=al(r,en(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const dv=$i(([e,t])=>{const r=e.abs().sub(t);return co(wo(r,0)).add(Eo(wo(r.x,r.y),0))});class cv extends uv{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=Yi(0),r=this.penumbraCosNode,s=wx(this.light).mul(e.context.positionWorld||jl);return ji(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=dv(e.xy.sub(en(.5)),en(.5)),n=ga(-1,ha(1,ao(r)).sub(1));t.assign(zo(i.mul(-2).mul(n)))}),t}}class hv extends TT{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class pv extends TT{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Rx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ra(new e).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=od.dot(s).mul(.5).add(.5),n=ko(r,t,i);e.context.irradiance.addAssign(n)}}class gv extends TT{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=hl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=x_(od,this.lightProbe);e.context.irradiance.addAssign(t)}}class mv{parseFunction(){console.warn("Abstract function.")}}class fv{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}fv.isNodeFunction=!0;const yv=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,bv=/[a-z_0-9]+/gi,xv="#pragma main";class Tv extends fv{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(xv),r=-1!==t?e.slice(t+12):e,s=r.match(yv);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=bv.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===Z||r.mapping===J||r.mapping===he){if(e.backgroundBlurriness>0||r.mapping===he)return Fm(r);{let e;return e=!0===r.isCubeTexture?wd(r):al(r),Dp(e)}}if(!0===r.isTexture)return al(r,Fh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=Cd("color","color",r).setGroup(Jn),t=Cd("density","float",r).setGroup(Jn);return ax(e,nx(t))}if(r.isFog){const e=Cd("color","color",r).setGroup(Jn),t=Cd("near","float",r).setGroup(Jn),s=Cd("far","float",r).setGroup(Jn);return ax(e,ix(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?wd(r):!0===r.isTexture?al(r):void console.error("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return vv.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?fb(e,nn(Fh,pl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):al(e,Fh).renderOutput(t.toneMapping,t.currentColorSpace);return vv.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new tv,this.nodeBuilderCache=new Map,this.cacheLib={}}}const wv=new Me;class Av{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new Iv(i.framebufferWidth,i.framebufferHeight,{format:de,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;Ov(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function Hv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function $v(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new Ev(this,r),this._animation=new pf(this._nodes,this.info),this._attributes=new Ef(r),this._background=new v_(this,this._nodes),this._geometries=new Rf(this._attributes,this.info),this._textures=new Qf(this,r,this.info),this._pipelines=new If(r,this._nodes),this._bindings=new Df(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new bf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new zf(this.lighting),this._bundles=new Mv,this._renderContexts=new Kf,this._animation.start(),this._initialized=!0,e(this)})),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:Wv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new Av),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)}),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=zl,this.overrideNodes.modelNormalViewMatrix=Hl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===zl&&this.overrideNodes.modelNormalViewMatrix===Hl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=x,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(jv),p.scissorValue.copy(y).multiplyScalar(b).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(jv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Av),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Kv:Xv;t.isArrayCamera||(Yv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(Yv,t.coordinateSystem,t.reversedDepth));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:E,transparent:w,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_setXRLayerSize(e,t){this._width=e,this._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:c.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()}),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls;const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.delete(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Qv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=Qv.copy(t).floor()}else t=Qv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?Kv:Xv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Qv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(Yv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Qv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?Kv:Xv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Qv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(Yv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=S;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=qe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=E}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===E&&!1===i.forceSinglePass?(i.side=S,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=qe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=E):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class Jv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class eN extends Jv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Sf-e%Sf)%Sf;var e}get buffer(){return this._buffer}update(){return!0}}class tN extends eN{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let rN=0;class sN extends tN{constructor(e,t){super("UniformBuffer_"+rN++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class iN extends tN{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.texture=null},this.texture=t,this.version=t?t.version:0,this.generation=null,this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onDisposeTexture),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onDisposeTexture))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}}let uN=0;class lN extends oN{constructor(e,t){super(e,t),this.id=uN++,this.store=!1,this.isSampledTexture=!0}}class dN extends lN{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class cN extends dN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class hN extends dN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const pN={textureDimensions:"textureSize",equals:"equal"},gN={low:"lowp",medium:"mediump",high:"highp"},mN={swizzleAssign:!0,storageBuffer:!1},fN={perspective:"smooth",linear:"noperspective"},yN={centroid:"centroid"},bN="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class xN extends ev{constructor(e,t){super(e,t,new _v),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==b}getMethod(e){return pN[e]||e}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?it:nt;2===s?n=i?lt:Ve:3===s?n=i?dt:ct:4===s&&(n=i?ht:de);const a={Float32Array:I,Uint8Array:Ce,Uint16Array:ut,Uint32Array:T,Int8Array:ot,Int16Array:at,Int32Array:_,Uint8ClampedArray:Ce},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=gN[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==_){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${fN[s.interpolationType]||s.interpolationType} ${yN[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${fN[e.interpolationType]||e.interpolationType} ${yN[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=mN[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}mN[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new dN(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new cN(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new hN(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new sN(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new aN(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let TN=null,_N=null;class vN{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void pt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void pt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return TN=TN||new t,this.renderer.getDrawingBufferSize(TN)}setScissorTest(){}getClearColor(){const e=this.renderer;return _N=_N||new Zf,e.getClearColor(_N),_N.getRGB(_N),_N}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:gt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${He} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let NN,SN,EN=0;class wN{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class AN{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===_,id:EN++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new wN(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let MN,PN,BN,LN=!1;class FN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===LN&&(this._init(),LN=!0)}_init(){const e=this.gl;MN={[Nr]:e.REPEAT,[vr]:e.CLAMP_TO_EDGE,[_r]:e.MIRRORED_REPEAT},PN={[v]:e.NEAREST,[Sr]:e.NEAREST_MIPMAP_NEAREST,[Ge]:e.NEAREST_MIPMAP_LINEAR,[Y]:e.LINEAR,[ke]:e.LINEAR_MIPMAP_NEAREST,[V]:e.LINEAR_MIPMAP_LINEAR},BN={[Pr]:e.NEVER,[Mr]:e.ALWAYS,[De]:e.LESS,[Cr]:e.LEQUAL,[Rr]:e.EQUAL,[Ar]:e.GEQUAL,[wr]:e.GREATER,[Er]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=c.getPrimaries(c.workingColorSpace),a=t.colorSpace===b?null:c.getPrimaries(t.colorSpace),o=t.colorSpace===b||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,MN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,MN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,MN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,PN[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===Y&&u?V:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,PN[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,BN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===v)return;if(t.minFilter!==Ge&&t.minFilter!==V)return;if(t.type===I&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}function IN(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class DN{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class VN{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const UN={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class ON{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce((e,t)=>e+t,0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class zN extends vN{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new DN(this),this.capabilities=new VN(this),this.attributeUtils=new AN(this),this.textureUtils=new FN(this),this.bufferRenderer=new ON(this),this.state=new RN(this),this.utils=new CN(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new GN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(o)){const i=s.framebuffers[e.getCacheKey()];let n=t.COLOR_BUFFER_BIT;o.resolveDepthBuffer&&(o.depthBuffer&&(n|=t.DEPTH_BUFFER_BIT),o.stencilBuffer&&o.resolveStencilBuffer&&(n|=t.STENCIL_BUFFER_BIT));const a=s.msaaFrameBuffer,u=s.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i),d)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(pt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):pt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eUN[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Wf(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,0)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const HN="point-list",$N="line-list",WN="line-strip",qN="triangle-list",jN="triangle-strip",XN="never",KN="less",YN="equal",QN="less-equal",ZN="greater",JN="not-equal",eS="greater-equal",tS="always",rS="store",sS="load",iS="clear",nS="ccw",aS="none",oS="front",uS="back",lS="uint16",dS="uint32",cS="r8unorm",hS="r8snorm",pS="r8uint",gS="r8sint",mS="r16uint",fS="r16sint",yS="r16float",bS="rg8unorm",xS="rg8snorm",TS="rg8uint",_S="rg8sint",vS="r32uint",NS="r32sint",SS="r32float",ES="rg16uint",wS="rg16sint",AS="rg16float",RS="rgba8unorm",CS="rgba8unorm-srgb",MS="rgba8snorm",PS="rgba8uint",BS="rgba8sint",LS="bgra8unorm",FS="bgra8unorm-srgb",IS="rgb9e5ufloat",DS="rgb10a2unorm",VS="rgb10a2unorm",US="rg32uint",OS="rg32sint",kS="rg32float",GS="rgba16uint",zS="rgba16sint",HS="rgba16float",$S="rgba32uint",WS="rgba32sint",qS="rgba32float",jS="depth16unorm",XS="depth24plus",KS="depth24plus-stencil8",YS="depth32float",QS="depth32float-stencil8",ZS="bc1-rgba-unorm",JS="bc1-rgba-unorm-srgb",eE="bc2-rgba-unorm",tE="bc2-rgba-unorm-srgb",rE="bc3-rgba-unorm",sE="bc3-rgba-unorm-srgb",iE="bc4-r-unorm",nE="bc4-r-snorm",aE="bc5-rg-unorm",oE="bc5-rg-snorm",uE="bc6h-rgb-ufloat",lE="bc6h-rgb-float",dE="bc7-rgba-unorm",cE="bc7-rgba-srgb",hE="etc2-rgb8unorm",pE="etc2-rgb8unorm-srgb",gE="etc2-rgb8a1unorm",mE="etc2-rgb8a1unorm-srgb",fE="etc2-rgba8unorm",yE="etc2-rgba8unorm-srgb",bE="eac-r11unorm",xE="eac-r11snorm",TE="eac-rg11unorm",_E="eac-rg11snorm",vE="astc-4x4-unorm",NE="astc-4x4-unorm-srgb",SE="astc-5x4-unorm",EE="astc-5x4-unorm-srgb",wE="astc-5x5-unorm",AE="astc-5x5-unorm-srgb",RE="astc-6x5-unorm",CE="astc-6x5-unorm-srgb",ME="astc-6x6-unorm",PE="astc-6x6-unorm-srgb",BE="astc-8x5-unorm",LE="astc-8x5-unorm-srgb",FE="astc-8x6-unorm",IE="astc-8x6-unorm-srgb",DE="astc-8x8-unorm",VE="astc-8x8-unorm-srgb",UE="astc-10x5-unorm",OE="astc-10x5-unorm-srgb",kE="astc-10x6-unorm",GE="astc-10x6-unorm-srgb",zE="astc-10x8-unorm",HE="astc-10x8-unorm-srgb",$E="astc-10x10-unorm",WE="astc-10x10-unorm-srgb",qE="astc-12x10-unorm",jE="astc-12x10-unorm-srgb",XE="astc-12x12-unorm",KE="astc-12x12-unorm-srgb",YE="clamp-to-edge",QE="repeat",ZE="mirror-repeat",JE="linear",ew="nearest",tw="zero",rw="one",sw="src",iw="one-minus-src",nw="src-alpha",aw="one-minus-src-alpha",ow="dst",uw="one-minus-dst",lw="dst-alpha",dw="one-minus-dst-alpha",cw="src-alpha-saturated",hw="constant",pw="one-minus-constant",gw="add",mw="subtract",fw="reverse-subtract",yw="min",bw="max",xw=0,Tw=15,_w="keep",vw="zero",Nw="replace",Sw="invert",Ew="increment-clamp",ww="decrement-clamp",Aw="increment-wrap",Rw="decrement-wrap",Cw="storage",Mw="read-only-storage",Pw="write-only",Bw="read-only",Lw="read-write",Fw="non-filtering",Iw="comparison",Dw="float",Vw="unfilterable-float",Uw="depth",Ow="sint",kw="uint",Gw="2d",zw="3d",Hw="2d",$w="2d-array",Ww="cube",qw="3d",jw="all",Xw="vertex",Kw="instance",Yw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"};class Qw extends oN{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class Zw extends eN{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Jw=0;class eA extends Zw{constructor(e,t){super("StorageBuffer_"+Jw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class tA extends xf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:JE}),this.flipYSampler=e.createSampler({minFilter:ew}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:jN,stripIndexFormat:dS},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:jN,stripIndexFormat:dS},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:iS,storeOp:rS,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Hw,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,oA=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,uA={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class lA extends fv{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(aA);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=oA.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class dA extends mv{parseFunction(e){return new lA(e)}}const cA="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},hA={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},pA={[Nr]:"repeat",[vr]:"clamp",[_r]:"mirror"},gA={vertex:cA?cA.VERTEX:1,fragment:cA?cA.FRAGMENT:2,compute:cA?cA.COMPUTE:4},mA={instance:!0,swizzleAssign:!1,storageBuffer:!0},fA={"^^":"tsl_xor"},yA={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},bA={},xA={tsl_xor:new qb("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new qb("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new qb("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new qb("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new qb("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new qb("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new qb("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new qb("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new qb("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new qb("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new qb("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new qb("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new qb("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},TA={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(xA.pow_float=new qb("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),xA.pow_vec2=new qb("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[xA.pow_float]),xA.pow_vec3=new qb("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[xA.pow_float]),xA.pow_vec4=new qb("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[xA.pow_float]),TA.pow_float="tsl_pow_float",TA.pow_vec2="tsl_pow_vec2",TA.pow_vec3="tsl_pow_vec3",TA.pow_vec4="tsl_pow_vec4");let _A="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(_A+="diagnostic( off, derivative_uniformity );\n");class vA extends ev{constructor(e,t){super(e,t,new dA),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${pA[e.wrapS]}S_${pA[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=bA[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Nr?(s.push(xA.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===vr?(s.push(xA.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===_r?(s.push(xA.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",bA[t]=r=new qb(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new nu(new Hu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new nu(new Hu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new nu(new Hu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===I||!1===this.isSampleCompare(e)&&e.minFilter===v&&e.magFilter===v||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return!0===e.isDepthTexture&&!0===e.isArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=fA[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(console.warn("WebGPURenderer: Atomic operations are only supported in compute shaders."),ks.READ_WRITE):ks.READ_ONLY:e.access}getStorageAccess(e,t){return hA[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new hN(i.name,i.node,o,n):new dN(i.name,i.node,o,n):"cubeTexture"===t?s=new cN(i.name,i.node,o,n):"texture3D"===t&&(s=new hN(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(gA[r]),!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Qw(`${i.name}_sampler`,i.node,o);e.setVisibility(gA[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?sN:eA)(e,o);n.setVisibility(gA[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new aN(u,o),s.setVisibility(gA[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=nA(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return yA[e]||e}isAvailable(e){let t=mA[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),mA[e]=t),t}_getWGSLMethod(e){return void 0!==xA[e]&&this._include(e),TA[e]}_include(e){const t=xA[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${_A}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class NA{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=KS:e.depth&&(t=XS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?HN:e.isLineSegments||e.isMesh&&!0===t.wireframe?$N:e.isLine?WN:e.isMesh?qN:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return LS;if(e===ce)return HS;throw new Error("Unsupported outputType")}}const SA=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&SA.set(Float16Array,["float16"]);const EA=new Map([[ze,["float16"]]]),wA=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class AA{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Vw)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=Vw:s.sampleType=Uw;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===_?s.sampleType=Ow:e===T?s.sampleType=kw:e===I&&(this.backend.hasFeature("float32-filterable")?s.sampleType=Dw:s.sampleType=Vw)}r.isSampledCubeTexture?s.viewDimension=Ww:r.texture.isArrayTexture||r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=$w:r.isSampledTexture3D&&(s.viewDimension=qw),e.texture=s}else if(r.isSampler){const s={};r.texture.isDepthTexture&&(null!==r.texture.compareFunction?s.type=Iw:t.compatibilityMode&&(s.type=Fw)),e.sampler=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount;let s=`view-${e.texture.width}-${e.texture.height}`;if(e.texture.depthOrArrayLayers>1&&(s+=`-${e.texture.depthOrArrayLayers}`),s+=`-${r}`,a=e[s],void 0===a){const i=jw;let n;n=t.isSampledCubeTexture?Ww:t.isSampledTexture3D?qw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?$w:Hw,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class CA{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;s.blending===H||s.blending===k&&!1===s.transparent||(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise(e=>{l.createRenderPipelineAsync(S).then(t=>{c.pipeline=t,e()})});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===je){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:gw},r={srcFactor:i,dstFactor:n,operation:gw}};if(e.premultipliedAlpha)switch(s){case k:i(rw,aw,rw,aw);break;case Bt:i(rw,rw,rw,rw);break;case Pt:i(tw,iw,tw,rw);break;case Mt:i(ow,aw,tw,rw)}else switch(s){case k:i(nw,aw,rw,aw);break;case Bt:i(nw,rw,rw,rw);break;case Pt:console.error("THREE.WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Mt:console.error("THREE.WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=tw;break;case wt:t=rw;break;case Et:t=sw;break;case Tt:t=iw;break;case St:t=nw;break;case xt:t=aw;break;case vt:t=ow;break;case bt:t=uw;break;case _t:t=lw;break;case yt:t=dw;break;case Nt:t=cw;break;case 211:t=hw;break;case 212:t=pw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case kr:t=XN;break;case Or:t=tS;break;case Ur:t=KN;break;case Vr:t=QN;break;case Dr:t=YN;break;case Ir:t=eS;break;case Fr:t=ZN;break;case Lr:t=JN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=_w;break;case jr:t=vw;break;case qr:t=Nw;break;case Wr:t=Sw;break;case $r:t=Ew;break;case Hr:t=ww;break;case zr:t=Aw;break;case Gr:t=Rw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=gw;break;case ft:t=mw;break;case mt:t=fw;break;case Yr:t=yw;break;case Kr:t=bw;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?lS:dS),r.side){case qe:s.frontFace=nS,s.cullMode=uS;break;case S:s.frontFace=nS,s.cullMode=oS;break;case E:s.frontFace=nS,s.cullMode=aS;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Tw:xw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=tS;else{const r=e.depthFunc;switch(r){case kt:t=XN;break;case Ot:t=tS;break;case Ut:t=KN;break;case Vt:t=QN;break;case Dt:t=YN;break;case It:t=eS;break;case Ft:t=ZN;break;case Lt:t=JN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class MA extends kN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class PA extends vN{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new NA(this),this.attributeUtils=new AA(this),this.bindingUtils=new RA(this),this.pipelineUtils=new CA(this),this.textureUtils=new iA(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Yw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)});const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Yw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:sS}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea&&(u[0]=Math.min(i,a),u[1]=Math.ceil(i/a)),n.dispatchSize=u}u=n.dispatchSize}else u=i;a.dispatchWorkgroups(u[0],u[1]||1,u[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{this.pipelineUtils.setPipeline(t,u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&pt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new zN(e)));super(new t(e),e),this.library=new FA,this.isWebGPURenderer=!0}}class DA extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class VA{constructor(e,t=ln(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new yp;r.name="PostProcessing",this._quadMesh=new qy(r),this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ju(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}}class UA extends x{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class OA extends sb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class kA extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Yi()):Ii(new this.nodes[e])}}class GA extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class zA extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new kA;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new GA;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>bs(e),Ts=e=>bs(e),_s=(...e)=>bs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(bs(s.slice(0,-4)),i.getCacheKey(t));return bs(r)}function*Ns(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0)).buffer}var Ds=Object.freeze({__proto__:null,arrayBufferToBase64:Fs,base64ToArrayBuffer:Is,getByteBoundaryFromType:Ms,getCacheKey:vs,getDataFromObject:Ls,getLengthFromType:Rs,getMemoryLengthFromType:Cs,getNodeChildren:Ns,getTypeFromLength:ws,getTypedArrayFromType:As,getValueFromType:Bs,getValueType:Ps,hash:_s,hashArray:Ts,hashString:xs});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],Hs=[...Gs,"compute"],$s=["x","y","z","w"],Ws={analyze:"setup",generate:"analyze"};let qs=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:qs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of Ns(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=_s(vs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}getArrayCount(){return null}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e,t=null){const r=e.increaseUsage(this);if(!0===this.parents){const r=e.getDataFromNode(this,"any");r.stages=r.stages||{},r.stages[e.shaderStage]=r.stages[e.shaderStage]||[],r.stages[e.shaderStage].push(t)}if(1===r){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e,this)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);const s=e.getDataFromNode(this);s.buildStages=s.buildStages||{},s.buildStages[e.buildStage]=!0;const i=Ws[e.buildStage];if(i&&!0!==s.buildStages[i]){const t=e.getBuildStage();e.setBuildStage(i),this.build(e),e.setBuildStage(t)}e.addNode(this),e.addChain(this);let n=null;const a=e.getBuildStage();if("setup"===a){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0,t.outputNode=this.setup(e)||t.outputNode||null;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}}n=t.outputNode}else if("analyze"===a)this.analyze(e,t);else if("generate"===a){if(1===this.generate.length){const r=this.getNodeType(e),s=e.getDataFromNode(this);n=s.snippet,void 0===n?void 0===s.generated?(s.generated=!0,n=this.generate(e)||"",s.snippet=n):(console.warn("THREE.Node: Recursion detected.",this),n="/* Recursion detected. */"):void 0!==s.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),n=e.format(n,r,t)}else n=this.generate(e,t)||"";""===n&&null!==t&&"void"!==t&&"OutputType"!==t&&(console.error(`THREE.TSL: Invalid generated code, expected a "${t}".`),n=e.generateConst(t))}return e.removeChain(this),e.addSequentialNode(this),n}getSerializeChildren(){return Ns(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Xs extends js{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ks extends js{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Ys extends js{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Qs extends Ys{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Zs=$s.join("");class Js extends js{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max($s.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Zs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class ei extends Ys{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),di=e=>li(e).split("").sort().join(""),ci={setup(e,t){const r=t.shift();return e(Vi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ai.assign(r,...e),r);if(oi.has(t)){const s=oi.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("toVarIntent"===t)return()=>r;if("self"===t)return e;if(t.endsWith("Assign")&&oi.has(t.slice(0,t.length-6))){const s=oi.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=li(t),Ii(new Js(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(3).toLowerCase()),r=>Ii(new ei(e,t,Ii(r)));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=di(t.slice(4).toLowerCase()),()=>Ii(new ti(Ii(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Ii(new Js(e,t));if(!0===/^\d+$/.test(t))return Ii(new Xs(r,new ii(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Ii(new ni(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},hi=new WeakMap,pi=new WeakMap,gi=function(e,t=null){for(const r in e)e[r]=Ii(e[r],t);return e},mi=function(e,t=null){const r=e.length;for(let s=0;so?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ui(l(t)))):null!==r?(r=Ii(r),n=(...s)=>i(new e(t,...Ui(l(s)),r))):n=(...r)=>i(new e(t,...Ui(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},yi=function(e,...t){return Ii(new e(...Ui(t)))};class bi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn;e.subBuildFn=i;let o=null;if(t.layout){let s=pi.get(e.constructor);void 0===s&&(s=new WeakMap,pi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Ii(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i),o=Ii(i.call(r))}else{let s=r;if(Array.isArray(s)){let e=0;s=new Proxy(s,{get:(t,r,s)=>{let i;return i=void 0===t[r]?t[e++]:Reflect.get(t,r,s),i}})}const i=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),n=t.jsFunc,a=null!==s||n.length>1?n(s||[],i):n(i);o=Ii(a)}return e.subBuildFn=a,t.once&&(s[n]=o),o}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e);if("setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return r}}class xi extends js{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Vi(e),Ii(new bi(this,e))}setup(){return this.call()}}const Ti=[!1,!0],_i=[0,1,2,3],vi=[-1,-2],Ni=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Si=new Map;for(const e of Ti)Si.set(e,new ii(e));const Ei=new Map;for(const e of _i)Ei.set(e,new ii(e,"uint"));const wi=new Map([...Ei].map(e=>new ii(e.value,"int")));for(const e of vi)wi.set(e,new ii(e,"int"));const Ai=new Map([...wi].map(e=>new ii(e.value)));for(const e of Ni)Ai.set(e,new ii(e));for(const e of Ni)Ai.set(-e,new ii(-e));const Ri={bool:Si,uint:Ei,ints:wi,float:Ai},Ci=new Map([...Si,...Ai]),Mi=(e,t)=>Ci.has(e)?Ci.get(e):!0===e.isNode?e:new ii(e,t),Pi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return console.error(`THREE.TSL: Invalid parameter for the type "${e}".`),Ii(new ii(0,e));if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Bs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Di(t.get(r[0]));if(1===r.length){const t=Mi(r[0],e);return t.nodeType===e?Di(t):Di(new Ks(t,e))}const s=r.map(e=>Mi(e));return Di(new Qs(s,e))}},Bi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),ci)}const Ii=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=hi.get(e);return void 0===t&&(t=new Proxy(e,ci),hi.set(e,t),hi.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Ii(Mi(e,t)):"shader"===r?e.isFn?e:$i(e):e}(e,t),Di=(e,t=null)=>Ii(e,t).toVarIntent(),Vi=(e,t=null)=>new gi(e,t),Ui=(e,t=null)=>new mi(e,t),Oi=(e,t=null,r=null,s=null)=>new fi(e,t,r,s),ki=(e,...t)=>new yi(e,...t),Gi=(e,t=null,r=null,s={})=>new fi(e,t,r,{intent:!0,...s});let zi=0;class Hi extends js{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null)),this.shaderNode=new Fi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+zi++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){let t;Vi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];const r=this.shaderNode.call(t);return"void"===this.shaderNode.nodeType&&r.toStack(),r.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return console.error('THREE.TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function $i(e,t=null){const r=new Hi(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const Wi=e=>{ai=e},qi=()=>ai,ji=(...e)=>ai.If(...e);function Xi(e){return ai&&ai.add(e),e}ui("toStack",Xi);const Ki=new Pi("color"),Yi=new Pi("float",Ri.float),Qi=new Pi("int",Ri.ints),Zi=new Pi("uint",Ri.uint),Ji=new Pi("bool",Ri.bool),en=new Pi("vec2"),tn=new Pi("ivec2"),rn=new Pi("uvec2"),sn=new Pi("bvec2"),nn=new Pi("vec3"),an=new Pi("ivec3"),on=new Pi("uvec3"),un=new Pi("bvec3"),ln=new Pi("vec4"),dn=new Pi("ivec4"),cn=new Pi("uvec4"),hn=new Pi("bvec4"),pn=new Pi("mat2"),gn=new Pi("mat3"),mn=new Pi("mat4");ui("toColor",Ki),ui("toFloat",Yi),ui("toInt",Qi),ui("toUint",Zi),ui("toBool",Ji),ui("toVec2",en),ui("toIVec2",tn),ui("toUVec2",rn),ui("toBVec2",sn),ui("toVec3",nn),ui("toIVec3",an),ui("toUVec3",on),ui("toBVec3",un),ui("toVec4",ln),ui("toIVec4",dn),ui("toUVec4",cn),ui("toBVec4",hn),ui("toMat2",pn),ui("toMat3",gn),ui("toMat4",mn);const fn=Oi(Xs).setParameterLength(2),yn=(e,t)=>Ii(new Ks(Ii(e),t));ui("element",fn),ui("convert",yn);ui("append",e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),Xi(e)));class bn extends js{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const xn=(e,t)=>Ii(new bn(e,t)),Tn=(e,t)=>Ii(new bn(e,t,!0)),_n=ki(bn,"vec4","DiffuseColor"),vn=ki(bn,"vec3","EmissiveColor"),Nn=ki(bn,"float","Roughness"),Sn=ki(bn,"float","Metalness"),En=ki(bn,"float","Clearcoat"),wn=ki(bn,"float","ClearcoatRoughness"),An=ki(bn,"vec3","Sheen"),Rn=ki(bn,"float","SheenRoughness"),Cn=ki(bn,"float","Iridescence"),Mn=ki(bn,"float","IridescenceIOR"),Pn=ki(bn,"float","IridescenceThickness"),Bn=ki(bn,"float","AlphaT"),Ln=ki(bn,"float","Anisotropy"),Fn=ki(bn,"vec3","AnisotropyT"),In=ki(bn,"vec3","AnisotropyB"),Dn=ki(bn,"color","SpecularColor"),Vn=ki(bn,"float","SpecularF90"),Un=ki(bn,"float","Shininess"),On=ki(bn,"vec4","Output"),kn=ki(bn,"float","dashSize"),Gn=ki(bn,"float","gapSize"),zn=ki(bn,"float","pointWidth"),Hn=ki(bn,"float","IOR"),$n=ki(bn,"float","Transmission"),Wn=ki(bn,"float","Thickness"),qn=ki(bn,"float","AttenuationDistance"),jn=ki(bn,"color","AttenuationColor"),Xn=ki(bn,"float","Dispersion");class Kn extends js{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Yn=e=>new Kn(e),Qn=(e,t=0)=>new Kn(e,!0,t),Zn=Qn("frame"),Jn=Qn("render"),ea=Yn("object");class ta extends ri{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ea}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate(t=>{const s=e(t,r);void 0!==s&&(this.value=s)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const ra=(e,t)=>{const r=Li(t||e);return r===e&&(e=Bs(r)),e=e&&!0===e.isNode?e.node&&e.node.value||e.value:e,Ii(new ta(e,r))};class sa extends Ys{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ia=(...e)=>{let t;if(1===e.length){const r=e[0];t=new sa(null,r.length,r)}else{const r=e[0],s=e[1];t=new sa(r,s)}return Ii(t)};ui("toArray",(e,t)=>ia(Array(t).fill(e)));class na extends Ys{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return $s.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this;e.getNodeProperties(t).assign=!0;const s=e.getNodeProperties(this);s.sourceNode=r,s.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ui(t):Vi(t[0]),Ii(new oa(Ii(e),t)));ui("call",ua);const la={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class da extends Ys{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new da(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const ca=Gi(da,"+").setParameterLength(2,1/0).setName("add"),ha=Gi(da,"-").setParameterLength(2,1/0).setName("sub"),pa=Gi(da,"*").setParameterLength(2,1/0).setName("mul"),ga=Gi(da,"/").setParameterLength(2,1/0).setName("div"),ma=Gi(da,"%").setParameterLength(2).setName("mod"),fa=Gi(da,"==").setParameterLength(2).setName("equal"),ya=Gi(da,"!=").setParameterLength(2).setName("notEqual"),ba=Gi(da,"<").setParameterLength(2).setName("lessThan"),xa=Gi(da,">").setParameterLength(2).setName("greaterThan"),Ta=Gi(da,"<=").setParameterLength(2).setName("lessThanEqual"),_a=Gi(da,">=").setParameterLength(2).setName("greaterThanEqual"),va=Gi(da,"&&").setParameterLength(2,1/0).setName("and"),Na=Gi(da,"||").setParameterLength(2,1/0).setName("or"),Sa=Gi(da,"!").setParameterLength(1).setName("not"),Ea=Gi(da,"^^").setParameterLength(2).setName("xor"),wa=Gi(da,"&").setParameterLength(2).setName("bitAnd"),Aa=Gi(da,"~").setParameterLength(2).setName("bitNot"),Ra=Gi(da,"|").setParameterLength(2).setName("bitOr"),Ca=Gi(da,"^").setParameterLength(2).setName("bitXor"),Ma=Gi(da,"<<").setParameterLength(2).setName("shiftLeft"),Pa=Gi(da,">>").setParameterLength(2).setName("shiftRight"),Ba=$i(([e])=>(e.addAssign(1),e)),La=$i(([e])=>(e.subAssign(1),e)),Fa=$i(([e])=>{const t=Qi(e).toConst();return e.addAssign(1),t}),Ia=$i(([e])=>{const t=Qi(e).toConst();return e.subAssign(1),t});ui("add",ca),ui("sub",ha),ui("mul",pa),ui("div",ga),ui("mod",ma),ui("equal",fa),ui("notEqual",ya),ui("lessThan",ba),ui("greaterThan",xa),ui("lessThanEqual",Ta),ui("greaterThanEqual",_a),ui("and",va),ui("or",Na),ui("not",Sa),ui("xor",Ea),ui("bitAnd",wa),ui("bitNot",Aa),ui("bitOr",Ra),ui("bitXor",Ca),ui("shiftLeft",Ma),ui("shiftRight",Pa),ui("incrementBefore",Ba),ui("decrementBefore",La),ui("increment",Fa),ui("decrement",Ia);const Da=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ma(Qi(e),Qi(t)));ui("modInt",Da);class Va extends Ys{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Va.MAX||e===Va.MIN)&&arguments.length>3){let i=new Va(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Va.LENGTH||t===Va.DISTANCE||t===Va.DOT?"float":t===Va.CROSS?"vec3":t===Va.ALL||t===Va.ANY?"bool":t===Va.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===Va.ONE_MINUS)i=ha(1,t);else if(s===Va.RECIPROCAL)i=ga(1,t);else if(s===Va.DIFFERENCE)i=uo(ha(t,r));else if(s===Va.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=ln(nn(n),0):s=ln(nn(s),0);const a=pa(s,n).xyz;i=eo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Va.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const c=[];return r===Va.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Va.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Va.MIN&&r!==Va.MAX?r===Va.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Va.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Va.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Va.DFDX&&r!==Va.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Va.ALL="all",Va.ANY="any",Va.RADIANS="radians",Va.DEGREES="degrees",Va.EXP="exp",Va.EXP2="exp2",Va.LOG="log",Va.LOG2="log2",Va.SQRT="sqrt",Va.INVERSE_SQRT="inversesqrt",Va.FLOOR="floor",Va.CEIL="ceil",Va.NORMALIZE="normalize",Va.FRACT="fract",Va.SIN="sin",Va.COS="cos",Va.TAN="tan",Va.ASIN="asin",Va.ACOS="acos",Va.ATAN="atan",Va.ABS="abs",Va.SIGN="sign",Va.LENGTH="length",Va.NEGATE="negate",Va.ONE_MINUS="oneMinus",Va.DFDX="dFdx",Va.DFDY="dFdy",Va.ROUND="round",Va.RECIPROCAL="reciprocal",Va.TRUNC="trunc",Va.FWIDTH="fwidth",Va.TRANSPOSE="transpose",Va.DETERMINANT="determinant",Va.INVERSE="inverse",Va.BITCAST="bitcast",Va.EQUALS="equals",Va.MIN="min",Va.MAX="max",Va.STEP="step",Va.REFLECT="reflect",Va.DISTANCE="distance",Va.DIFFERENCE="difference",Va.DOT="dot",Va.CROSS="cross",Va.POW="pow",Va.TRANSFORM_DIRECTION="transformDirection",Va.MIX="mix",Va.CLAMP="clamp",Va.REFRACT="refract",Va.SMOOTHSTEP="smoothstep",Va.FACEFORWARD="faceforward";const Ua=Yi(1e-6),Oa=Yi(1e6),ka=Yi(Math.PI),Ga=Yi(2*Math.PI),za=Gi(Va,Va.ALL).setParameterLength(1),Ha=Gi(Va,Va.ANY).setParameterLength(1),$a=Gi(Va,Va.RADIANS).setParameterLength(1),Wa=Gi(Va,Va.DEGREES).setParameterLength(1),qa=Gi(Va,Va.EXP).setParameterLength(1),ja=Gi(Va,Va.EXP2).setParameterLength(1),Xa=Gi(Va,Va.LOG).setParameterLength(1),Ka=Gi(Va,Va.LOG2).setParameterLength(1),Ya=Gi(Va,Va.SQRT).setParameterLength(1),Qa=Gi(Va,Va.INVERSE_SQRT).setParameterLength(1),Za=Gi(Va,Va.FLOOR).setParameterLength(1),Ja=Gi(Va,Va.CEIL).setParameterLength(1),eo=Gi(Va,Va.NORMALIZE).setParameterLength(1),to=Gi(Va,Va.FRACT).setParameterLength(1),ro=Gi(Va,Va.SIN).setParameterLength(1),so=Gi(Va,Va.COS).setParameterLength(1),io=Gi(Va,Va.TAN).setParameterLength(1),no=Gi(Va,Va.ASIN).setParameterLength(1),ao=Gi(Va,Va.ACOS).setParameterLength(1),oo=Gi(Va,Va.ATAN).setParameterLength(1,2),uo=Gi(Va,Va.ABS).setParameterLength(1),lo=Gi(Va,Va.SIGN).setParameterLength(1),co=Gi(Va,Va.LENGTH).setParameterLength(1),ho=Gi(Va,Va.NEGATE).setParameterLength(1),po=Gi(Va,Va.ONE_MINUS).setParameterLength(1),go=Gi(Va,Va.DFDX).setParameterLength(1),mo=Gi(Va,Va.DFDY).setParameterLength(1),fo=Gi(Va,Va.ROUND).setParameterLength(1),yo=Gi(Va,Va.RECIPROCAL).setParameterLength(1),bo=Gi(Va,Va.TRUNC).setParameterLength(1),xo=Gi(Va,Va.FWIDTH).setParameterLength(1),To=Gi(Va,Va.TRANSPOSE).setParameterLength(1),_o=Gi(Va,Va.DETERMINANT).setParameterLength(1),vo=Gi(Va,Va.INVERSE).setParameterLength(1),No=Gi(Va,Va.BITCAST).setParameterLength(2),So=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),fa(e,t)),Eo=Gi(Va,Va.MIN).setParameterLength(2,1/0),wo=Gi(Va,Va.MAX).setParameterLength(2,1/0),Ao=Gi(Va,Va.STEP).setParameterLength(2),Ro=Gi(Va,Va.REFLECT).setParameterLength(2),Co=Gi(Va,Va.DISTANCE).setParameterLength(2),Mo=Gi(Va,Va.DIFFERENCE).setParameterLength(2),Po=Gi(Va,Va.DOT).setParameterLength(2),Bo=Gi(Va,Va.CROSS).setParameterLength(2),Lo=Gi(Va,Va.POW).setParameterLength(2),Fo=Gi(Va,Va.POW,2).setParameterLength(1),Io=Gi(Va,Va.POW,3).setParameterLength(1),Do=Gi(Va,Va.POW,4).setParameterLength(1),Vo=Gi(Va,Va.TRANSFORM_DIRECTION).setParameterLength(2),Uo=e=>pa(lo(e),Lo(uo(e),1/3)),Oo=e=>Po(e,e),ko=Gi(Va,Va.MIX).setParameterLength(3),Go=(e,t=0,r=1)=>Ii(new Va(Va.CLAMP,Ii(e),Ii(t),Ii(r))),zo=e=>Go(e),Ho=Gi(Va,Va.REFRACT).setParameterLength(3),$o=Gi(Va,Va.SMOOTHSTEP).setParameterLength(3),Wo=Gi(Va,Va.FACEFORWARD).setParameterLength(3),qo=$i(([e])=>{const t=Po(e.xy,en(12.9898,78.233)),r=ma(t,ka);return to(ro(r).mul(43758.5453))}),jo=(e,t,r)=>ko(t,r,e),Xo=(e,t,r)=>$o(t,r,e),Ko=(e,t)=>Ao(t,e),Yo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),oo(e,t)),Qo=Wo,Zo=Qa;ui("all",za),ui("any",Ha),ui("equals",So),ui("radians",$a),ui("degrees",Wa),ui("exp",qa),ui("exp2",ja),ui("log",Xa),ui("log2",Ka),ui("sqrt",Ya),ui("inverseSqrt",Qa),ui("floor",Za),ui("ceil",Ja),ui("normalize",eo),ui("fract",to),ui("sin",ro),ui("cos",so),ui("tan",io),ui("asin",no),ui("acos",ao),ui("atan",oo),ui("abs",uo),ui("sign",lo),ui("length",co),ui("lengthSq",Oo),ui("negate",ho),ui("oneMinus",po),ui("dFdx",go),ui("dFdy",mo),ui("round",fo),ui("reciprocal",yo),ui("trunc",bo),ui("fwidth",xo),ui("atan2",Yo),ui("min",Eo),ui("max",wo),ui("step",Ko),ui("reflect",Ro),ui("distance",Co),ui("dot",Po),ui("cross",Bo),ui("pow",Lo),ui("pow2",Fo),ui("pow3",Io),ui("pow4",Do),ui("transformDirection",Vo),ui("mix",jo),ui("clamp",Go),ui("refract",Ho),ui("smoothstep",Xo),ui("faceForward",Wo),ui("difference",Mo),ui("saturate",zo),ui("cbrt",Uo),ui("transpose",To),ui("determinant",_o),ui("inverse",vo),ui("rand",qo);class Jo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?xn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(d,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const eu=Oi(Jo).setParameterLength(2,3);ui("select",eu);class tu extends js{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value}),this.node.build(e),e.setContext(t)}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const ru=Oi(tu).setParameterLength(1,2),su=e=>ru(e,{uniformFlow:!0}),iu=(e,t)=>ru(e,{nodeName:t});function nu(e,t){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),iu(e,t)}ui("context",ru),ui("label",nu),ui("uniformFlow",su),ui("setName",iu);class au extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}build(...e){if(!0===this.intent){if(!0!==e[0].getNodeProperties(this).assign)return this.node.build(...e)}return super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=t.getArrayCount(e);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const ou=Oi(au),uu=(e,t=null)=>ou(e,t).toStack(),lu=(e,t=null)=>ou(e,t,!0).toStack(),du=e=>null===qi()?e:ou(e).setIntent(!0).toStack();ui("toVar",uu),ui("toConst",lu),ui("toVarIntent",du);class cu extends js{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const hu=(e,t,r=null)=>Ii(new cu(Ii(e),t,r));class pu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=hu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Vs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const gu=Oi(pu).setParameterLength(1,2),mu=e=>gu(e);ui("toVarying",gu),ui("toVertexStage",mu),ui("varying",(...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),gu(...e))),ui("vertexStage",(...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),gu(...e)));const fu=$i(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return ko(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),yu=$i(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return ko(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),bu="WorkingColorSpace";class xu extends Ys{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===bu?c.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=ln(fu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=ln(gn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=ln(yu(i.rgb),i.a)),i):i}}const Tu=(e,t)=>Ii(new xu(Ii(e),bu,t)),_u=(e,t)=>Ii(new xu(Ii(e),t,bu));ui("workingToColorSpace",Tu),ui("colorSpaceToWorking",_u);let vu=class extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Nu extends js{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Ii(new vu(this,Ii(e)))}setNodeType(e){const t=ra(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Su(e,t,r));class wu extends Ys{static get type(){return"ToneMappingNode"}constructor(e,t=Ru,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=ln(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Au=(e,t,r)=>Ii(new wu(e,Ii(t),Ii(r))),Ru=Eu("toneMappingExposure","float");ui("toneMapping",(e,t,r)=>Au(t,r,e));class Cu extends ri{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=gu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const Mu=(e,t=null,r=0,s=0)=>Ii(new Cu(e,t,r,s)),Pu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setUsage(y),Bu=(e,t=null,r=0,s=0)=>Mu(e,t,r,s).setInstanced(!0),Lu=(e,t=null,r=0,s=0)=>Pu(e,t,r,s).setInstanced(!0);ui("toAttribute",e=>Mu(e.value));class Fu extends js{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const Iu=(e,t=[64])=>{(0===t.length||t.length>3)&&console.error("THREE.TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;eIu(e,r).setCount(t);ui("compute",Du),ui("computeKernel",Iu);class Vu extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Uu=(e,t)=>Ii(new Vu(Ii(e),t));ui("cache",Uu);class Ou extends js{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ku=Oi(Ou).setParameterLength(2);ui("bypass",ku);class Gu extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=Yi(0),i=Yi(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const zu=Oi(Gu,null,null,{doClamp:!1}).setParameterLength(3,5),Hu=Oi(Gu).setParameterLength(3,5);ui("remap",zu),ui("remapClamp",Hu);class $u extends js{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Wu=Oi($u).setParameterLength(1,2),qu=e=>(e?eu(e,Wu("discard")):Wu("discard")).toStack();ui("discard",qu);class ju extends Ys{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||b;return r!==p&&(t=t.toneMapping(r)),s!==b&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Xu=(e,t=null,r=null)=>Ii(new ju(Ii(e),t,r));ui("renderOutput",Xu);class Ku extends Ys{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Yu=(e,t=null)=>Ii(new Ku(Ii(e),t)).toStack();ui("debug",Yu);class Qu extends js{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return gu(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Zu=(e,t=null)=>Ii(new Qu(e,t)),Ju=(e=0)=>Zu("uv"+(e>0?e:""),"vec2");class el extends js{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const tl=Oi(el).setParameterLength(1,2);class rl extends ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const sl=Oi(rl).setParameterLength(1),il=new x;class nl extends ta{static get type(){return"TextureNode"}constructor(e=il,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Us.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===T?"uvec4":this.value.type===_?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Ju(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=ra(this.value.matrix)),this._matrixUniform.mul(nn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Qi(tl(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${b}`,this),n.snippet=b,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=_u(Wu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Ii(e).mul(sl(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===v||r.magFilter===v)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Ii(t)}level(e){const t=this.clone();return t.levelNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}size(e){return tl(this,e)}bias(e){const t=this.clone();return t.biasNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}compare(e){const t=this.clone();return t.compareNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}grad(e,t){const r=this.clone();return r.gradNode=[Ii(e),Ii(t)],r.referenceNode=this.getSelf(),Ii(r)}depth(e){const t=this.clone();return t.depthNode=Ii(e),t.referenceNode=this.getSelf(),Ii(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const al=Oi(nl).setParameterLength(1,4).setName("texture"),ol=(e=il,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=al(e,t,r,s),i},ul=(...e)=>ol(...e).setSampler(!1);class ll extends ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const dl=(e,t,r)=>Ii(new ll(e,t,r));class cl extends Xs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class hl extends ll{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rIi(new hl(e,t));const gl=Oi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),ml=ra(0,"uint").setName("u_cameraIndex").setGroup(Qn("cameraIndex")).toVarying("v_cameraIndex"),fl=ra("float").setName("cameraNear").setGroup(Jn).onRenderUpdate(({camera:e})=>e.near),yl=ra("float").setName("cameraFar").setGroup(Jn).onRenderUpdate(({camera:e})=>e.far),bl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=pl(r).setGroup(Jn).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraProjectionMatrix")}else t=ra("mat4").setName("cameraProjectionMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),xl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=pl(r).setGroup(Jn).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraProjectionMatrixInverse")}else t=ra("mat4").setName("cameraProjectionMatrixInverse").setGroup(Jn).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),Tl=$i(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=pl(r).setGroup(Jn).setName("cameraViewMatrices").element(e.isMultiViewCamera?gl("gl_ViewID_OVR"):ml).toVar("cameraViewMatrix")}else t=ra("mat4").setName("cameraViewMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),_l=ra("mat4").setName("cameraWorldMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.matrixWorld),vl=ra("mat3").setName("cameraNormalMatrix").setGroup(Jn).onRenderUpdate(({camera:e})=>e.normalMatrix),Nl=ra(new r).setName("cameraPosition").setGroup(Jn).onRenderUpdate(({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)),Sl=new N;class El extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this.uniformNode=new ta(null)}getNodeType(){const e=this.scope;return e===El.WORLD_MATRIX?"mat4":e===El.POSITION||e===El.VIEW_POSITION||e===El.DIRECTION||e===El.SCALE?"vec3":e===El.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===El.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===El.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===El.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===El.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===El.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===El.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),Sl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=Sl.radius}}generate(e){const t=this.scope;return t===El.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===El.POSITION||t===El.VIEW_POSITION||t===El.DIRECTION||t===El.SCALE?this.uniformNode.nodeType="vec3":t===El.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}El.WORLD_MATRIX="worldMatrix",El.POSITION="position",El.SCALE="scale",El.VIEW_POSITION="viewPosition",El.DIRECTION="direction",El.RADIUS="radius";const wl=Oi(El,El.DIRECTION).setParameterLength(1),Al=Oi(El,El.WORLD_MATRIX).setParameterLength(1),Rl=Oi(El,El.POSITION).setParameterLength(1),Cl=Oi(El,El.SCALE).setParameterLength(1),Ml=Oi(El,El.VIEW_POSITION).setParameterLength(1),Pl=Oi(El,El.RADIUS).setParameterLength(1);class Bl extends El{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Ll=ki(Bl,Bl.DIRECTION),Fl=ki(Bl,Bl.WORLD_MATRIX),Il=ki(Bl,Bl.POSITION),Dl=ki(Bl,Bl.SCALE),Vl=ki(Bl,Bl.VIEW_POSITION),Ul=ki(Bl,Bl.RADIUS),Ol=ra(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),kl=ra(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Gl=$i(e=>e.renderer.overrideNodes.modelViewMatrix||zl).once()().toVar("modelViewMatrix"),zl=Tl.mul(Fl),Hl=$i(e=>(e.context.isHighPrecisionModelViewMatrix=!0,ra("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),$l=$i(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return ra("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Wl=Zu("position","vec3"),ql=Wl.toVarying("positionLocal"),jl=Wl.toVarying("positionPrevious"),Xl=$i(e=>Fl.mul(ql).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Kl=$i(()=>ql.transformDirection(Fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Yl=$i(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Ql=Yl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Zl extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===S?"false":e.getFrontFacing()}}const Jl=ki(Zl),ed=Yi(Jl).mul(2).sub(1),td=$i(([e],{material:t})=>{const r=t.side;return r===S?e=e.mul(-1):r===E&&(e=e.mul(ed)),e}),rd=Zu("normal","vec3"),sd=$i(e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),nn(0,1,0)):rd,"vec3").once()().toVar("normalLocal"),id=Yl.dFdx().cross(Yl.dFdy()).normalize().toVar("normalFlat"),nd=$i(e=>{let t;return t=!0===e.material.flatShading?id:cd(sd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),ad=$i(e=>{let t=nd.transformDirection(Tl);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),od=$i(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=nd,!0!==t.flatShading&&(s=td(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),ud=od.transformDirection(Tl).toVar("normalWorld"),ld=$i(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?od:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),dd=$i(([e,t=Fl])=>{const r=gn(t),s=e.div(nn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),cd=$i(([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ol.mul(e);return Tl.transformDirection(s)}),hd=$i(()=>(console.warn('THREE.TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),od)).once(["NORMAL","VERTEX"])(),pd=$i(()=>(console.warn('THREE.TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),ud)).once(["NORMAL","VERTEX"])(),gd=$i(()=>(console.warn('THREE.TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),ld)).once(["NORMAL","VERTEX"])(),md=new w,fd=new a,yd=ra(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),bd=ra(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),xd=ra(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(md.copy(r),fd.makeRotationFromEuler(md)):fd.identity(),fd}),Td=Ql.negate().reflect(od),_d=Ql.negate().refract(od,yd),vd=Td.transformDirection(Tl).toVar("reflectVector"),Nd=_d.transformDirection(Tl).toVar("reflectVector"),Sd=new A;class Ed extends nl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===R?vd:e.mapping===C?Nd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),nn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=nn(t.x.negate(),t.yz)),xd.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const wd=Oi(Ed).setParameterLength(1,4).setName("cubeTexture"),Ad=(e=Sd,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Ii(e.clone()),i.referenceNode=e.getSelf(),null!==t&&(i.uvNode=Ii(t)),null!==r&&(i.levelNode=Ii(r)),null!==s&&(i.biasNode=Ii(s))):i=wd(e,t,r,s),i};class Rd extends Xs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Cd extends js{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Us.OBJECT}element(e){return Ii(new Rd(this,Ii(e)))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?dl(null,e,this.count):Array.isArray(this.getValueFromReference())?pl(null,e):"texture"===e?ol(null):"cubeTexture"===e?Ad(null):ra(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;eIi(new Cd(e,t,r)),Pd=(e,t,r,s)=>Ii(new Cd(e,t,s,r));class Bd extends Cd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const Ld=(e,t,r=null)=>Ii(new Bd(e,t,r)),Fd=Ju(),Id=Yl.dFdx(),Dd=Yl.dFdy(),Vd=Fd.dFdx(),Ud=Fd.dFdy(),Od=od,kd=Dd.cross(Od),Gd=Od.cross(Id),zd=kd.mul(Vd.x).add(Gd.mul(Ud.x)),Hd=kd.mul(Vd.y).add(Gd.mul(Ud.y)),$d=zd.dot(zd).max(Hd.dot(Hd)),Wd=$d.equal(0).select(0,$d.inverseSqrt()),qd=zd.mul(Wd).toVar("tangentViewFrame"),jd=Hd.mul(Wd).toVar("bitangentViewFrame"),Xd=$i(e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Zu("tangent","vec4")))(),Kd=Xd.xyz.toVar("tangentLocal"),Yd=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Gl.mul(ln(Kd,0)).xyz.toVarying("v_tangentView").normalize():qd,!0!==r.flatShading&&(s=td(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Qd=Yd.transformDirection(Tl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Zd=$i(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Xd.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Jd=Zd(rd.cross(Xd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),ec=Zd(sd.cross(Kd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),tc=$i(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Zd(od.cross(Yd),"v_bitangentView").normalize():jd,!0!==r.flatShading&&(s=td(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),rc=Zd(ud.cross(Qd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),sc=gn(Yd,tc,od).toVar("TBNViewMatrix"),ic=Ql.mul(sc),nc=$i(()=>{let e=In.cross(Ql);return e=e.cross(In).normalize(),e=ko(e,od,Ln.mul(Nn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()();class ac extends Ys{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=M}setup({material:e}){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);if(null!==r){let t=r;!0===e.flatShading&&(t=td(t)),s=nn(s.xy.mul(t),s.z)}let i=null;return t===P?i=cd(s):t===M?i=sc.mul(s).normalize():(console.error(`THREE.NodeMaterial: Unsupported normal map type: ${t}`),i=od),i}}const oc=Oi(ac).setParameterLength(1,2),uc=$i(({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Ju()),forceUVContext:!0}),s=Yi(r(e=>e));return en(Yi(r(e=>e.add(e.dFdx()))).sub(s),Yi(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),lc=$i(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(ed),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class dc extends Ys{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=uc({textureNode:this.textureNode,bumpScale:e});return lc({surf_pos:Yl,surf_norm:od,dHdxy:t})}}const cc=Oi(dc).setParameterLength(1,2),hc=new Map;class pc extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=hc.get(e);return void 0===r&&(r=Ld(e,t),hc.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===pc.COLOR){const e=void 0!==t.color?this.getColor(r):nn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===pc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===pc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Yi(1);else if(r===pc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===pc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===pc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===pc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===pc.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===pc.NORMAL)t.normalMap?(s=oc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?cc(this.getTexture("bump").r,this.getFloat("bumpScale")):od;else if(r===pc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===pc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===pc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?oc(this.getTexture(r),this.getCache(r+"Scale","vec2")):od;else if(r===pc.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===pc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===pc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=pn(Qc.x,Qc.y,Qc.y.negate(),Qc.x).mul(e.rg.mul(2).sub(en(1)).normalize().mul(e.b))}else s=Qc;else if(r===pc.IRIDESCENCE_THICKNESS){const e=Md("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Md("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===pc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===pc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===pc.IOR)s=this.getFloat(r);else if(r===pc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===pc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===pc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):Yi(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}pc.ALPHA_TEST="alphaTest",pc.COLOR="color",pc.OPACITY="opacity",pc.SHININESS="shininess",pc.SPECULAR="specular",pc.SPECULAR_STRENGTH="specularStrength",pc.SPECULAR_INTENSITY="specularIntensity",pc.SPECULAR_COLOR="specularColor",pc.REFLECTIVITY="reflectivity",pc.ROUGHNESS="roughness",pc.METALNESS="metalness",pc.NORMAL="normal",pc.CLEARCOAT="clearcoat",pc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",pc.CLEARCOAT_NORMAL="clearcoatNormal",pc.EMISSIVE="emissive",pc.ROTATION="rotation",pc.SHEEN="sheen",pc.SHEEN_ROUGHNESS="sheenRoughness",pc.ANISOTROPY="anisotropy",pc.IRIDESCENCE="iridescence",pc.IRIDESCENCE_IOR="iridescenceIOR",pc.IRIDESCENCE_THICKNESS="iridescenceThickness",pc.IOR="ior",pc.TRANSMISSION="transmission",pc.THICKNESS="thickness",pc.ATTENUATION_DISTANCE="attenuationDistance",pc.ATTENUATION_COLOR="attenuationColor",pc.LINE_SCALE="scale",pc.LINE_DASH_SIZE="dashSize",pc.LINE_GAP_SIZE="gapSize",pc.LINE_WIDTH="linewidth",pc.LINE_DASH_OFFSET="dashOffset",pc.POINT_SIZE="size",pc.DISPERSION="dispersion",pc.LIGHT_MAP="light",pc.AO="ao";const gc=ki(pc,pc.ALPHA_TEST),mc=ki(pc,pc.COLOR),fc=ki(pc,pc.SHININESS),yc=ki(pc,pc.EMISSIVE),bc=ki(pc,pc.OPACITY),xc=ki(pc,pc.SPECULAR),Tc=ki(pc,pc.SPECULAR_INTENSITY),_c=ki(pc,pc.SPECULAR_COLOR),vc=ki(pc,pc.SPECULAR_STRENGTH),Nc=ki(pc,pc.REFLECTIVITY),Sc=ki(pc,pc.ROUGHNESS),Ec=ki(pc,pc.METALNESS),wc=ki(pc,pc.NORMAL),Ac=ki(pc,pc.CLEARCOAT),Rc=ki(pc,pc.CLEARCOAT_ROUGHNESS),Cc=ki(pc,pc.CLEARCOAT_NORMAL),Mc=ki(pc,pc.ROTATION),Pc=ki(pc,pc.SHEEN),Bc=ki(pc,pc.SHEEN_ROUGHNESS),Lc=ki(pc,pc.ANISOTROPY),Fc=ki(pc,pc.IRIDESCENCE),Ic=ki(pc,pc.IRIDESCENCE_IOR),Dc=ki(pc,pc.IRIDESCENCE_THICKNESS),Vc=ki(pc,pc.TRANSMISSION),Uc=ki(pc,pc.THICKNESS),Oc=ki(pc,pc.IOR),kc=ki(pc,pc.ATTENUATION_DISTANCE),Gc=ki(pc,pc.ATTENUATION_COLOR),zc=ki(pc,pc.LINE_SCALE),Hc=ki(pc,pc.LINE_DASH_SIZE),$c=ki(pc,pc.LINE_GAP_SIZE),Wc=ki(pc,pc.LINE_WIDTH),qc=ki(pc,pc.LINE_DASH_OFFSET),jc=ki(pc,pc.POINT_SIZE),Xc=ki(pc,pc.DISPERSION),Kc=ki(pc,pc.LIGHT_MAP),Yc=ki(pc,pc.AO),Qc=ra(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),Zc=$i(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Jc extends js{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Jc.VERTEX)s=e.getVertexIndex();else if(r===Jc.INSTANCE)s=e.getInstanceIndex();else if(r===Jc.DRAW)s=e.getDrawIndex();else if(r===Jc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Jc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Jc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=gu(this).build(e,t)}return i}}Jc.VERTEX="vertex",Jc.INSTANCE="instance",Jc.SUBGROUP="subgroup",Jc.INVOCATION_LOCAL="invocationLocal",Jc.INVOCATION_SUBGROUP="invocationSubgroup",Jc.DRAW="draw";const eh=ki(Jc,Jc.VERTEX),th=ki(Jc,Jc.INSTANCE),rh=ki(Jc,Jc.SUBGROUP),sh=ki(Jc,Jc.INVOCATION_SUBGROUP),ih=ki(Jc,Jc.INVOCATION_LOCAL),nh=ki(Jc,Jc.DRAW);class ah extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=dl(r.array,"mat4",Math.max(t,1)).element(th);else{const e=new B(r.array,16,1);this.buffer=e;const t=r.usage===y?Lu:Bu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=mn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new L(s.array,3),t=s.usage===y?Lu:Bu;this.bufferColor=e,n=nn(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(ql).xyz;if(ql.assign(a),e.hasGeometryAttribute("normal")){const e=dd(sd,i);sd.assign(e)}null!==this.instanceColorNode&&Tn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const oh=Oi(ah).setParameterLength(2,3);class uh extends ah{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const lh=Oi(uh).setParameterLength(1);class dh extends js{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=th:this.batchingIdNode=nh);const t=$i(([e])=>{const t=Qi(tl(ul(this.batchMesh._indirectTexture),0).x),r=Qi(e).mod(t),s=Qi(e).div(t);return ul(this.batchMesh._indirectTexture,tn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Qi(tl(ul(s),0).x),n=Yi(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=mn(ul(s,tn(a,o)),ul(s,tn(a.add(1),o)),ul(s,tn(a.add(2),o)),ul(s,tn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=$i(([e])=>{const t=Qi(tl(ul(l),0).x),r=e,s=r.mod(t),i=r.div(t);return ul(l,tn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Tn("vec3","vBatchColor").assign(t)}const d=gn(u);ql.assign(u.mul(ql));const c=sd.div(nn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sd.assign(h),e.hasGeometryAttribute("tangent")&&Kd.mulAssign(d)}}const ch=Oi(dh).setParameterLength(1);class hh extends Xs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const ph=Oi(hh).setParameterLength(2);class gh extends ll{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=ws(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return ph(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Mu(this.value),this._varying=gu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const mh=(e,t=null,r=0)=>Ii(new gh(e,t,r)),fh=new WeakMap;class yh extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Zu("skinIndex","uvec4"),this.skinWeightNode=Zu("skinWeight","vec4"),this.bindMatrixNode=Md("bindMatrix","mat4"),this.bindMatrixInverseNode=Md("bindMatrixInverse","mat4"),this.boneMatricesNode=Pd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=ql,this.toPositionNode=ql,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=ca(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sd){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=ca(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Pd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,jl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ls(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&jl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sd.assign(t),e.hasGeometryAttribute("tangent")&&Kd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;fh.get(t)!==e.frameId&&(fh.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const bh=e=>Ii(new yh(e));class xh extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tIi(new xh(Ui(e,"int"))).toStack(),_h=()=>Wu("break").toStack(),vh=new WeakMap,Nh=new s,Sh=$i(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Qi(eh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return ul(e,tn(u,o)).depth(i).xyz.mul(t)});class Eh extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=ra(1),this.updateType=Us.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=vh.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new F(m,h,p,a);f.type=I,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Yi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(ul(this.mesh.morphTexture,tn(Qi(e).add(1),Qi(th))).r):t.assign(Md("morphTargetInfluences","float").element(e).toVar()),ji(t.notEqual(0),()=>{!0===s&&ql.addAssign(Sh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(0)})),!0===i&&sd.addAssign(Sh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Qi(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const wh=Oi(Eh).setParameterLength(1);class Ah extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Rh extends Ah{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Ch extends tu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:nn().toVar("directDiffuse"),directSpecular:nn().toVar("directSpecular"),indirectDiffuse:nn().toVar("indirectDiffuse"),indirectSpecular:nn().toVar("indirectSpecular")};return{radiance:nn().toVar("radiance"),irradiance:nn().toVar("irradiance"),iblIrradiance:nn().toVar("iblIrradiance"),ambientOcclusion:Yi(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Mh=Oi(Ch);class Ph extends Ah{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Bh,Lh;class Fh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===Fh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==Fh.SIZE&&this.scope!==Fh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Fh.VIEWPORT?null!==t?Lh.copy(t.viewport):(e.getViewport(Lh),Lh.multiplyScalar(e.getPixelRatio())):null!==t?(Bh.width=t.width,Bh.height=t.height):e.getDrawingBufferSize(Bh)}setup(){const e=this.scope;let r=null;return r=e===Fh.SIZE?ra(Bh||(Bh=new t)):e===Fh.VIEWPORT?ra(Lh||(Lh=new s)):en(Vh.div(Dh)),r}generate(e){if(this.scope===Fh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Dh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Fh.COORDINATE="coordinate",Fh.VIEWPORT="viewport",Fh.SIZE="size",Fh.UV="uv";const Ih=ki(Fh,Fh.UV),Dh=ki(Fh,Fh.SIZE),Vh=ki(Fh,Fh.COORDINATE),Uh=ki(Fh,Fh.VIEWPORT),Oh=Uh.zw,kh=Vh.sub(Uh.xy),Gh=kh.div(Oh),zh=$i(()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Dh),"vec2").once()(),Hh=new t;class $h extends nl{static get type(){return"ViewportTextureNode"}constructor(e=Ih,t=null,r=null){let s=null;null===r?(s=new D,s.minFilter=V,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Us.RENDER,this._textures=new WeakMap}getFrameBufferTexture(e=null){const t=this.referenceNode?this.referenceNode.defaultFramebuffer:this.defaultFramebuffer;if(null===e)return t;if(!1===this._textures.has(e)){const r=t.clone();this._textures.set(e,r)}return this._textures.get(e)}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Hh):Hh.set(r.width,r.height);const s=this.getFrameBufferTexture(r);s.image.width===Hh.width&&s.image.height===Hh.height||(s.image.width=Hh.width,s.image.height=Hh.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i,this.value=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Wh=Oi($h).setParameterLength(0,3),qh=Oi($h,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let jh=null;class Xh extends $h{static get type(){return"ViewportDepthTextureNode"}constructor(e=Ih,t=null){null===jh&&(jh=new U),super(e,t,jh)}}const Kh=Oi(Xh).setParameterLength(0,2);class Yh extends js{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Yh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Yh.DEPTH_BASE)null!==r&&(s=tp().assign(r));else if(t===Yh.DEPTH)s=e.isPerspectiveCamera?Zh(Yl.z,fl,yl):Qh(Yl.z,fl,yl);else if(t===Yh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Jh(r,fl,yl);s=Qh(e,fl,yl)}else s=r;else s=Qh(Yl.z,fl,yl);return s}}Yh.DEPTH_BASE="depthBase",Yh.DEPTH="depth",Yh.LINEAR_DEPTH="linearDepth";const Qh=(e,t,r)=>e.add(t).div(t.sub(r)),Zh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Jh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),ep=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ka(e.negate().div(t)),i=Ka(r.div(t));return s.div(i)},tp=Oi(Yh,Yh.DEPTH_BASE),rp=ki(Yh,Yh.DEPTH),sp=Oi(Yh,Yh.LINEAR_DEPTH).setParameterLength(0,1),ip=sp(Kh());rp.assign=e=>tp(e);class np extends js{static get type(){return"ClippingNode"}constructor(e=np.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===np.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===np.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return $i(()=>{const r=Yi().toVar("distanceToPlane"),s=Yi().toVar("distanceToGradient"),i=Yi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=pl(t);Th(n,({i:t})=>{const n=e.element(t);r.assign(Yl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign($o(s.negate(),s,r))})}const a=e.length;if(a>0){const t=pl(e),n=Yi(1).toVar("intersectionClipOpacity");Th(a,({i:e})=>{const i=t.element(e);r.assign(Yl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign($o(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}_n.a.mulAssign(i),_n.a.equal(0).discard()})()}setupDefault(e,t){return $i(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=pl(t);Th(r,({i:t})=>{const r=e.element(t);Yl.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=pl(e),r=Ji(!0).toVar("clipped");Th(s,({i:e})=>{const s=t.element(e);r.assign(Yl.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),$i(()=>{const s=pl(e),i=gl(t.getClipDistance());Th(r,({i:e})=>{const t=s.element(e),r=Yl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}np.ALPHA_TO_COVERAGE="alphaToCoverage",np.DEFAULT="default",np.HARDWARE="hardware";const ap=$i(([e])=>to(pa(1e4,ro(pa(17,e.x).add(pa(.1,e.y)))).mul(ca(.1,uo(ro(pa(13,e.y).add(e.x))))))),op=$i(([e])=>ap(en(ap(e.xy),e.z))),up=$i(([e])=>{const t=wo(co(go(e.xyz)),co(mo(e.xyz))),r=Yi(1).div(Yi(.05).mul(t)).toVar("pixScale"),s=en(ja(Za(Ka(r))),ja(Ja(Ka(r)))),i=en(op(Za(s.x.mul(e.xyz))),op(Za(s.y.mul(e.xyz)))),n=to(Ka(r)),a=ca(pa(n.oneMinus(),i.x),pa(n,i.y)),o=Eo(n,n.oneMinus()),u=nn(a.mul(a).div(pa(2,o).mul(ha(1,o))),a.sub(pa(.5,o)).div(ha(1,o)),ha(1,ha(1,a).mul(ha(1,a)).div(pa(2,o).mul(ha(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Go(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class lp extends Qu{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const dp=(e=0)=>Ii(new lp(e)),cp=$i(([e,t])=>Eo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),hp=$i(([e,t])=>Eo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),pp=$i(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),gp=$i(([e,t])=>ko(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Ao(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),mp=$i(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return ln(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),fp=$i(([e])=>ln(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),yp=$i(([e])=>(ji(e.a.equal(0),()=>ln(0)),ln(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class bp extends O{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>hu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=hu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.add(a);const i=ln(s,_n.a).max(0);n=this.setupOutput(e,i),On.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&On.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=ln(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Ii(new np(np.ALPHA_TO_COVERAGE)):e.stack.add(Ii(new np))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Ii(new np(np.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?ep(Yl.z,fl,yl):Qh(Yl.z,fl,yl))}null!==s&&rp.assign(s).toStack()}setupPositionView(){return Gl.mul(ql).xyz}setupModelViewProjection(){return bl.mul(Yl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Zc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&wh(t).toStack(),!0===t.isSkinnedMesh&&bh(t).toStack(),this.displacementMap){const e=Ld("displacementMap","texture"),t=Ld("displacementScale","float"),r=Ld("displacementBias","float");ql.addAssign(sd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ch(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&lh(t).toStack(),null!==this.positionNode&&ql.assign(hu(this.positionNode,"POSITION","vec3")),ql}setupDiffuseColor({object:e,geometry:t}){null!==this.maskNode&&Ji(this.maskNode).not().discard();let r=this.colorNode?ln(this.colorNode):mc;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(dp())),e.instanceColor){r=Tn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Tn("vec3","vBatchColor").mul(r)}_n.assign(r);const s=this.opacityNode?Yi(this.opacityNode):bc;_n.a.assign(_n.a.mul(s));let i=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(i=null!==this.alphaTestNode?Yi(this.alphaTestNode):gc,_n.a.lessThanEqual(i).discard()),!0===this.alphaHash&&_n.a.lessThan(up(ql)).discard();!1===this.transparent&&this.blending===k&&!1===this.alphaToCoverage?_n.a.assign(1):null===i&&_n.a.lessThanEqual(0).discard()}setupVariants(){}setupOutgoingLight(){return!0===this.lights?nn(0):_n.rgb}setupNormal(){return this.normalNode?nn(this.normalNode):wc}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?Ld("envMap","cubeTexture"):Ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Ph(Kc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Yc;t.push(new Rh(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Mh(n,t,r,s)}else null!==r&&(a=nn(null!==s?ko(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(vn.assign(nn(i||yc)),a=a.add(vn)),a}setupFog(e,t){const r=e.fogNode;return r&&(On.assign(t),t=ln(r.toVar())),t}setupPremultipliedAlpha(e,t){return fp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=O.prototype.toJSON.call(this,e),s=Ns(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const xp=new G;class Tp extends bp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(xp),this.setValues(e)}}const _p=new z;class vp extends bp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(_p),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Yi(this.offsetNode):qc,t=this.dashScaleNode?Yi(this.dashScaleNode):zc,r=this.dashSizeNode?Yi(this.dashSizeNode):Hc,s=this.gapSizeNode?Yi(this.gapSizeNode):$c;kn.assign(r),Gn.assign(s);const i=gu(Zu("lineDistance").mul(t));(e?i.add(e):i).mod(kn.add(Gn)).greaterThan(kn).discard()}}let Np=null;class Sp extends $h{static get type(){return"ViewportSharedTextureNode"}constructor(e=Ih,t=null){null===Np&&(Np=new D),super(e,t,Np)}updateReference(){return this}}const Ep=Oi(Sp).setParameterLength(0,2),wp=new z;class Ap extends bp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(wp),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=H,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=$i(({start:e,end:t})=>{const r=bl.element(2).element(2),s=bl.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return ln(ko(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=$i(()=>{const e=Zu("instanceStart"),t=Zu("instanceEnd"),r=ln(Gl.mul(ln(e,1))).toVar("start"),s=ln(Gl.mul(ln(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Yi(this.dashScaleNode):zc,t=this.offsetNode?Yi(this.offsetNode):qc,r=Zu("instanceDistanceStart"),s=Zu("instanceDistanceEnd");let i=Wl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Tn("float","lineDistance").assign(i)}n&&(Tn("vec3","worldStart").assign(r.xyz),Tn("vec3","worldEnd").assign(s.xyz));const o=Uh.z.div(Uh.w),u=bl.element(2).element(3).equal(-1);ji(u,()=>{ji(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=bl.mul(r),d=bl.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=ln().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=ko(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Tn("vec4","worldPos");o.assign(Wl.y.lessThan(.5).select(r,s));const u=Wc.mul(.5);o.addAssign(ln(Wl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(ln(Wl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(ln(a.mul(u),0)),ji(Wl.y.greaterThan(1).or(Wl.y.lessThan(0)),()=>{o.subAssign(ln(a.mul(2).mul(u),0))})),g.assign(bl.mul(o));const l=nn().toVar();l.assign(Wl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=en(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Wl.x.lessThan(0).select(e.negate(),e)),ji(Wl.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Wl.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Wc)),e.assign(e.div(Uh.w)),g.assign(Wl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(ln(e,0,0)))}return g})();const o=$i(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return en(h,p)});if(this.colorNode=$i(()=>{const e=Ju();if(i){const t=this.dashSizeNode?Yi(this.dashSizeNode):Hc,r=this.gapSizeNode?Yi(this.gapSizeNode):$c;kn.assign(t),Gn.assign(r);const s=Tn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(kn.add(Gn)).greaterThan(kn).discard()}const a=Yi(1).toVar("alpha");if(n){const e=Tn("vec3","worldStart"),s=Tn("vec3","worldEnd"),n=Tn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:nn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Wc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign($o(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=Yi(s.fwidth()).toVar("dlen");ji(e.y.abs().greaterThan(1),()=>{a.assign($o(i.oneMinus(),i.add(1),s).oneMinus())})}else ji(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Zu("instanceColorStart"),t=Zu("instanceColorEnd");u=Wl.y.lessThan(.5).select(e,t).mul(mc)}else u=mc;return ln(u,a)})(),this.transparent){const e=this.opacityNode?Yi(this.opacityNode):bc;this.outputNode=ln(this.colorNode.rgb.mul(e).add(Ep().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Rp=e=>Ii(e).mul(.5).add(.5),Cp=new $;class Mp extends bp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Cp),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Yi(this.opacityNode):bc;_n.assign(_u(ln(Rp(od),e),W))}}const Pp=$i(([e=Kl])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return en(t,r)});class Bp extends q{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new j(5,5,5),n=Pp(Kl),a=new bp;a.colorNode=ol(t,n,0),a.side=S,a.blending=H;const o=new X(i,a),u=new K;u.add(o),t.minFilter===V&&(t.minFilter=Y);const l=new Q(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Lp=new WeakMap;class Fp extends Ys{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=Ad(null);const t=new A;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Z||r===J){if(Lp.has(e)){const t=Lp.get(e);Dp(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Bp(r.height);s.fromEquirectangularTexture(t,e),Dp(s.texture,e.mapping),this._cubeTexture=s.texture,Lp.set(e,s.texture),e.addEventListener("dispose",Ip)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Ip(e){const t=e.target;t.removeEventListener("dispose",Ip);const r=Lp.get(t);void 0!==r&&(Lp.delete(t),r.dispose())}function Dp(e,t){t===Z?e.mapping=R:t===J&&(e.mapping=C)}const Vp=Oi(Fp).setParameterLength(1);class Up extends Ah{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Vp(this.envNode)}}class Op extends Ah{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Yi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class kp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class Gp extends kp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(ln(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(ln(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(_n.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case re:s.rgb.assign(ko(s.rgb,s.rgb.mul(i.rgb),vc.mul(Nc)));break;case te:s.rgb.assign(ko(s.rgb,i.rgb,vc.mul(Nc)));break;case ee:s.rgb.addAssign(i.rgb.mul(vc.mul(Nc)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const zp=new se;class Hp extends bp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(zp),this.setValues(e)}setupNormal(){return td(nd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Op(Kc)),t}setupOutgoingLight(){return _n.rgb}setupLightingModel(){return new Gp}}const $p=$i(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Wp=$i(e=>e.diffuseColor.mul(1/Math.PI)),qp=$i(({dotNH:e})=>Un.mul(Yi(.5)).add(1).mul(Yi(1/Math.PI)).mul(e.pow(Un))),jp=$i(({lightDirection:e})=>{const t=e.add(Ql).normalize(),r=od.dot(t).clamp(),s=Ql.dot(t).clamp(),i=$p({f0:Dn,f90:1,dotVH:s}),n=Yi(.25),a=qp({dotNH:r});return i.mul(n).mul(a)});class Xp extends Gp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=od.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Wp({diffuseColor:_n.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(jp({lightDirection:e})).mul(vc))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Wp({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Kp=new ie;class Yp extends bp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Kp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightingModel(){return new Xp(!1)}}const Qp=new ne;class Zp extends bp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Qp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new Up(t):null}setupLightingModel(){return new Xp}setupVariants(){const e=(this.shininessNode?Yi(this.shininessNode):fc).max(1e-4);Un.assign(e);const t=this.specularNode||xc;Dn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Jp=$i(e=>{if(!1===e.geometry.hasAttribute("normal"))return Yi(0);const t=nd.dFdx().abs().max(nd.dFdy().abs());return t.x.max(t.y).max(t.z)}),eg=$i(e=>{const{roughness:t}=e,r=Jp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),tg=$i(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return ga(.5,i.add(n).max(Ua))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),rg=$i(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(nn(e.mul(r),t.mul(s),a).length()),l=a.mul(nn(e.mul(i),t.mul(n),o).length());return ga(.5,u.add(l)).saturate()}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),sg=$i(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),ig=Yi(1/Math.PI),ng=$i(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=nn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return ig.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),ag=$i(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=od,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Ql).normalize(),d=n.dot(e).clamp(),c=n.dot(Ql).clamp(),h=n.dot(l).clamp(),p=Ql.dot(l).clamp();let g,m,f=$p({f0:t,f90:r,dotVH:p});if(Bi(a)&&(f=Cn.mix(f,i)),Bi(o)){const t=Fn.dot(e),r=Fn.dot(Ql),s=Fn.dot(l),i=In.dot(e),n=In.dot(Ql),a=In.dot(l);g=rg({alphaT:Bn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=ng({alphaT:Bn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=tg({alpha:u,dotNL:d,dotNV:c}),m=sg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),og=$i(({roughness:e,dotNV:t})=>{const r=ln(-1,-.0275,-.572,.022),s=ln(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return en(-1.04,1.04).mul(n).add(i.zw)}).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),ug=$i(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),lg=$i(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(nn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),dg=$i(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Yi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Yi(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),cg=$i(({dotNV:e,dotNL:t})=>Yi(1).div(Yi(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),hg=$i(({lightDirection:e})=>{const t=e.add(Ql).normalize(),r=od.dot(e).clamp(),s=od.dot(Ql).clamp(),i=od.dot(t).clamp(),n=dg({roughness:Rn,dotNH:i}),a=cg({dotNV:s,dotNL:r});return An.mul(n).mul(a)}),pg=$i(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=en(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),gg=$i(({f:e})=>{const t=e.length();return wo(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),mg=$i(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,wo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),fg=$i(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=nn().toVar();return ji(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(gn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=nn(0).toVar();f.addAssign(mg({v1:h,v2:p})),f.addAssign(mg({v1:p,v2:g})),f.addAssign(mg({v1:g,v2:m})),f.addAssign(mg({v1:m,v2:h})),c.assign(nn(gg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),yg=$i(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=nn().toVar();return ji(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=nn(0).toVar();d.addAssign(mg({v1:n,v2:a})),d.addAssign(mg({v1:a,v2:o})),d.addAssign(mg({v1:o,v2:l})),d.addAssign(mg({v1:l,v2:n})),u.assign(nn(gg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),bg=1/6,xg=e=>pa(bg,pa(e,pa(e,e.negate().add(3)).sub(3)).add(1)),Tg=e=>pa(bg,pa(e,pa(e,pa(3,e).sub(6))).add(4)),_g=e=>pa(bg,pa(e,pa(e,pa(-3,e).add(3)).add(3)).add(1)),vg=e=>pa(bg,Lo(e,3)),Ng=e=>xg(e).add(Tg(e)),Sg=e=>_g(e).add(vg(e)),Eg=e=>ca(-1,Tg(e).div(xg(e).add(Tg(e)))),wg=e=>ca(1,vg(e).div(_g(e).add(vg(e)))),Ag=(e,t,r)=>{const s=e.uvNode,i=pa(s,t.zw).add(.5),n=Za(i),a=to(i),o=Ng(a.x),u=Sg(a.x),l=Eg(a.x),d=wg(a.x),c=Eg(a.y),h=wg(a.y),p=en(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=en(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=en(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=en(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Ng(a.y).mul(ca(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=Sg(a.y).mul(ca(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},Rg=$i(([e,t])=>{const r=en(e.size(Qi(t))),s=en(e.size(Qi(t.add(1)))),i=ga(1,r),n=ga(1,s),a=Ag(e,ln(i,r),Za(t)),o=Ag(e,ln(n,s),Ja(t));return to(t).mix(a,o)}),Cg=$i(([e,t])=>{const r=t.mul(sl(e));return Rg(e,r)}),Mg=$i(([e,t,r,s,i])=>{const n=nn(Ho(t.negate(),eo(e),ga(1,s))),a=nn(co(i[0].xyz),co(i[1].xyz),co(i[2].xyz));return eo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),Pg=$i(([e,t])=>e.mul(Go(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),Bg=qh(),Lg=qh(),Fg=$i(([e,t,r],{material:s})=>{const i=(s.side===S?Bg:Lg).sample(e),n=Ka(Dh.x).mul(Pg(t,r));return Rg(i,n)}),Ig=$i(([e,t,r])=>(ji(r.notEqual(0),()=>{const s=Xa(t).negate().div(r);return qa(s.negate().mul(e))}),nn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Dg=$i(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=ln().toVar(),f=nn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=nn(d.sub(i),d,d.add(i));Th({start:0,end:3},({i:i})=>{const d=n.element(i),g=Mg(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(ln(y,1))),x=en(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(en(x.x,x.y.oneMinus()));const T=Fg(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Ig(co(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=Mg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(ln(n,1))),y=en(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(en(y.x,y.y.oneMinus())),m=Fg(y,r,d),f=s.mul(Ig(co(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=nn(ug({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return ln(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),Vg=gn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Ug=(e,t)=>e.sub(t).div(e.add(t)).pow2(),Og=$i(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=ko(e,t,$o(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ji(a.lessThan(0),()=>nn(1));const o=a.sqrt(),u=Ug(n,e),l=$p({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Yi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return nn(1).add(t).div(nn(1).sub(t))})(i.clamp(0,.9999)),g=Ug(p,n.toVec3()),m=$p({f0:g,f90:1,dotVH:o}),f=nn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=nn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(nn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Th({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=nn(54856e-17,44201e-17,52481e-17),i=nn(1681e3,1795300,2208400),n=nn(43278e5,93046e5,66121e5),a=Yi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=nn(o.x.add(a),o.y,o.z).div(1.0685e-7),Vg.mul(o)})(Yi(e).mul(y),Yi(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(nn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),kg=$i(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=eu(r.lessThan(.25),Yi(-339.2).mul(i).add(Yi(161.4).mul(r)).sub(25.9),Yi(-8.48).mul(i).add(Yi(14.3).mul(r)).sub(9.95)),a=eu(r.lessThan(.25),Yi(44).mul(i).sub(Yi(23.7).mul(r)).add(3.26),Yi(1.97).mul(i).sub(Yi(3.27).mul(r)).add(.72));return eu(r.lessThan(.25),0,Yi(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()}),Gg=nn(.04),zg=Yi(1);class Hg extends kp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=nn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=nn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=nn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=nn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=nn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=od.dot(Ql).clamp();this.iridescenceFresnel=Og({outsideIOR:Yi(1),eta2:Mn,cosTheta1:e,thinFilmThickness:Pn,baseF0:Dn}),this.iridescenceF0=lg({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xl,r=Nl.sub(Xl).normalize(),s=ud,i=e.context;i.backdrop=Dg(s,r,Nn,_n,Dn,Vn,t,Fl,Tl,bl,Hn,Wn,jn,qn,this.dispersion?Xn:null),i.backdropAlpha=$n,_n.a.mulAssign(ko(1,i.backdrop.a,$n))}super.start(e)}computeMultiscattering(e,t,r){const s=od.dot(Ql).clamp(),i=og({roughness:Nn,dotNV:s}),n=(this.iridescenceF0?Cn.mix(Dn,this.iridescenceF0):Dn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Dn.add(Dn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=od.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(hg({lightDirection:e}))),!0===this.clearcoat){const r=ld.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(ag({lightDirection:e,f0:Gg,f90:zg,roughness:wn,normalView:ld})))}r.directDiffuse.addAssign(s.mul(Wp({diffuseColor:_n.rgb}))),r.directSpecular.addAssign(s.mul(ag({lightDirection:e,f0:Dn,f90:1,roughness:Nn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=od,h=Ql,p=Yl.toVar(),g=pg({N:c,V:h,roughness:Nn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=gn(nn(m.x,0,m.y),nn(0,1,0),nn(m.z,0,m.w)).toVar(),b=Dn.mul(f.x).add(Dn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(fg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(_n).mul(fg({N:c,V:h,P:p,mInv:gn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(Wp({diffuseColor:_n})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(An,kg({normal:od,viewDir:Ql,roughness:Rn}))),!0===this.clearcoat){const e=ld.dot(Ql).clamp(),t=ug({dotNV:e,specularColor:Gg,specularF90:zg,roughness:wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=nn().toVar("singleScattering"),n=nn().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Vn);const o=i.add(n),u=_n.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=od.dot(Ql).clamp().add(t),i=Nn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ld.dot(Ql).clamp(),r=$p({dotVH:e,f0:Gg,f90:zg}),s=t.mul(En.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(En));t.assign(s)}if(!0===this.sheen){const e=An.r.max(An.g).max(An.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const $g=Yi(1),Wg=Yi(-2),qg=Yi(.8),jg=Yi(-1),Xg=Yi(.4),Kg=Yi(2),Yg=Yi(.305),Qg=Yi(3),Zg=Yi(.21),Jg=Yi(4),em=Yi(4),tm=Yi(16),rm=$i(([e])=>{const t=nn(uo(e)).toVar(),r=Yi(-1).toVar();return ji(t.x.greaterThan(t.z),()=>{ji(t.x.greaterThan(t.y),()=>{r.assign(eu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}).Else(()=>{ji(t.z.greaterThan(t.y),()=>{r.assign(eu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(eu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),sm=$i(([e,t])=>{const r=en().toVar();return ji(t.equal(0),()=>{r.assign(en(e.z,e.y).div(uo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(en(e.x.negate(),e.z.negate()).div(uo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(en(e.x.negate(),e.y).div(uo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(en(e.z.negate(),e.y).div(uo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(en(e.x.negate(),e.z).div(uo(e.y)))}).Else(()=>{r.assign(en(e.x,e.y).div(uo(e.z)))}),pa(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),im=$i(([e])=>{const t=Yi(0).toVar();return ji(e.greaterThanEqual(qg),()=>{t.assign($g.sub(e).mul(jg.sub(Wg)).div($g.sub(qg)).add(Wg))}).ElseIf(e.greaterThanEqual(Xg),()=>{t.assign(qg.sub(e).mul(Kg.sub(jg)).div(qg.sub(Xg)).add(jg))}).ElseIf(e.greaterThanEqual(Yg),()=>{t.assign(Xg.sub(e).mul(Qg.sub(Kg)).div(Xg.sub(Yg)).add(Kg))}).ElseIf(e.greaterThanEqual(Zg),()=>{t.assign(Yg.sub(e).mul(Jg.sub(Qg)).div(Yg.sub(Zg)).add(Qg))}).Else(()=>{t.assign(Yi(-2).mul(Ka(pa(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),nm=$i(([e,t])=>{const r=e.toVar();r.assign(pa(2,r).sub(1));const s=nn(r,1).toVar();return ji(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),am=$i(([e,t,r,s,i,n])=>{const a=Yi(r),o=nn(t),u=Go(im(a),Wg,n),l=to(u),d=Za(u),c=nn(om(e,o,d,s,i,n)).toVar();return ji(l.notEqual(0),()=>{const t=nn(om(e,o,d.add(1),s,i,n)).toVar();c.assign(ko(c,t,l))}),c}),om=$i(([e,t,r,s,i,n])=>{const a=Yi(r).toVar(),o=nn(t),u=Yi(rm(o)).toVar(),l=Yi(wo(em.sub(a),0)).toVar();a.assign(wo(a,em));const d=Yi(ja(a)).toVar(),c=en(sm(o,u).mul(d.sub(2)).add(1)).toVar();return ji(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(pa(3,tm))),c.y.addAssign(pa(4,ja(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(en(),en())}),um=$i(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=so(s),l=r.mul(u).add(i.cross(r).mul(ro(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return om(e,l,t,n,a,o)}),lm=$i(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=nn(eu(t,r,Bo(r,s))).toVar();ji(h.equal(nn(0)),()=>{h.assign(nn(s.z,0,s.x.negate()))}),h.assign(eo(h));const p=nn().toVar();return p.addAssign(i.element(0).mul(um({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Th({start:Qi(1),end:e},({i:e})=>{ji(e.greaterThanEqual(n),()=>{_h()});const t=Yi(a.mul(Yi(e))).toVar();p.addAssign(i.element(e).mul(um({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(um({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),ln(p,1)}),dm=[.125,.215,.35,.446,.526,.582],cm=20,hm=new ae(-1,1,1,-1,0,1),pm=new oe(90,1),gm=new e;let mm=null,fm=0,ym=0;const bm=(1+Math.sqrt(5))/2,xm=1/bm,Tm=[new r(-bm,xm,0),new r(bm,xm,0),new r(-xm,0,bm),new r(xm,0,bm),new r(0,bm,-xm),new r(0,bm,xm),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],_m=new r,vm=new WeakMap,Nm=[3,1,5,0,4,2],Sm=nm(Ju(),Zu("faceIndex")).normalize(),Em=nn(Sm.x,Sm.y,Sm.z);class wm{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=_m,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}mm=this._renderer.getRenderTarget(),fm=this._renderer.getActiveCubeFace(),ym=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Mm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=Pm(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===R||e.mapping===C?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=dm[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Nm[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new pe;_.setAttribute("position",new ge(b,m)),_.setAttribute("uv",new ge(x,f)),_.setAttribute("faceIndex",new ge(T,y)),t.push(_),i.push(new X(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(t)),this._blurMaterial=function(e,t,s){const i=pl(new Array(cm).fill(0)),n=ra(new r(0,1,0)),a=ra(0),o=Yi(cm),u=ra(0),l=ra(1),d=ol(null),c=ra(0),h=Yi(1/t),p=Yi(1/s),g=Yi(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Em,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Cm("blur");return f.fragmentNode=lm({...m,latitudinal:u.equal(1)}),vm.set(f,m),f}(t,e.width,e.height)}}async _compileMaterial(e){const t=new X(this._lodPlanes[0],e);await this._renderer.compile(t,hm)}_sceneToCubeUV(e,t,r,s,i){const n=pm;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(gm),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new se({name:"PMREM.Background",side:S,depthWrite:!1,depthTest:!1});d=new X(new j,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(gm),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Rm(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===R||e.mapping===C;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Mm(e)):null===this._equirectMaterial&&(this._equirectMaterial=Pm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Rm(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,hm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tcm&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),o.setRenderTarget(t),o.render(l,hm)}}function Am(e,t){const r=new ue(e,t,{magFilter:Y,minFilter:Y,generateMipmaps:!1,type:ce,format:de,colorSpace:le});return r.texture.mapping=he,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function Rm(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Cm(e){const t=new bp;return t.depthTest=!1,t.depthWrite=!1,t.blending=H,t.name=`PMREM_${e}`,t}function Mm(e){const t=Cm("cubemap");return t.fragmentNode=Ad(e,Em),t}function Pm(e){const t=Cm("equirect");return t.fragmentNode=ol(e,Pp(Em),0),t}const Bm=new WeakMap;function Lm(e,t,r){const s=function(e){let t=Bm.get(e);void 0===t&&(t=new WeakMap,Bm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Fm extends Ys{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new x;s.isRenderTargetTexture=!0,this._texture=ol(s),this._width=ra(0),this._height=ra(0),this._maxMip=ra(0),this.updateBeforeType=Us.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Lm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new wm(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=xd.mul(nn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),am(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Im=Oi(Fm).setParameterLength(1,3),Dm=new WeakMap;class Vm extends Ah{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Dm.get(e);void 0===s&&(s=Im(e),Dm.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?nc:od,i=r.context(Um(Nn,s)).mul(bd),n=r.context(Om(ud)).mul(Math.PI).mul(bd),a=Uu(i),o=Uu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Um(wn,ld)).mul(bd),t=Uu(e);u.addAssign(t)}}}const Um=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Ql.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Tl)),r),getTextureLevel:()=>e}},Om=e=>({getUV:()=>e,getTextureLevel:()=>Yi(1)}),km=new me;class Gm extends bp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(km),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Vm(t):null}setupLightingModel(){return new Hg}setupSpecular(){const e=ko(nn(.04),_n.rgb,Sn);Dn.assign(e),Vn.assign(1)}setupVariants(){const e=this.metalnessNode?Yi(this.metalnessNode):Ec;Sn.assign(e);let t=this.roughnessNode?Yi(this.roughnessNode):Sc;t=eg({roughness:t}),Nn.assign(t),this.setupSpecular(),_n.assign(ln(_n.rgb.mul(e.oneMinus()),_n.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const zm=new fe;class Hm extends Gm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(zm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Yi(this.iorNode):Oc;Hn.assign(e),Dn.assign(ko(Eo(Fo(Hn.sub(1).div(Hn.add(1))).mul(_c),nn(1)).mul(Tc),_n.rgb,Sn)),Vn.assign(ko(Tc,1,Sn))}setupLightingModel(){return new Hg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Yi(this.clearcoatNode):Ac,t=this.clearcoatRoughnessNode?Yi(this.clearcoatRoughnessNode):Rc;En.assign(e),wn.assign(eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?nn(this.sheenNode):Pc,t=this.sheenRoughnessNode?Yi(this.sheenRoughnessNode):Bc;An.assign(e),Rn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Yi(this.iridescenceNode):Fc,t=this.iridescenceIORNode?Yi(this.iridescenceIORNode):Ic,r=this.iridescenceThicknessNode?Yi(this.iridescenceThicknessNode):Dc;Cn.assign(e),Mn.assign(t),Pn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?en(this.anisotropyNode):Lc).toVar();Ln.assign(e.length()),ji(Ln.equal(0),()=>{e.assign(en(1,0))}).Else(()=>{e.divAssign(en(Ln)),Ln.assign(Ln.saturate())}),Bn.assign(Ln.pow2().mix(Nn.pow2(),1)),Fn.assign(sc[0].mul(e.x).add(sc[1].mul(e.y))),In.assign(sc[1].mul(e.x).sub(sc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Yi(this.transmissionNode):Vc,t=this.thicknessNode?Yi(this.thicknessNode):Uc,r=this.attenuationDistanceNode?Yi(this.attenuationDistanceNode):kc,s=this.attenuationColorNode?nn(this.attenuationColorNode):Gc;if($n.assign(e),Wn.assign(t),qn.assign(r),jn.assign(s),this.useDispersion){const e=this.dispersionNode?Yi(this.dispersionNode):Xc;Xn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?nn(this.clearcoatNormalNode):Cc}setup(e){e.context.setupClearcoatNormal=()=>hu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class $m extends Hg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(od.mul(a)).normalize(),h=Yi(Ql.dot(c.negate()).saturate().pow(l).mul(d)),p=nn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Wm extends Hm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Yi(.1),this.thicknessAmbientNode=Yi(0),this.thicknessAttenuationNode=Yi(.1),this.thicknessPowerNode=Yi(2),this.thicknessScaleNode=Yi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new $m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const qm=$i(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=en(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=Ld("gradientMap","texture").context({getUV:()=>i});return nn(e.r)}{const e=i.fwidth().mul(.5);return ko(nn(.7),nn(1),$o(Yi(.7).sub(e.x),Yi(.7).add(e.x),i.x))}});class jm extends kp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=qm({normal:rd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Wp({diffuseColor:_n.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Wp({diffuseColor:_n}))),s.indirectDiffuse.mulAssign(t)}}const Xm=new ye;class Km extends bp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Xm),this.setValues(e)}setupLightingModel(){return new jm}}const Ym=$i(()=>{const e=nn(Ql.z,0,Ql.x.negate()).normalize(),t=Ql.cross(e);return en(e.dot(od),t.dot(od)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Qm=new be;class Zm extends bp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Qm),this.setValues(e)}setupVariants(e){const t=Ym;let r;r=e.material.matcap?Ld("matcap","texture").context({getUV:()=>t}):nn(ko(.2,.8,t.y)),_n.rgb.mulAssign(r.rgb)}}class Jm extends Ys{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return pn(e,s,s.negate(),e).mul(r)}{const e=t,s=mn(ln(1,0,0,0),ln(0,so(e.x),ro(e.x).negate(),0),ln(0,ro(e.x),so(e.x),0),ln(0,0,0,1)),i=mn(ln(so(e.y),0,ro(e.y),0),ln(0,1,0,0),ln(ro(e.y).negate(),0,so(e.y),0),ln(0,0,0,1)),n=mn(ln(so(e.z),ro(e.z).negate(),0,0),ln(ro(e.z),so(e.z),0,0),ln(0,0,1,0),ln(0,0,0,1));return s.mul(i).mul(n).mul(ln(r,1)).xyz}}}const ef=Oi(Jm).setParameterLength(2),tf=new xe;class rf extends bp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(tf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Gl.mul(nn(i||0));let u=en(Fl[0].xyz.length(),Fl[1].xyz.length());if(null!==a&&(u=u.mul(en(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=Yi(2).div(bl.element(1).element(1));u=u.mul(e.mul(2))}let l=Wl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Ii(new Nu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Yi(n||Mc),c=ef(l,d);return ln(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const sf=new Te;class nf extends rf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(sf),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Gl.mul(nn(e||ql)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Wl.xy.toVar(),a=Uh.z.div(Uh.w);if(r&&r.isNode){const e=Yi(r);n.assign(ef(n,e))}let o=null!==i?en(i):jc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Yl.z.negate()))),s&&s.isNode&&(o=o.mul(en(s))),n.mulAssign(o.mul(2)),n.assign(n.div(Uh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(ln(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class af extends kp{constructor(){super(),this.shadowNode=Yi(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){_n.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(_n.rgb)}}const of=new _e;class uf extends bp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(of),this.setValues(e)}setupLightingModel(){return new af}}const lf=xn("vec3"),df=xn("vec3"),cf=xn("vec3");class hf extends kp{constructor(){super()}start(e){const{material:t,context:r}=e,s=xn("vec3"),i=xn("vec3");ji(Nl.sub(Xl).length().greaterThan(Ul.mul(2)),()=>{s.assign(Nl),i.assign(Xl)}).Else(()=>{s.assign(Xl),i.assign(Nl)});const n=i.sub(s),a=ra("int").onRenderUpdate(({material:e})=>e.steps),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=Yi(0).toVar(),d=nn(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Th(a,()=>{const i=s.add(u.mul(l)),n=Tl.mul(ln(i,1)).xyz;let a;null!==t.depthNode&&(df.assign(sp(Zh(n.z,fl,yl))),r.sceneDepthNode=sp(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,lf.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&lf.mulAssign(a);const c=lf.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)}),cf.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ji(r.greaterThanEqual(df),()=>{lf.addAssign(e)}):lf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(yg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(cf)}}class pf extends bp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=S,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new hf}}class gf{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class mf{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const bf=[];class xf{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);bf[0]=e,bf[1]=t,bf[2]=n,bf[3]=i;let l=u.get(bf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(bf,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),bf.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new mf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Tf{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const _f=1,vf=2,Nf=3,Sf=4,Ef=16;class wf extends Tf{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===_f?this.backend.createAttribute(e):t===vf?this.backend.createIndexAttribute(e):t===Nf?this.backend.createStorageAttribute(e):t===Sf&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Nf):this.updateAttribute(e,_f);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,vf);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Sf)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Rf(t),e.set(t,r)):r.version!==Af(t)&&(this.attributes.delete(r),r=Rf(t),e.set(t,r)),s=r}return s}}class Mf{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class Pf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class Bf extends Pf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Lf extends Pf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Ff=0;class If{constructor(e,t,r,s=null,i=null){this.id=Ff++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Df extends Tf{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new If(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new If(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new If(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Lf(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new Bf(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Vf extends Tf{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Sf:Nf;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Sf:Nf;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else t.isSampler&&t.update()}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Of(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function kf(e){return(e.transmission>0||e.transmissionNode)&&e.side===E&&!1===e.forceSinglePass}class Gf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(kf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(kf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Uf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Of),this.transparent.length>1&&this.transparent.sort(t||Of)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new U,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:T,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Qf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Jf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ey extends bn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class ty extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.hasOutput?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.hasOutput?this.outputNode.getMemberType(e,t):"void"}add(e){return!0!==e.isNode?(console.error("THREE.TSL: Invalid node added to stack."),this):(this.nodes.push(e),this)}If(e,t){const r=new Fi(t);return this._currentCond=eu(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=eu(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Ii(e),this}Case(...e){const t=[];if(e.length>=2)for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=0;for(const r of this.membersLayout){const s=r.type,i=Cs(s)*e,n=t%8,a=n%Ms(s),o=n+a;t+=a,0!==o&&8-oe.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class iy extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class ny extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),cy=(e,t)=>Lo(pa(4,e.mul(ha(1,e))),t),hy=$i(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),py=$i(([e])=>nn(hy(e.z.add(hy(e.y.mul(1)))),hy(e.z.add(hy(e.x.mul(1)))),hy(e.y.add(hy(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),gy=$i(([e,t,r])=>{const s=nn(e).toVar(),i=Yi(1.4).toVar(),n=Yi(0).toVar(),a=nn(s).toVar();return Th({start:Yi(0),end:Yi(3),type:"float",condition:"<="},()=>{const e=nn(py(a.mul(2))).toVar();s.addAssign(e.add(r.mul(Yi(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=Yi(hy(s.z.add(hy(s.x.add(hy(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class my extends js{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const fy=Oi(my),yy=e=>(...t)=>fy(e,...t),by=ra(0).setGroup(Jn).onRenderUpdate(e=>e.time),xy=ra(0).setGroup(Jn).onRenderUpdate(e=>e.deltaTime),Ty=ra(0,"uint").setGroup(Jn).onRenderUpdate(e=>e.frameId),_y=$i(([e,t,r=en(.5)])=>ef(e.sub(r),t).add(r)),vy=$i(([e,t,r=en(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Ny=$i(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Fl;const i=Tl.mul(s);return Bi(t)&&(i[0][0]=Fl[0].length(),i[0][1]=0,i[0][2]=0),Bi(r)&&(i[1][0]=0,i[1][1]=Fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,bl.mul(i).mul(ql)}),Sy=$i(([e=null])=>{const t=sp();return sp(Kh(e)).sub(t).lessThan(0).select(Ih,e)});class Ey extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Ju(),r=Yi(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=en(a,o);return t.add(l).mul(u)}}const wy=Oi(Ey).setParameterLength(3),Ay=$i(([e,t=null,r=null,s=Yi(1),i=ql,n=sd])=>{let a=n.abs().normalize();a=a.div(a.dot(nn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=ol(d,o).mul(a.x),g=ol(c,u).mul(a.y),m=ol(h,l).mul(a.z);return ca(p,g,m)}),Ry=new Me,Cy=new r,My=new r,Py=new r,By=new a,Ly=new r(0,0,-1),Fy=new s,Iy=new r,Dy=new r,Vy=new s,Uy=new t,Oy=new ue,ky=Ih.flipX();Oy.depthTexture=new U(1,1);let Gy=!1;class zy extends nl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Oy.texture,ky),this._reflectorBaseNode=e.reflector||new Hy(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Ii(new zy({defaultTexture:Oy.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Hy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Uy),e.setSize(Math.round(Uy.width*r),Math.round(Uy.height*r))}setup(e){return this._updateResolution(Oy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ue(0,0,{type:ce,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new U),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Gy)return!1;Gy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Uy),this._updateResolution(o,s),My.setFromMatrixPosition(n.matrixWorld),Py.setFromMatrixPosition(r.matrixWorld),By.extractRotation(n.matrixWorld),Cy.set(0,0,1),Cy.applyMatrix4(By),Iy.subVectors(My,Py);let u=!1;if(!0===Iy.dot(Cy)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Gy=!1);u=!0}Iy.reflect(Cy).negate(),Iy.add(My),By.extractRotation(r.matrixWorld),Ly.set(0,0,-1),Ly.applyMatrix4(By),Ly.add(Py),Dy.subVectors(My,Ly),Dy.reflect(Cy).negate(),Dy.add(My),a.coordinateSystem=r.coordinateSystem,a.position.copy(Iy),a.up.set(0,1,0),a.up.applyMatrix4(By),a.up.reflect(Cy),a.lookAt(Dy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Ry.setFromNormalAndCoplanarPoint(Cy,My),Ry.applyMatrix4(a.matrixWorldInverse),Fy.set(Ry.normal.x,Ry.normal.y,Ry.normal.z,Ry.constant);const l=a.projectionMatrix;Vy.x=(Math.sign(Fy.x)+l.elements[8])/l.elements[0],Vy.y=(Math.sign(Fy.y)+l.elements[9])/l.elements[5],Vy.z=-1,Vy.w=(1+l.elements[10])/l.elements[14],Fy.multiplyScalar(1/Fy.dot(Vy));l.elements[2]=Fy.x,l.elements[6]=Fy.y,l.elements[10]=s.coordinateSystem===d?Fy.z-0:Fy.z+1-0,l.elements[14]=Fy.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const c=s.getRenderTarget(),h=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),s.setMRT(h),s.setRenderTarget(c),s.autoClear=p,i.visible=!0,Gy=!1,this.forceUpdate=!1}}const $y=new ae(-1,1,1,-1,0,1);class Wy extends pe{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Le([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Le(t,2))}}const qy=new Wy;class jy extends X{constructor(e=null){super(qy,e),this.camera=$y,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,$y)}render(e){e.render(this,$y)}}const Xy=new t;class Ky extends nl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ce}){const i=new ue(t,r,s);super(i.texture,Ju()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new jy(new bp),this.updateBeforeType=Us.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Xy),s=r.width*t,i=r.height*t;s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new nl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Yy=(e,...t)=>Ii(new Ky(Ii(e),...t)),Qy=$i(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=en(e.x,e.y.oneMinus()).mul(2).sub(1),i=ln(nn(e,t),1)):i=ln(nn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=ln(r.mul(i));return n.xyz.div(n.w)}),Zy=$i(([e,t])=>{const r=t.mul(ln(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return en(s.x,s.y.oneMinus())}),Jy=$i(([e,t,r])=>{const s=tl(ul(t)),i=tn(e.mul(s)).toVar(),n=ul(t,i).toVar(),a=ul(t,i.sub(tn(2,0))).toVar(),o=ul(t,i.sub(tn(1,0))).toVar(),u=ul(t,i.add(tn(1,0))).toVar(),l=ul(t,i.add(tn(2,0))).toVar(),d=ul(t,i.add(tn(0,2))).toVar(),c=ul(t,i.add(tn(0,1))).toVar(),h=ul(t,i.sub(tn(0,1))).toVar(),p=ul(t,i.sub(tn(0,2))).toVar(),g=uo(ha(Yi(2).mul(o).sub(a),n)).toVar(),m=uo(ha(Yi(2).mul(u).sub(l),n)).toVar(),f=uo(ha(Yi(2).mul(c).sub(d),n)).toVar(),y=uo(ha(Yi(2).mul(h).sub(p),n)).toVar(),b=Qy(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(Qy(e.sub(en(Yi(1).div(s.x),0)),o,r)),b.negate().add(Qy(e.add(en(Yi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(Qy(e.add(en(0,Yi(1).div(s.y))),c,r)),b.negate().add(Qy(e.sub(en(0,Yi(1).div(s.y))),h,r)));return eo(Bo(x,T))});class eb extends js{static get type(){return"SampleNode"}constructor(e){super(),this.callback=e,this.isSampleNode=!0}setup(){return this.sample(Ju())}sample(e){return this.callback(e)}}class tb extends js{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===tb.OBJECT?this.updateType=Us.OBJECT:e===tb.MATERIAL&&(this.updateType=Us.RENDER)}update(e){this.callback(e)}}tb.OBJECT="object",tb.MATERIAL="material";const rb=(e,t)=>Ii(new tb(e,t)).toStack();class sb extends L{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class ib extends ge{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class nb extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ab=ki(nb),ob=new w,ub=new a;class lb extends js{static get type(){return"SceneNode"}constructor(e=lb.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===lb.BACKGROUND_BLURRINESS?s=Md("backgroundBlurriness","float",r):t===lb.BACKGROUND_INTENSITY?s=Md("backgroundIntensity","float",r):t===lb.BACKGROUND_ROTATION?s=ra("mat4").setName("backgroundRotation").setGroup(Jn).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Fe?(ob.copy(r.backgroundRotation),ob.x*=-1,ob.y*=-1,ob.z*=-1,ub.makeRotationFromEuler(ob)):ub.identity(),ub}):console.error("THREE.SceneNode: Unknown scope:",t),s}}lb.BACKGROUND_BLURRINESS="backgroundBlurriness",lb.BACKGROUND_INTENSITY="backgroundIntensity",lb.BACKGROUND_ROTATION="backgroundRotation";const db=ki(lb,lb.BACKGROUND_BLURRINESS),cb=ki(lb,lb.BACKGROUND_INTENSITY),hb=ki(lb,lb.BACKGROUND_ROTATION);class pb extends nl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e}}const gb=Oi(pb).setParameterLength(1,3),mb=$i(({texture:e,uv:t})=>{const r=1e-4,s=nn().toVar();return ji(t.x.lessThan(r),()=>{s.assign(nn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(nn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(nn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(nn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(nn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(nn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(nn(-.01,0,0))).r.sub(e.sample(t.add(nn(r,0,0))).r),n=e.sample(t.add(nn(0,-.01,0))).r.sub(e.sample(t.add(nn(0,r,0))).r),a=e.sample(t.add(nn(0,0,-.01))).r.sub(e.sample(t.add(nn(0,0,r))).r);s.assign(nn(i,n,a))}),s.normalize()});class fb extends nl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return nn(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Qi(tl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return mb({texture:this,uv:e})}}const yb=Oi(fb).setParameterLength(1,3);class bb extends Cd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const xb=new WeakMap;class Tb extends Ys{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=ra(new a),this.previousProjectionMatrix=ra(new a).setGroup(Jn),this.previousCameraViewMatrix=ra(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=vb(r);this.previousModelWorldMatrix.value.copy(s);const i=_b(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){vb(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?bl:ra(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Gl).mul(ql),s=this.previousProjectionMatrix.mul(t).mul(jl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ha(i,n)}}function _b(e){let t=xb.get(e);return void 0===t&&(t={},xb.set(e,t)),t}function vb(e,t=0){const r=_b(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Nb=ki(Tb),Sb=$i(([e])=>Rb(e.rgb)),Eb=$i(([e,t=Yi(1)])=>t.mix(Rb(e.rgb),e.rgb)),wb=$i(([e,t=Yi(1)])=>{const r=ca(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return ko(e.rgb,s,i)}),Ab=$i(([e,t=Yi(1)])=>{const r=nn(.57735,.57735,.57735),s=t.cos();return nn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Po(r,e.rgb).mul(s.oneMinus())))))}),Rb=(e,t=nn(c.getLuminanceCoefficients(new r)))=>Po(e,t),Cb=$i(([e,t=nn(1),s=nn(0),i=nn(1),n=Yi(1),a=nn(c.getLuminanceCoefficients(new r,le))])=>{const o=e.rgb.dot(nn(a)),u=wo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ji(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ji(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ji(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),ln(u.rgb,e.a)});class Mb extends Ys{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Pb=Oi(Mb).setParameterLength(2),Bb=new t;class Lb extends nl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Fb extends Lb{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}class Ib extends Ys{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new U;i.isRenderTargetTexture=!0,i.name="depth";const n=new ue(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ce,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=ra(0),this._cameraFar=ra(0),this._mrt=null,this._layers=null,this._resolution=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Us.FRAME,this.global=!0}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Ii(new Fb(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Ii(new Fb(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Jh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Qh(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getColorBufferType(),this.scope===Ib.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Bb.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Bb)),this._pixelRatio=i,this.setSize(Bb.width,Bb.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolution).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolution).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ib.COLOR="color",Ib.DEPTH="depth";class Db extends Ib{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ib.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new bp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=S;const t=sd.negate(),r=bl.mul(Gl),s=Yi(1),i=r.mul(ln(ql,1)),n=r.mul(ln(ql.add(t),1)),a=eo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=ln(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Vb=$i(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ub=$i(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ob=$i(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kb=$i(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),Gb=$i(([e,t])=>{const r=gn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=gn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=kb(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),zb=gn(nn(1.6605,-.1246,-.0182),nn(-.5876,1.1329,-.1006),nn(-.0728,-.0083,1.1187)),Hb=gn(nn(.6274,.0691,.0164),nn(.3293,.9195,.088),nn(.0433,.0113,.8956)),$b=$i(([e])=>{const t=nn(e).toVar(),r=nn(t.mul(t)).toVar(),s=nn(r.mul(r)).toVar();return Yi(15.5).mul(s.mul(r)).sub(pa(40.14,s.mul(t))).add(pa(31.96,s).sub(pa(6.868,r.mul(t))).add(pa(.4298,r).add(pa(.1191,t).sub(.00232))))}),Wb=$i(([e,t])=>{const r=nn(e).toVar(),s=gn(nn(.856627153315983,.137318972929847,.11189821299995),nn(.0951212405381588,.761241990602591,.0767994186031903),nn(.0482516061458583,.101439036467562,.811302368396859)),i=gn(nn(1.1271005818144368,-.1413297634984383,-.14132976349843826),nn(-.11060664309660323,1.157823702216272,-.11060664309660294),nn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Yi(-12.47393),a=Yi(4.026069);return r.mulAssign(t),r.assign(Hb.mul(r)),r.assign(s.mul(r)),r.assign(wo(r,1e-10)),r.assign(Ka(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Go(r,0,1)),r.assign($b(r)),r.assign(i.mul(r)),r.assign(Lo(wo(nn(0),r),nn(2.2))),r.assign(zb.mul(r)),r.assign(Go(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),qb=$i(([e,t])=>{const r=Yi(.76),s=Yi(.15);e=e.mul(t);const i=Eo(e.r,Eo(e.g,e.b)),n=eu(i.lessThan(.08),i.sub(pa(6.25,i.mul(i))),.04);e.subAssign(n);const a=wo(e.r,wo(e.g,e.b));ji(a.lessThan(r),()=>e);const o=ha(1,r),u=ha(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ha(1,ga(1,s.mul(a.sub(u)).add(1)));return ko(e,nn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class jb extends js{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Xb=Oi(jb).setParameterLength(1,3);class Kb extends jb{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Yb=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Qb extends js{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Yi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Fs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Is(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Zb=Oi(Qb).setParameterLength(1);class Jb extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class ex{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const tx=new Jb;class rx extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Jb,this._output=Zb(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Zb(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Zb(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new ex(this),t=tx.get("THREE"),r=tx.get("TSL"),s=this.getMethod(),i=[e,this._local,tx,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Yi()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const sx=Oi(rx).setParameterLength(1,2);function ix(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Yl.z).negate()}const nx=$i(([e,t],r)=>{const s=ix(r);return $o(e,t,s)}),ax=$i(([e],t)=>{const r=ix(t);return e.mul(e,r,r).negate().exp().oneMinus()}),ox=$i(([e,t])=>ln(t.toFloat().mix(On.rgb,e.toVec3()),On.a));let ux=null,lx=null;class dx extends js{static get type(){return"RangeNode"}constructor(e=Yi(),t=Yi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));ux=ux||new s,lx=lx||new s,ux.setScalar(0),lx.setScalar(0),1===a?ux.setScalar(i):i.isColor?ux.set(i.r,i.g,i.b,1):ux.set(i.x,i.y,i.z||0,i.w||0),1===o?lx.setScalar(n):n.isColor?lx.set(n.r,n.g,n.b,1):lx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;eIi(new hx(e,t)),gx=px("numWorkgroups","uvec3"),mx=px("workgroupId","uvec3"),fx=px("globalId","uvec3"),yx=px("localId","uvec3"),bx=px("subgroupSize","uint");const xx=Oi(class extends js{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Tx extends Xs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class _x extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return console.warn('THREE.TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Ii(new Tx(this,e))}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class vx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=Wu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}vx.ATOMIC_LOAD="atomicLoad",vx.ATOMIC_STORE="atomicStore",vx.ATOMIC_ADD="atomicAdd",vx.ATOMIC_SUB="atomicSub",vx.ATOMIC_MAX="atomicMax",vx.ATOMIC_MIN="atomicMin",vx.ATOMIC_AND="atomicAnd",vx.ATOMIC_OR="atomicOr",vx.ATOMIC_XOR="atomicXor";const Nx=Oi(vx),Sx=(e,t,r)=>Nx(e,t,r).toStack();let Ex;function wx(e){Ex=Ex||new WeakMap;let t=Ex.get(e);return void 0===t&&Ex.set(e,t={}),t}function Ax(e){const t=wx(e);return t.shadowMatrix||(t.shadowMatrix=ra("mat4").setGroup(Jn).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||e.shadow.updateMatrices(e),e.shadow.matrix)))}function Rx(e,t=Xl){const r=Ax(e).mul(t);return r.xyz.div(r.w)}function Cx(e){const t=wx(e);return t.position||(t.position=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function Mx(e){const t=wx(e);return t.targetPosition||(t.targetPosition=ra(new r).setGroup(Jn).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function Px(e){const t=wx(e);return t.viewPosition||(t.viewPosition=ra(new r).setGroup(Jn).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const Bx=e=>Tl.transformDirection(Cx(e).sub(Mx(e))),Lx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},Fx=new WeakMap,Ix=[];class Dx extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=xn("vec3","totalDiffuse"),this.totalSpecularNode=xn("vec3","totalSpecular"),this.outgoingLightNode=xn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Ii(e));else{let s=null;if(null!==r&&(s=Lx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;Fx.has(e)?s=Fx.get(e):(s=Ii(new r(e)),Fx.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=nn(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class Vx extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){Ux.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Xl)}}const Ux=xn("vec3","shadowPositionWorld");function Ox(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function kx(e,t){return t=Ox(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function Gx(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function zx(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function Hx(e,t){return t=zx(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function $x(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function Wx(e,t,r){return r=Hx(t,r=kx(e,r))}function qx(e,t,r){Gx(e,r),$x(t,r)}var jx=Object.freeze({__proto__:null,resetRendererAndSceneState:Wx,resetRendererState:kx,resetSceneState:Hx,restoreRendererAndSceneState:qx,restoreRendererState:Gx,restoreSceneState:$x,saveRendererAndSceneState:function(e,t,r={}){return r=zx(t,r=Ox(e,r))},saveRendererState:Ox,saveSceneState:zx});const Xx=new WeakMap,Kx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=ol(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),Yx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=ol(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Md("mapSize","vec2",r).setGroup(Jn),a=Md("radius","float",r).setGroup(Jn),o=en(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return ca(i(t.xy.add(en(u,l)),t.z),i(t.xy.add(en(0,l)),t.z),i(t.xy.add(en(d,l)),t.z),i(t.xy.add(en(h,p)),t.z),i(t.xy.add(en(0,p)),t.z),i(t.xy.add(en(g,p)),t.z),i(t.xy.add(en(u,0)),t.z),i(t.xy.add(en(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(en(g,0)),t.z),i(t.xy.add(en(d,0)),t.z),i(t.xy.add(en(h,m)),t.z),i(t.xy.add(en(0,m)),t.z),i(t.xy.add(en(g,m)),t.z),i(t.xy.add(en(u,c)),t.z),i(t.xy.add(en(0,c)),t.z),i(t.xy.add(en(d,c)),t.z)).mul(1/17)}),Qx=$i(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=ol(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=Md("mapSize","vec2",r).setGroup(Jn),a=en(1).div(n),o=a.x,u=a.y,l=t.xy,d=to(l.mul(n).add(.5));return l.subAssign(d.mul(a)),ca(i(l,t.z),i(l.add(en(o,0)),t.z),i(l.add(en(0,u)),t.z),i(l.add(a),t.z),ko(i(l.add(en(o.negate(),0)),t.z),i(l.add(en(o.mul(2),0)),t.z),d.x),ko(i(l.add(en(o.negate(),u)),t.z),i(l.add(en(o.mul(2),u)),t.z),d.x),ko(i(l.add(en(0,u.negate())),t.z),i(l.add(en(0,u.mul(2))),t.z),d.y),ko(i(l.add(en(o,u.negate())),t.z),i(l.add(en(o,u.mul(2))),t.z),d.y),ko(ko(i(l.add(en(o.negate(),u.negate())),t.z),i(l.add(en(o.mul(2),u.negate())),t.z),d.x),ko(i(l.add(en(o.negate(),u.mul(2))),t.z),i(l.add(en(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),Zx=$i(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=Yi(1).toVar();let i=ol(e).sample(t.xy);e.isArrayTexture&&(i=i.depth(r)),i=i.rg;const n=Ao(t.z,i.x);return ji(n.notEqual(Yi(1)),()=>{const e=t.z.sub(i.x),r=wo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Go(ha(a,.3).div(.95-.3)),s.assign(Go(wo(n,a)))}),s}),Jx=$i(([e,t,r])=>{let s=Xl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),eT=e=>{let t=Xx.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Md("near","float",t).setGroup(Jn),s=Md("far","float",t).setGroup(Jn),i=Rl(e);return Jx(i,r,s)})(e):null;t=new bp,t.colorNode=ln(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,Xx.set(e,t)}return t},tT=new mf,rT=[],sT=(e,t,r,s)=>{rT[0]=e,rT[1]=t;let i=tT.get(rT);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ls(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,tT.set(rT,i)),rT[0]=null,rT[1]=null,i},iT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanVertical"),a=Yi(0).toVar("squareMeanVertical"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));Th({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Vh.xy,en(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),nT=$i(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Yi(0).toVar("meanHorizontal"),a=Yi(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(2).div(e.sub(1))),u=e.lessThanEqual(Yi(1)).select(Yi(0),Yi(-1));Th({start:Qi(0),end:Qi(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(Yi(e).mul(o));let d=s.sample(ca(Vh.xy,en(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(ca(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=Ya(a.sub(n.mul(n)));return en(n,l)}),aT=[Kx,Yx,Qx,Zx];let oT;const uT=new jy;class lT extends Vx{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,Yi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Md("bias","float",r).setGroup(Jn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=Md("near","float",r.camera).setGroup(Jn),s=Md("far","float",r.camera).setGroup(Jn);n=ep(e.negate(),t,s)}return a=nn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return aT[e]}setupRenderTarget(e,t){const r=new U(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=De;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie&&!0!==s.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:ce,depthBuffer:!1}));let t=ol(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=ol(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const i=Md("blurSamples","float",s).setGroup(Jn),o=Md("radius","float",s).setGroup(Jn),u=Md("mapSize","vec2",s).setGroup(Jn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new bp);l.fragmentNode=iT({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new bp),l.fragmentNode=nT({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=Md("intensity","float",s).setGroup(Jn),u=Md("normalBias","float",s).setGroup(Jn),l=Ax(r).mul(Ux.add(ud.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ie&&!0!==s.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=ol(a.texture,d);n.isArrayTexture&&(g=g.depth(this.depthLayer));const m=ko(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return $i(()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");oT=Wx(i,n,oT),n.overrideMaterial=eT(r),i.setRenderObjectFunction(sT(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ie&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,qx(i,n,oT)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),uT.material=this.vsmMaterialVertical,uT.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),uT.material=this.vsmMaterialHorizontal,uT.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const dT=(e,t)=>Ii(new lT(e,t)),cT=new e,hT=$i(([e,t])=>{const r=e.toVar(),s=uo(r),i=ga(1,wo(s.x,wo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=en(r.xy).toVar(),a=t.mul(1.5).oneMinus();return ji(s.z.greaterThanEqual(a),()=>{ji(r.z.greaterThan(0),()=>{n.x.assign(ha(4,r.x))})}).ElseIf(s.x.greaterThanEqual(a),()=>{const e=lo(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))}).ElseIf(s.y.greaterThanEqual(a),()=>{const e=lo(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))}),en(.125,.25).mul(n).add(en(.375,.75)).flipY()}).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),pT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>ol(e,hT(t,s.y)).compare(r)),gT=$i(({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Md("radius","float",i).setGroup(Jn),a=en(-1,1).mul(n).mul(s.y);return ol(e,hT(t.add(a.xyy),s.y)).compare(r).add(ol(e,hT(t.add(a.yyy),s.y)).compare(r)).add(ol(e,hT(t.add(a.xyx),s.y)).compare(r)).add(ol(e,hT(t.add(a.yyx),s.y)).compare(r)).add(ol(e,hT(t,s.y)).compare(r)).add(ol(e,hT(t.add(a.xxy),s.y)).compare(r)).add(ol(e,hT(t.add(a.yxy),s.y)).compare(r)).add(ol(e,hT(t.add(a.xxx),s.y)).compare(r)).add(ol(e,hT(t.add(a.yxx),s.y)).compare(r)).mul(1/9)}),mT=$i(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.near),o=ra("float").setGroup(Jn).onRenderUpdate(()=>s.camera.far),u=Md("bias","float",s).setGroup(Jn),l=ra(s.mapSize).setGroup(Jn),d=Yi(1).toVar();return ji(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=en(1).div(l.mul(en(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))}),d}),fT=new s,yT=new t,bT=new t;class xT extends lT{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?pT:gT}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return mT({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();bT.copy(t.mapSize),bT.multiply(a),r.setSize(bT.width,bT.height),yT.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(cT),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eIi(new xT(e,t));class _T extends Ah{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||ra(this.color).setGroup(Jn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}getHash(){return this.light.uuid}getLightVector(e){return Px(this.light).sub(e.context.positionView||Yl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return dT(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Ii(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const vT=$i(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),NT=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=vT({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class ST extends _T{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(2).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return TT(this.light)}setupDirect(e){return NT({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const ET=$i(([e=Ju()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),wT=$i(([e=Ju()],{renderer:t,material:r})=>{const s=Oo(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.samples>1){const e=Yi(s.fwidth()).toVar();i=$o(e.oneMinus(),e.add(1),s).oneMinus()}else i=eu(s.greaterThan(1),0,1);return i}),AT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Ji(e).toVar();return eu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),RT=$i(([e,t])=>{const r=Ji(t).toVar(),s=Yi(e).toVar();return eu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),CT=$i(([e])=>{const t=Yi(e).toVar();return Qi(Za(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),MT=$i(([e,t])=>{const r=Yi(e).toVar();return t.assign(CT(r)),r.sub(Yi(t))}),PT=yy([$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=Yi(s).toVar(),l=Yi(r).toVar(),d=Yi(t).toVar(),c=Yi(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),$i(([e,t,r,s,i,n])=>{const a=Yi(n).toVar(),o=Yi(i).toVar(),u=nn(s).toVar(),l=nn(r).toVar(),d=nn(t).toVar(),c=nn(e).toVar(),h=Yi(ha(1,o)).toVar();return ha(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),BT=yy([$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=Yi(o).toVar(),m=Yi(a).toVar(),f=Yi(n).toVar(),y=Yi(i).toVar(),b=Yi(s).toVar(),x=Yi(r).toVar(),T=Yi(t).toVar(),_=Yi(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Yi(d).toVar(),h=Yi(l).toVar(),p=Yi(u).toVar(),g=nn(o).toVar(),m=nn(a).toVar(),f=nn(n).toVar(),y=nn(i).toVar(),b=nn(s).toVar(),x=nn(r).toVar(),T=nn(t).toVar(),_=nn(e).toVar(),v=Yi(ha(1,p)).toVar(),N=Yi(ha(1,h)).toVar();return Yi(ha(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),LT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=Zi(e).toVar(),a=Zi(n.bitAnd(Zi(7))).toVar(),o=Yi(AT(a.lessThan(Zi(4)),i,s)).toVar(),u=Yi(pa(2,AT(a.lessThan(Zi(4)),s,i))).toVar();return RT(o,Ji(a.bitAnd(Zi(1)))).add(RT(u,Ji(a.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),FT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=Zi(e).toVar(),u=Zi(o.bitAnd(Zi(15))).toVar(),l=Yi(AT(u.lessThan(Zi(8)),a,n)).toVar(),d=Yi(AT(u.lessThan(Zi(4)),n,AT(u.equal(Zi(12)).or(u.equal(Zi(14))),a,i))).toVar();return RT(l,Ji(u.bitAnd(Zi(1)))).add(RT(d,Ji(u.bitAnd(Zi(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),IT=yy([LT,FT]),DT=$i(([e,t,r])=>{const s=Yi(r).toVar(),i=Yi(t).toVar(),n=on(e).toVar();return nn(IT(n.x,i,s),IT(n.y,i,s),IT(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),VT=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Yi(t).toVar(),o=on(e).toVar();return nn(IT(o.x,a,n,i),IT(o.y,a,n,i),IT(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),UT=yy([DT,VT]),OT=$i(([e])=>{const t=Yi(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),kT=$i(([e])=>{const t=Yi(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),GT=yy([OT,$i(([e])=>{const t=nn(e).toVar();return pa(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),zT=yy([kT,$i(([e])=>{const t=nn(e).toVar();return pa(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),HT=$i(([e,t])=>{const r=Qi(t).toVar(),s=Zi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Qi(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),$T=$i(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(HT(r,Qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(HT(e,Qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(HT(t,Qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(HT(r,Qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(HT(e,Qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(HT(t,Qi(4))),t.addAssign(e)}),WT=$i(([e,t,r])=>{const s=Zi(r).toVar(),i=Zi(t).toVar(),n=Zi(e).toVar();return s.bitXorAssign(i),s.subAssign(HT(i,Qi(14))),n.bitXorAssign(s),n.subAssign(HT(s,Qi(11))),i.bitXorAssign(n),i.subAssign(HT(n,Qi(25))),s.bitXorAssign(i),s.subAssign(HT(i,Qi(16))),n.bitXorAssign(s),n.subAssign(HT(s,Qi(4))),i.bitXorAssign(n),i.subAssign(HT(n,Qi(14))),s.bitXorAssign(i),s.subAssign(HT(i,Qi(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),qT=$i(([e])=>{const t=Zi(e).toVar();return Yi(t).div(Yi(Zi(Qi(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),jT=$i(([e])=>{const t=Yi(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),XT=yy([$i(([e])=>{const t=Qi(e).toVar(),r=Zi(Zi(1)).toVar(),s=Zi(Zi(Qi(3735928559)).add(r.shiftLeft(Zi(2))).add(Zi(13))).toVar();return WT(s.add(Zi(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(Zi(2)).toVar(),n=Zi().toVar(),a=Zi().toVar(),o=Zi().toVar();return n.assign(a.assign(o.assign(Zi(Qi(3735928559)).add(i.shiftLeft(Zi(2))).add(Zi(13))))),n.addAssign(Zi(s)),a.addAssign(Zi(r)),WT(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(Zi(3)).toVar(),o=Zi().toVar(),u=Zi().toVar(),l=Zi().toVar();return o.assign(u.assign(l.assign(Zi(Qi(3735928559)).add(a.shiftLeft(Zi(2))).add(Zi(13))))),o.addAssign(Zi(n)),u.addAssign(Zi(i)),l.addAssign(Zi(s)),WT(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),$i(([e,t,r,s])=>{const i=Qi(s).toVar(),n=Qi(r).toVar(),a=Qi(t).toVar(),o=Qi(e).toVar(),u=Zi(Zi(4)).toVar(),l=Zi().toVar(),d=Zi().toVar(),c=Zi().toVar();return l.assign(d.assign(c.assign(Zi(Qi(3735928559)).add(u.shiftLeft(Zi(2))).add(Zi(13))))),l.addAssign(Zi(o)),d.addAssign(Zi(a)),c.addAssign(Zi(n)),$T(l,d,c),l.addAssign(Zi(i)),WT(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),$i(([e,t,r,s,i])=>{const n=Qi(i).toVar(),a=Qi(s).toVar(),o=Qi(r).toVar(),u=Qi(t).toVar(),l=Qi(e).toVar(),d=Zi(Zi(5)).toVar(),c=Zi().toVar(),h=Zi().toVar(),p=Zi().toVar();return c.assign(h.assign(p.assign(Zi(Qi(3735928559)).add(d.shiftLeft(Zi(2))).add(Zi(13))))),c.addAssign(Zi(l)),h.addAssign(Zi(u)),p.addAssign(Zi(o)),$T(c,h,p),c.addAssign(Zi(a)),h.addAssign(Zi(n)),WT(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),KT=yy([$i(([e,t])=>{const r=Qi(t).toVar(),s=Qi(e).toVar(),i=Zi(XT(s,r)).toVar(),n=on().toVar();return n.x.assign(i.bitAnd(Qi(255))),n.y.assign(i.shiftRight(Qi(8)).bitAnd(Qi(255))),n.z.assign(i.shiftRight(Qi(16)).bitAnd(Qi(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Qi(t).toVar(),n=Qi(e).toVar(),a=Zi(XT(n,i,s)).toVar(),o=on().toVar();return o.x.assign(a.bitAnd(Qi(255))),o.y.assign(a.shiftRight(Qi(8)).bitAnd(Qi(255))),o.z.assign(a.shiftRight(Qi(16)).bitAnd(Qi(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),YT=yy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(MT(t.x,r)).toVar(),n=Yi(MT(t.y,s)).toVar(),a=Yi(jT(i)).toVar(),o=Yi(jT(n)).toVar(),u=Yi(PT(IT(XT(r,s),i,n),IT(XT(r.add(Qi(1)),s),i.sub(1),n),IT(XT(r,s.add(Qi(1))),i,n.sub(1)),IT(XT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return GT(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(MT(t.x,r)).toVar(),a=Yi(MT(t.y,s)).toVar(),o=Yi(MT(t.z,i)).toVar(),u=Yi(jT(n)).toVar(),l=Yi(jT(a)).toVar(),d=Yi(jT(o)).toVar(),c=Yi(BT(IT(XT(r,s,i),n,a,o),IT(XT(r.add(Qi(1)),s,i),n.sub(1),a,o),IT(XT(r,s.add(Qi(1)),i),n,a.sub(1),o),IT(XT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),IT(XT(r,s,i.add(Qi(1))),n,a,o.sub(1)),IT(XT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),IT(XT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),IT(XT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return zT(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),QT=yy([$i(([e])=>{const t=en(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Yi(MT(t.x,r)).toVar(),n=Yi(MT(t.y,s)).toVar(),a=Yi(jT(i)).toVar(),o=Yi(jT(n)).toVar(),u=nn(PT(UT(KT(r,s),i,n),UT(KT(r.add(Qi(1)),s),i.sub(1),n),UT(KT(r,s.add(Qi(1))),i,n.sub(1)),UT(KT(r.add(Qi(1)),s.add(Qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return GT(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi().toVar(),s=Qi().toVar(),i=Qi().toVar(),n=Yi(MT(t.x,r)).toVar(),a=Yi(MT(t.y,s)).toVar(),o=Yi(MT(t.z,i)).toVar(),u=Yi(jT(n)).toVar(),l=Yi(jT(a)).toVar(),d=Yi(jT(o)).toVar(),c=nn(BT(UT(KT(r,s,i),n,a,o),UT(KT(r.add(Qi(1)),s,i),n.sub(1),a,o),UT(KT(r,s.add(Qi(1)),i),n,a.sub(1),o),UT(KT(r.add(Qi(1)),s.add(Qi(1)),i),n.sub(1),a.sub(1),o),UT(KT(r,s,i.add(Qi(1))),n,a,o.sub(1)),UT(KT(r.add(Qi(1)),s,i.add(Qi(1))),n.sub(1),a,o.sub(1)),UT(KT(r,s.add(Qi(1)),i.add(Qi(1))),n,a.sub(1),o.sub(1)),UT(KT(r.add(Qi(1)),s.add(Qi(1)),i.add(Qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return zT(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ZT=yy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(CT(t)).toVar();return qT(XT(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar();return qT(XT(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar();return qT(XT(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar(),n=Qi(CT(t.w)).toVar();return qT(XT(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),JT=yy([$i(([e])=>{const t=Yi(e).toVar(),r=Qi(CT(t)).toVar();return nn(qT(XT(r,Qi(0))),qT(XT(r,Qi(1))),qT(XT(r,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),$i(([e])=>{const t=en(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar();return nn(qT(XT(r,s,Qi(0))),qT(XT(r,s,Qi(1))),qT(XT(r,s,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),$i(([e])=>{const t=nn(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar();return nn(qT(XT(r,s,i,Qi(0))),qT(XT(r,s,i,Qi(1))),qT(XT(r,s,i,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),$i(([e])=>{const t=ln(e).toVar(),r=Qi(CT(t.x)).toVar(),s=Qi(CT(t.y)).toVar(),i=Qi(CT(t.z)).toVar(),n=Qi(CT(t.w)).toVar();return nn(qT(XT(r,s,i,n,Qi(0))),qT(XT(r,s,i,n,Qi(1))),qT(XT(r,s,i,n,Qi(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),e_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=Yi(0).toVar(),l=Yi(1).toVar();return Th(a,()=>{u.addAssign(l.mul(YT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),t_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(0).toVar(),l=Yi(1).toVar();return Th(a,()=>{u.addAssign(l.mul(QT(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),r_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar();return en(e_(o,a,n,i),e_(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),s_=$i(([e,t,r,s])=>{const i=Yi(s).toVar(),n=Yi(r).toVar(),a=Qi(t).toVar(),o=nn(e).toVar(),u=nn(t_(o,a,n,i)).toVar(),l=Yi(e_(o.add(nn(Qi(19),Qi(193),Qi(17))),a,n,i)).toVar();return ln(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),i_=yy([$i(([e,t,r,s,i,n,a])=>{const o=Qi(a).toVar(),u=Yi(n).toVar(),l=Qi(i).toVar(),d=Qi(s).toVar(),c=Qi(r).toVar(),h=Qi(t).toVar(),p=en(e).toVar(),g=nn(JT(en(h.add(d),c.add(l)))).toVar(),m=en(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=en(en(Yi(h),Yi(c)).add(m)).toVar(),y=en(f.sub(p)).toVar();return ji(o.equal(Qi(2)),()=>uo(y.x).add(uo(y.y))),ji(o.equal(Qi(3)),()=>wo(uo(y.x),uo(y.y))),Po(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),$i(([e,t,r,s,i,n,a,o,u])=>{const l=Qi(u).toVar(),d=Yi(o).toVar(),c=Qi(a).toVar(),h=Qi(n).toVar(),p=Qi(i).toVar(),g=Qi(s).toVar(),m=Qi(r).toVar(),f=Qi(t).toVar(),y=nn(e).toVar(),b=nn(JT(nn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=nn(nn(Yi(f),Yi(m),Yi(g)).add(b)).toVar(),T=nn(x.sub(y)).toVar();return ji(l.equal(Qi(2)),()=>uo(T.x).add(uo(T.y)).add(uo(T.z))),ji(l.equal(Qi(3)),()=>wo(uo(T.x),uo(T.y),uo(T.z))),Po(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),n_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=Yi(1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();l.assign(Eo(l,r))})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),a_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=en(1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),o_=$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=en(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=en(MT(n.x,a),MT(n.y,o)).toVar(),l=nn(1e6,1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{const r=Yi(i_(u,e,t,a,o,i,s)).toVar();ji(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),ji(s.equal(Qi(0)),()=>{l.assign(Ya(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),u_=yy([n_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=Yi(1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Eo(d,n))})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),l_=yy([a_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=en(1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),d_=yy([o_,$i(([e,t,r])=>{const s=Qi(r).toVar(),i=Yi(t).toVar(),n=nn(e).toVar(),a=Qi().toVar(),o=Qi().toVar(),u=Qi().toVar(),l=nn(MT(n.x,a),MT(n.y,o),MT(n.z,u)).toVar(),d=nn(1e6,1e6,1e6).toVar();return Th({start:-1,end:Qi(1),name:"x",condition:"<="},({x:e})=>{Th({start:-1,end:Qi(1),name:"y",condition:"<="},({y:t})=>{Th({start:-1,end:Qi(1),name:"z",condition:"<="},({z:r})=>{const n=Yi(i_(l,e,t,r,a,o,u,i,s)).toVar();ji(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),ji(s.equal(Qi(0)),()=>{d.assign(Ya(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),c_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=en(t).toVar(),p=en(r).toVar(),g=en(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(QT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(JT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(d_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(t_(nn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),h_=$i(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Qi(e).toVar(),h=nn(t).toVar(),p=nn(r).toVar(),g=nn(s).toVar(),m=Yi(i).toVar(),f=Yi(n).toVar(),y=Yi(a).toVar(),b=Ji(o).toVar(),x=Qi(u).toVar(),T=Yi(l).toVar(),_=Yi(d).toVar(),v=h.mul(p).add(g),N=Yi(0).toVar();return ji(c.equal(Qi(0)),()=>{N.assign(QT(v))}),ji(c.equal(Qi(1)),()=>{N.assign(JT(v))}),ji(c.equal(Qi(2)),()=>{N.assign(d_(v,m,Qi(0)))}),ji(c.equal(Qi(3)),()=>{N.assign(t_(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ji(b,()=>{N.assign(Go(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),p_=$i(([e])=>{const t=e.y,r=e.z,s=nn().toVar();return ji(t.lessThan(1e-4),()=>{s.assign(nn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(Za(i)).mul(6).toVar();const n=Qi(bo(i)),a=i.sub(Yi(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ji(n.equal(Qi(0)),()=>{s.assign(nn(r,l,o))}).ElseIf(n.equal(Qi(1)),()=>{s.assign(nn(u,r,o))}).ElseIf(n.equal(Qi(2)),()=>{s.assign(nn(o,r,l))}).ElseIf(n.equal(Qi(3)),()=>{s.assign(nn(o,u,r))}).ElseIf(n.equal(Qi(4)),()=>{s.assign(nn(l,o,r))}).Else(()=>{s.assign(nn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),g_=$i(([e])=>{const t=nn(e).toVar(),r=Yi(t.x).toVar(),s=Yi(t.y).toVar(),i=Yi(t.z).toVar(),n=Yi(Eo(r,Eo(s,i))).toVar(),a=Yi(wo(r,wo(s,i))).toVar(),o=Yi(a.sub(n)).toVar(),u=Yi().toVar(),l=Yi().toVar(),d=Yi().toVar();return d.assign(a),ji(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ji(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ji(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(ca(2,i.sub(r).div(o)))}).Else(()=>{u.assign(ca(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ji(u.lessThan(0),()=>{u.addAssign(1)})}),nn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),m_=$i(([e])=>{const t=nn(e).toVar(),r=un(xa(t,nn(.04045))).toVar(),s=nn(t.div(12.92)).toVar(),i=nn(Lo(wo(t.add(nn(.055)),nn(0)).div(1.055),nn(2.4))).toVar();return ko(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),f_=(e,t)=>{e=Yi(e),t=Yi(t);const r=en(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return $o(e.sub(r),e.add(r),t)},y_=(e,t,r,s)=>ko(e,t,r[s].clamp()),b_=(e,t,r,s,i)=>ko(e,t,f_(r,s[i])),x_=$i(([e,t,r])=>{const s=eo(e).toVar(),i=ha(Yi(.5).mul(t.sub(r)),Xl).div(s).toVar(),n=ha(Yi(-.5).mul(t.sub(r)),Xl).div(s).toVar(),a=nn().toVar();a.x=s.x.greaterThan(Yi(0)).select(i.x,n.x),a.y=s.y.greaterThan(Yi(0)).select(i.y,n.y),a.z=s.z.greaterThan(Yi(0)).select(i.z,n.z);const o=Eo(a.x,a.y,a.z).toVar();return Xl.add(s.mul(o)).toVar().sub(r)}),T_=$i(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(pa(r,r).sub(pa(s,s)))),n});var __=Object.freeze({__proto__:null,BRDF_GGX:ag,BRDF_Lambert:Wp,BasicPointShadowFilter:pT,BasicShadowFilter:Kx,Break:_h,Const:lu,Continue:()=>Wu("continue").toStack(),DFGApprox:og,D_GGX:sg,Discard:qu,EPSILON:Ua,F_Schlick:$p,Fn:$i,INFINITY:Oa,If:ji,Loop:Th,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,OnMaterialUpdate:e=>rb(tb.MATERIAL,e),OnObjectUpdate:e=>rb(tb.OBJECT,e),PCFShadowFilter:Yx,PCFSoftShadowFilter:Qx,PI:ka,PI2:Ga,PointShadowFilter:gT,Return:()=>Wu("return").toStack(),Schlick_to_F0:lg,ScriptableNodeResources:tx,ShaderNode:Fi,Stack:Xi,Switch:(...e)=>ai.Switch(...e),TBNViewMatrix:sc,VSMShadowFilter:Zx,V_GGX_SmithCorrelated:tg,Var:uu,VarIntent:du,abs:uo,acesFilmicToneMapping:Gb,acos:ao,add:ca,addMethodChaining:ui,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Wb,all:za,alphaT:Bn,and:va,anisotropy:Ln,anisotropyB:In,anisotropyT:Fn,any:Ha,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),Xi(e)),array:ia,arrayBuffer:e=>Ii(new ii(e,"ArrayBuffer")),asin:no,assign:aa,atan:oo,atan2:Yo,atomicAdd:(e,t)=>Sx(vx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Sx(vx.ATOMIC_AND,e,t),atomicFunc:Sx,atomicLoad:e=>Sx(vx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Sx(vx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Sx(vx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Sx(vx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Sx(vx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Sx(vx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Sx(vx.ATOMIC_XOR,e,t),attenuationColor:jn,attenuationDistance:qn,attribute:Zu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new ib(e,r,s);return mh(i,t,e)},backgroundBlurriness:db,backgroundIntensity:cb,backgroundRotation:hb,batch:ch,bentNormalView:nc,billboarding:Ny,bitAnd:wa,bitNot:Aa,bitOr:Ra,bitXor:Ca,bitangentGeometry:Jd,bitangentLocal:ec,bitangentView:tc,bitangentWorld:rc,bitcast:No,blendBurn:cp,blendColor:mp,blendDodge:hp,blendOverlay:gp,blendScreen:pp,blur:lm,bool:Ji,buffer:dl,bufferAttribute:Mu,bumpMap:cc,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),cp(e)),bvec2:sn,bvec3:un,bvec4:hn,bypass:ku,cache:Uu,call:ua,cameraFar:yl,cameraIndex:ml,cameraNear:fl,cameraNormalMatrix:vl,cameraPosition:Nl,cameraProjectionMatrix:bl,cameraProjectionMatrixInverse:xl,cameraViewMatrix:Tl,cameraWorldMatrix:_l,cbrt:Uo,cdl:Cb,ceil:Ja,checker:ET,cineonToneMapping:Ob,clamp:Go,clearcoat:En,clearcoatNormalView:ld,clearcoatRoughness:wn,code:Xb,color:Ki,colorSpaceToWorking:_u,colorToDirection:e=>Ii(e).mul(2).sub(1),compute:Du,computeKernel:Iu,computeSkinning:(e,t=null)=>{const r=new yh(e);return r.positionNode=mh(new L(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(th).toVar(),r.skinIndexNode=mh(new L(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(th).toVar(),r.skinWeightNode=mh(new L(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(th).toVar(),r.bindMatrixNode=ra(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=ra(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=dl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Ii(r)},context:ru,convert:yn,convertColorSpace:(e,t,r)=>Ii(new xu(Ii(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Yy(e,...t),cos:so,cross:Bo,cubeTexture:Ad,cubeTextureBase:wd,cubeToUV:hT,dFdx:go,dFdy:mo,dashSize:kn,debug:Yu,decrement:Ia,decrementBefore:La,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Bi,degrees:Wa,deltaTime:xy,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),ox(e,ax(t))},densityFogFactor:ax,depth:rp,depthPass:(e,t,r)=>Ii(new Ib(Ib.DEPTH,e,t,r)),determinant:_o,difference:Mo,diffuseColor:_n,directPointLight:NT,directionToColor:Rp,directionToFaceDirection:td,dispersion:Xn,distance:Co,div:ga,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),hp(e)),dot:Po,drawIndex:nh,dynamicBufferAttribute:Pu,element:fn,emissive:vn,equal:fa,equals:So,equirectUV:Pp,exp:qa,exp2:ja,expression:Wu,faceDirection:ed,faceForward:Wo,faceforward:Qo,float:Yi,floor:Za,fog:ox,fract:to,frameGroup:Zn,frameId:Ty,frontFacing:Jl,fwidth:xo,gain:(e,t)=>e.lessThan(.5)?cy(e.mul(2),t).div(2):ha(1,cy(pa(ha(1,e),2),t).div(2)),gapSize:Gn,getConstNodeType:Li,getCurrentStack:qi,getDirection:nm,getDistanceAttenuation:vT,getGeometryRoughness:Jp,getNormalFromDepth:Jy,getParallaxCorrectNormal:x_,getRoughness:eg,getScreenPosition:Zy,getShIrradianceAt:T_,getShadowMaterial:eT,getShadowRenderObjectFunction:sT,getTextureIndex:oy,getViewPosition:Qy,globalId:fx,glsl:(e,t)=>Xb(e,t,"glsl"),glslFn:(e,t)=>Yb(e,t,"glsl"),grayscale:Sb,greaterThan:xa,greaterThanEqual:_a,hash:dy,highpModelNormalViewMatrix:$l,highpModelViewMatrix:Hl,hue:Ab,increment:Fa,incrementBefore:Ba,instance:oh,instanceIndex:th,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new sb(e,r,s);return mh(i,t,e)},instancedBufferAttribute:Bu,instancedDynamicBufferAttribute:Lu,instancedMesh:lh,int:Qi,inverse:vo,inverseSqrt:Qa,inversesqrt:Zo,invocationLocalIndex:ih,invocationSubgroupIndex:sh,ior:Hn,iridescence:Cn,iridescenceIOR:Mn,iridescenceThickness:Pn,ivec2:tn,ivec3:an,ivec4:dn,js:(e,t)=>Xb(e,t,"js"),label:nu,length:co,lengthSq:Oo,lessThan:ba,lessThanEqual:Ta,lightPosition:Cx,lightProjectionUV:Rx,lightShadowMatrix:Ax,lightTargetDirection:Bx,lightTargetPosition:Mx,lightViewPosition:Px,lightingContext:Mh,lights:(e=[])=>Ii(new Dx).setLights(e),linearDepth:sp,linearToneMapping:Vb,localId:yx,log:Xa,log2:Ka,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Xa(r.div(t)));return Yi(Math.E).pow(s).mul(t).negate()},luminance:Rb,mat2:pn,mat3:gn,mat4:mn,matcapUV:Ym,materialAO:Yc,materialAlphaTest:gc,materialAnisotropy:Lc,materialAnisotropyVector:Qc,materialAttenuationColor:Gc,materialAttenuationDistance:kc,materialClearcoat:Ac,materialClearcoatNormal:Cc,materialClearcoatRoughness:Rc,materialColor:mc,materialDispersion:Xc,materialEmissive:yc,materialEnvIntensity:bd,materialEnvRotation:xd,materialIOR:Oc,materialIridescence:Fc,materialIridescenceIOR:Ic,materialIridescenceThickness:Dc,materialLightMap:Kc,materialLineDashOffset:qc,materialLineDashSize:Hc,materialLineGapSize:$c,materialLineScale:zc,materialLineWidth:Wc,materialMetalness:Ec,materialNormal:wc,materialOpacity:bc,materialPointSize:jc,materialReference:Ld,materialReflectivity:Nc,materialRefractionRatio:yd,materialRotation:Mc,materialRoughness:Sc,materialSheen:Pc,materialSheenRoughness:Bc,materialShininess:fc,materialSpecular:xc,materialSpecularColor:_c,materialSpecularIntensity:Tc,materialSpecularStrength:vc,materialThickness:Uc,materialTransmission:Vc,max:wo,maxMipLevel:sl,mediumpModelViewMatrix:zl,metalness:Sn,min:Eo,mix:ko,mixElement:jo,mod:ma,modInt:Da,modelDirection:Ll,modelNormalMatrix:Ol,modelPosition:Il,modelRadius:Ul,modelScale:Dl,modelViewMatrix:Gl,modelViewPosition:Vl,modelViewProjection:Zc,modelWorldMatrix:Fl,modelWorldMatrixInverse:kl,morphReference:wh,mrt:ly,mul:pa,mx_aastep:f_,mx_add:(e,t=Yi(0))=>ca(e,t),mx_atan2:(e=Yi(0),t=Yi(1))=>oo(e,t),mx_cell_noise_float:(e=Ju())=>ZT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Yi(e).sub(r).mul(t).add(r),mx_divide:(e,t=Yi(1))=>ga(e,t),mx_fractal_noise_float:(e=Ju(),t=3,r=2,s=.5,i=1)=>e_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Ju(),t=3,r=2,s=.5,i=1)=>r_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Ju(),t=3,r=2,s=.5,i=1)=>t_(e,Qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Ju(),t=3,r=2,s=.5,i=1)=>s_(e,Qi(t),r,s).mul(i),mx_frame:()=>Ty,mx_heighttonormal:(e,t)=>(e=nn(e),t=Yi(t),cc(e,t)),mx_hsvtorgb:p_,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=Yi(1))=>ha(t,e),mx_modulo:(e,t=Yi(1))=>ma(e,t),mx_multiply:(e,t=Yi(1))=>pa(e,t),mx_noise_float:(e=Ju(),t=1,r=0)=>YT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Ju(),t=1,r=0)=>QT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Ju(),t=1,r=0)=>{e=e.convert("vec2|vec3");return ln(QT(e),YT(e.add(en(19,73)))).mul(t).add(r)},mx_place2d:(e,t=en(.5,.5),r=en(1,1),s=Yi(0),i=en(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=en(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=Yi(1))=>Lo(e,t),mx_ramp4:(e,t,r,s,i=Ju())=>{const n=i.x.clamp(),a=i.y.clamp(),o=ko(e,t,n),u=ko(r,s,n);return ko(o,u,a)},mx_ramplr:(e,t,r=Ju())=>y_(e,t,r,"x"),mx_ramptb:(e,t,r=Ju())=>y_(e,t,r,"y"),mx_rgbtohsv:g_,mx_rotate2d:(e,t)=>{e=en(e);const r=(t=Yi(t)).mul(Math.PI/180);return ef(e,r)},mx_rotate3d:(e,t,r)=>{e=nn(e),t=Yi(t),r=nn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=Yi(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=Yi(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Ju())=>b_(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Ju())=>b_(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:m_,mx_subtract:(e,t=Yi(0))=>ha(e,t),mx_timer:()=>by,mx_transform_uv:(e=1,t=0,r=Ju())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Ju(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>c_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Ju(),r=en(1,1),s=en(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>h_(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Ju(),t=1)=>u_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec2:(e=Ju(),t=1)=>l_(e.convert("vec2|vec3"),t,Qi(1)),mx_worley_noise_vec3:(e=Ju(),t=1)=>d_(e.convert("vec2|vec3"),t,Qi(1)),negate:ho,neutralToneMapping:qb,nodeArray:Ui,nodeImmutable:ki,nodeObject:Ii,nodeObjectIntent:Di,nodeObjects:Vi,nodeProxy:Oi,nodeProxyIntent:Gi,normalFlat:id,normalGeometry:rd,normalLocal:sd,normalMap:oc,normalView:od,normalViewGeometry:nd,normalWorld:ud,normalWorldGeometry:ad,normalize:eo,not:Sa,notEqual:ya,numWorkgroups:gx,objectDirection:wl,objectGroup:ea,objectPosition:Rl,objectRadius:Pl,objectScale:Cl,objectViewPosition:Ml,objectWorldMatrix:Al,oneMinus:po,or:Na,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=by)=>e.fract(),oscSine:(e=by)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=by)=>e.fract().round(),oscTriangle:(e=by)=>e.add(.5).fract().mul(2).sub(1).abs(),output:On,outputStruct:ay,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),gp(e)),overloadingFn:yy,parabola:cy,parallaxDirection:ic,parallaxUV:(e,t)=>e.sub(ic.mul(t)),parameter:(e,t)=>Ii(new ey(e,t)),pass:(e,t,r)=>Ii(new Ib(Ib.COLOR,e,t,r)),passTexture:(e,t)=>Ii(new Lb(e,t)),pcurve:(e,t,r)=>Lo(ga(Lo(e,t),ca(Lo(e,t),Lo(ha(1,e),r))),1/t),perspectiveDepthToViewZ:Jh,pmremTexture:Im,pointShadow:TT,pointUV:ab,pointWidth:zn,positionGeometry:Wl,positionLocal:ql,positionPrevious:jl,positionView:Yl,positionViewDirection:Ql,positionWorld:Xl,positionWorldDirection:Kl,posterize:Pb,pow:Lo,pow2:Fo,pow3:Io,pow4:Do,premultiplyAlpha:fp,property:xn,radians:$a,rand:qo,range:cx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),ox(e,nx(t,r))},rangeFogFactor:nx,reciprocal:yo,reference:Md,referenceBuffer:Pd,reflect:Ro,reflectVector:vd,reflectView:Td,reflector:e=>Ii(new zy(e)),refract:Ho,refractVector:Nd,refractView:_d,reinhardToneMapping:Ub,remap:zu,remapClamp:Hu,renderGroup:Jn,renderOutput:Xu,rendererReference:Eu,rotate:ef,rotateUV:_y,roughness:Nn,round:fo,rtt:Yy,sRGBTransferEOTF:fu,sRGBTransferOETF:yu,sample:e=>Ii(new eb(e)),sampler:e=>(!0===e.isNode?e:ol(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:ol(e)).convert("samplerComparison"),saturate:zo,saturation:Eb,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),pp(e)),screenCoordinate:Vh,screenSize:Dh,screenUV:Ih,scriptable:sx,scriptableValue:Zb,select:eu,setCurrentStack:Wi,setName:iu,shaderStages:Hs,shadow:dT,shadowPositionWorld:Ux,shapeCircle:wT,sharedUniformGroup:Qn,sheen:An,sheenRoughness:Rn,shiftLeft:Ma,shiftRight:Pa,shininess:Un,sign:lo,sin:ro,sinc:(e,t)=>ro(ka.mul(t.mul(e).sub(1))).div(ka.mul(t.mul(e).sub(1))),skinning:bh,smoothstep:$o,smoothstepElement:Xo,specularColor:Dn,specularF90:Vn,spherizeUV:vy,split:(e,t)=>Ii(new Js(Ii(e),t)),spritesheetUV:wy,sqrt:Ya,stack:ry,step:Ao,stepElement:Ko,storage:mh,storageBarrier:()=>xx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),mh(e,t,r).setPBO(!0)),storageTexture:gb,string:(e="")=>Ii(new ii(e,"string")),struct:(e,t=null)=>{const r=new sy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;exx("texture").toStack(),textureBicubic:Cg,textureBicubicLevel:Rg,textureCubeUV:am,textureLoad:ul,textureSize:tl,textureStore:(e,t,r)=>{const s=gb(e,t,r);return null!==r&&s.toStack(),s},thickness:Wn,time:by,toneMapping:Au,toneMappingExposure:Ru,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Ii(new Db(t,r,Ii(s),Ii(i),Ii(n))),transformDirection:Vo,transformNormal:dd,transformNormalToView:cd,transformedClearcoatNormalView:gd,transformedNormalView:hd,transformedNormalWorld:pd,transmission:$n,transpose:To,triNoise3D:gy,triplanarTexture:(...e)=>Ay(...e),triplanarTextures:Ay,trunc:bo,uint:Zi,uniform:ra,uniformArray:pl,uniformCubeTexture:(e=Sd)=>wd(e),uniformFlow:su,uniformGroup:Yn,uniformTexture:(e=il)=>ol(e),unpremultiplyAlpha:yp,userData:(e,t,r)=>Ii(new bb(e,t,r)),uv:Ju,uvec2:rn,uvec3:on,uvec4:cn,varying:gu,varyingProperty:Tn,vec2:en,vec3:nn,vec4:ln,vectorComponents:$s,velocity:Nb,vertexColor:dp,vertexIndex:eh,vertexStage:mu,vibrance:wb,viewZToLogarithmicDepth:ep,viewZToOrthographicDepth:Qh,viewZToPerspectiveDepth:Zh,viewport:Uh,viewportCoordinate:kh,viewportDepthTexture:Kh,viewportLinearDepth:ip,viewportMipTexture:qh,viewportResolution:zh,viewportSafeUV:Sy,viewportSharedTexture:Ep,viewportSize:Oh,viewportTexture:Wh,viewportUV:Gh,wgsl:(e,t)=>Xb(e,t,"wgsl"),wgslFn:(e,t)=>Yb(e,t,"wgsl"),workgroupArray:(e,t)=>Ii(new _x("Workgroup",e,t)),workgroupBarrier:()=>xx("workgroup").toStack(),workgroupId:mx,workingToColorSpace:Tu,xor:Ea});const v_=new Jf;class N_ extends Tf{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(v_),v_.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(v_),v_.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;v_.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=ru(ln(u).mul(cb),{getUV:()=>hb.mul(ad),getTextureLevel:()=>db});let h=Zc;h=h.setZ(h.w);const p=new bp;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=S,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new X(new Oe(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=ln(u).mul(cb),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?v_.set(0,0,0,1):"alpha-blend"===a&&v_.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=v_.r,m.g=v_.g,m.b=v_.b,m.a=v_.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let S_=0;class E_{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=S_++}}class w_{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new E_(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class A_{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class R_{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class C_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class M_ extends C_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class P_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let B_=0;class L_{constructor(e=null){this.id=B_++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class F_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class I_{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class D_ extends I_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class V_ extends I_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class U_ extends I_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class O_ extends I_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class k_ extends I_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class G_ extends I_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class z_ extends I_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class H_ extends I_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class $_ extends D_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class W_ extends V_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class q_ extends U_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class j_ extends O_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class X_ extends k_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class K_ extends G_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Y_ extends z_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Q_ extends H_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Z_=new WeakMap,J_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),ev=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class tv{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=ry(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new L_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.currentStack=null,this.subBuildFn=null}getBindGroupsCache(){let e=Z_.get(this.renderer);return void 0===e&&(e=new mf,Z_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ue(e,t,r)}createCubeRenderTarget(e,t){return new Bp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new E_(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new E_(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Hs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${ev(n.r)}, ${ev(n.g)}, ${ev(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new A_(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===_)return"int";if(t===T)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=ws(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return J_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=ry(this.stack),this.stacks.push(qi()||this.stack),Wi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Wi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new A_("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new F_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new R_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new C_(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new M_(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new P_("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Kb,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ey(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new L_,this.stack=ry();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new bp),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Hs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new $_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new W_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new q_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new j_(e);if("color"===t)return new X_(e);if("mat2"===t)return new K_(e);if("mat3"===t)return new Y_(e);if("mat4"===t)return new Q_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${He} - Node System\n`}}class rv{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Us.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Us.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class sv{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}sv.isNodeFunctionInput=!0;class iv extends _T{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Bx(this.light),lightColor:e}}}const nv=new a,av=new a;let ov=null;class uv extends _T{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=ra(new r).setGroup(Jn),this.halfWidth=ra(new r).setGroup(Jn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;av.identity(),nv.copy(t.matrixWorld),nv.premultiply(r),av.extractRotation(nv),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(av),this.halfHeight.value.applyMatrix4(av)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=ol(ov.LTC_FLOAT_1),r=ol(ov.LTC_FLOAT_2)):(t=ol(ov.LTC_HALF_1),r=ol(ov.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Px(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){ov=e}}class lv extends _T{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=ra(0).setGroup(Jn),this.penumbraCosNode=ra(0).setGroup(Jn),this.cutoffDistanceNode=ra(0).setGroup(Jn),this.decayExponentNode=ra(0).setGroup(Jn),this.colorNode=ra(this.color).setGroup(Jn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return $o(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=Rx(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Bx(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=vT({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=ol(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class dv extends lv{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=ol(r,en(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const cv=$i(([e,t])=>{const r=e.abs().sub(t);return co(wo(r,0)).add(Eo(wo(r.x,r.y),0))});class hv extends lv{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=Yi(0),r=this.penumbraCosNode,s=Ax(this.light).mul(e.context.positionWorld||Xl);return ji(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=cv(e.xy.sub(en(.5)),en(.5)),n=ga(-1,ha(1,ao(r)).sub(1));t.assign(zo(i.mul(-2).mul(n)))}),t}}class pv extends _T{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class gv extends _T{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Cx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=ra(new e).setGroup(Jn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=ud.dot(s).mul(.5).add(.5),n=ko(r,t,i);e.context.irradiance.addAssign(n)}}class mv extends _T{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=pl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=T_(ud,this.lightProbe);e.context.irradiance.addAssign(t)}}class fv{parseFunction(){console.warn("Abstract function.")}}class yv{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}yv.isNodeFunction=!0;const bv=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,xv=/[a-z_0-9]+/gi,Tv="#pragma main";class _v extends yv{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(Tv),r=-1!==t?e.slice(t+12):e,s=r.match(bv);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=xv.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===Z||r.mapping===J||r.mapping===he){if(e.backgroundBlurriness>0||r.mapping===he)return Im(r);{let e;return e=!0===r.isCubeTexture?Ad(r):ol(r),Vp(e)}}if(!0===r.isTexture)return ol(r,Ih.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=Md("color","color",r).setGroup(Jn),t=Md("density","float",r).setGroup(Jn);return ox(e,ax(t))}if(r.isFog){const e=Md("color","color",r).setGroup(Jn),t=Md("near","float",r).setGroup(Jn),s=Md("far","float",r).setGroup(Jn);return ox(e,nx(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?Ad(r):!0===r.isTexture?ol(r):void console.error("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return Nv.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?yb(e,nn(Ih,gl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):ol(e,Ih).renderOutput(t.toneMapping,t.currentColorSpace);return Nv.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new rv,this.nodeBuilderCache=new Map,this.cacheLib={}}}const Av=new Me;class Rv{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new Dv(i.framebufferWidth,i.framebufferHeight,{format:de,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;kv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function $v(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function Wv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new wv(this,r),this._animation=new gf(this._nodes,this.info),this._attributes=new wf(r),this._background=new N_(this,this._nodes),this._geometries=new Cf(this._attributes,this.info),this._textures=new Zf(this,r,this.info),this._pipelines=new Df(r,this._nodes),this._bindings=new Vf(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new xf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Hf(this.lighting),this._bundles=new Pv,this._renderContexts=new Yf,this._animation.start(),this._initialized=!0,e(this)})),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:qv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new Rv),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)}),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Hl,this.overrideNodes.modelNormalViewMatrix=$l):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Hl&&this.overrideNodes.modelNormalViewMatrix===$l}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=x,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(Xv),p.scissorValue.copy(y).multiplyScalar(b).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(Xv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Rv),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Yv:Kv;t.isArrayCamera||(Qv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(Qv,t.coordinateSystem,t.reversedDepth));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:E,transparent:w,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_setXRLayerSize(e,t){this._width=e,this._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:c.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()}),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls;const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.delete(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Zv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=Zv.copy(t).floor()}else t=Zv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?Yv:Kv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Zv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(Qv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Zv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?Yv:Kv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Zv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(Qv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=S;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=qe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=E}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===E&&!1===i.forceSinglePass?(i.side=S,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=qe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=E):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class eN{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class tN extends eN{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Ef-e%Ef)%Ef;var e}get buffer(){return this._buffer}update(){return!0}}class rN extends tN{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let sN=0;class iN extends rN{constructor(e,t){super("UniformBuffer_"+sN++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class nN extends rN{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.texture=null},this.texture=t,this.version=t?t.version:0,this.generation=null,this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onDisposeTexture),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onDisposeTexture))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}}let lN=0;class dN extends uN{constructor(e,t){super(e,t),this.id=lN++,this.store=!1,this.isSampledTexture=!0}}class cN extends dN{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class hN extends cN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class pN extends cN{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const gN={textureDimensions:"textureSize",equals:"equal"},mN={low:"lowp",medium:"mediump",high:"highp"},fN={swizzleAssign:!0,storageBuffer:!1},yN={perspective:"smooth",linear:"noperspective"},bN={centroid:"centroid"},xN="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class TN extends tv{constructor(e,t){super(e,t,new vv),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==b}getMethod(e){return gN[e]||e}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?it:nt;2===s?n=i?lt:Ve:3===s?n=i?dt:ct:4===s&&(n=i?ht:de);const a={Float32Array:I,Uint8Array:Ce,Uint16Array:ut,Uint32Array:T,Int8Array:ot,Int16Array:at,Int32Array:_,Uint8ClampedArray:Ce},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=mN[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==_){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${yN[s.interpolationType]||s.interpolationType} ${bN[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${yN[e.interpolationType]||e.interpolationType} ${bN[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=fN[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}fN[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new cN(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new hN(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new pN(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new iN(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new oN(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let _N=null,vN=null;class NN{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void pt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void pt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return _N=_N||new t,this.renderer.getDrawingBufferSize(_N)}setScissorTest(){}getClearColor(){const e=this.renderer;return vN=vN||new Jf,e.getClearColor(vN),vN.getRGB(vN),vN}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:gt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${He} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let SN,EN,wN=0;class AN{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class RN{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===_,id:wN++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new AN(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let PN,BN,LN,FN=!1;class IN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===FN&&(this._init(),FN=!0)}_init(){const e=this.gl;PN={[Nr]:e.REPEAT,[vr]:e.CLAMP_TO_EDGE,[_r]:e.MIRRORED_REPEAT},BN={[v]:e.NEAREST,[Sr]:e.NEAREST_MIPMAP_NEAREST,[Ge]:e.NEAREST_MIPMAP_LINEAR,[Y]:e.LINEAR,[ke]:e.LINEAR_MIPMAP_NEAREST,[V]:e.LINEAR_MIPMAP_LINEAR},LN={[Pr]:e.NEVER,[Mr]:e.ALWAYS,[De]:e.LESS,[Cr]:e.LEQUAL,[Rr]:e.EQUAL,[Ar]:e.GEQUAL,[wr]:e.GREATER,[Er]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?Br:c.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===h?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=c.getPrimaries(c.workingColorSpace),a=t.colorSpace===b?null:c.getPrimaries(t.colorSpace),o=t.colorSpace===b||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,PN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,PN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,PN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,BN[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===Y&&u?V:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,BN[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,LN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===v)return;if(t.minFilter!==Ge&&t.minFilter!==V)return;if(t.type===I&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}function DN(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class VN{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class UN{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const ON={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class kN{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce((e,t)=>e+t,0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class HN extends NN{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new VN(this),this.capabilities=new UN(this),this.attributeUtils=new RN(this),this.textureUtils=new IN(this),this.bufferRenderer=new kN(this),this.state=new CN(this),this.utils=new MN(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new zN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(o)){const i=s.framebuffers[e.getCacheKey()];let n=t.COLOR_BUFFER_BIT;o.resolveDepthBuffer&&(o.depthBuffer&&(n|=t.DEPTH_BUFFER_BIT),o.stencilBuffer&&o.resolveStencilBuffer&&(n|=t.STENCIL_BUFFER_BIT));const a=s.msaaFrameBuffer,u=s.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i),d)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(pt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):pt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eON[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=qf(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,0)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const $N="point-list",WN="line-list",qN="line-strip",jN="triangle-list",XN="triangle-strip",KN="never",YN="less",QN="equal",ZN="less-equal",JN="greater",eS="not-equal",tS="greater-equal",rS="always",sS="store",iS="load",nS="clear",aS="ccw",oS="none",uS="front",lS="back",dS="uint16",cS="uint32",hS="r8unorm",pS="r8snorm",gS="r8uint",mS="r8sint",fS="r16uint",yS="r16sint",bS="r16float",xS="rg8unorm",TS="rg8snorm",_S="rg8uint",vS="rg8sint",NS="r32uint",SS="r32sint",ES="r32float",wS="rg16uint",AS="rg16sint",RS="rg16float",CS="rgba8unorm",MS="rgba8unorm-srgb",PS="rgba8snorm",BS="rgba8uint",LS="rgba8sint",FS="bgra8unorm",IS="bgra8unorm-srgb",DS="rgb9e5ufloat",VS="rgb10a2unorm",US="rgb10a2unorm",OS="rg32uint",kS="rg32sint",GS="rg32float",zS="rgba16uint",HS="rgba16sint",$S="rgba16float",WS="rgba32uint",qS="rgba32sint",jS="rgba32float",XS="depth16unorm",KS="depth24plus",YS="depth24plus-stencil8",QS="depth32float",ZS="depth32float-stencil8",JS="bc1-rgba-unorm",eE="bc1-rgba-unorm-srgb",tE="bc2-rgba-unorm",rE="bc2-rgba-unorm-srgb",sE="bc3-rgba-unorm",iE="bc3-rgba-unorm-srgb",nE="bc4-r-unorm",aE="bc4-r-snorm",oE="bc5-rg-unorm",uE="bc5-rg-snorm",lE="bc6h-rgb-ufloat",dE="bc6h-rgb-float",cE="bc7-rgba-unorm",hE="bc7-rgba-srgb",pE="etc2-rgb8unorm",gE="etc2-rgb8unorm-srgb",mE="etc2-rgb8a1unorm",fE="etc2-rgb8a1unorm-srgb",yE="etc2-rgba8unorm",bE="etc2-rgba8unorm-srgb",xE="eac-r11unorm",TE="eac-r11snorm",_E="eac-rg11unorm",vE="eac-rg11snorm",NE="astc-4x4-unorm",SE="astc-4x4-unorm-srgb",EE="astc-5x4-unorm",wE="astc-5x4-unorm-srgb",AE="astc-5x5-unorm",RE="astc-5x5-unorm-srgb",CE="astc-6x5-unorm",ME="astc-6x5-unorm-srgb",PE="astc-6x6-unorm",BE="astc-6x6-unorm-srgb",LE="astc-8x5-unorm",FE="astc-8x5-unorm-srgb",IE="astc-8x6-unorm",DE="astc-8x6-unorm-srgb",VE="astc-8x8-unorm",UE="astc-8x8-unorm-srgb",OE="astc-10x5-unorm",kE="astc-10x5-unorm-srgb",GE="astc-10x6-unorm",zE="astc-10x6-unorm-srgb",HE="astc-10x8-unorm",$E="astc-10x8-unorm-srgb",WE="astc-10x10-unorm",qE="astc-10x10-unorm-srgb",jE="astc-12x10-unorm",XE="astc-12x10-unorm-srgb",KE="astc-12x12-unorm",YE="astc-12x12-unorm-srgb",QE="clamp-to-edge",ZE="repeat",JE="mirror-repeat",ew="linear",tw="nearest",rw="zero",sw="one",iw="src",nw="one-minus-src",aw="src-alpha",ow="one-minus-src-alpha",uw="dst",lw="one-minus-dst",dw="dst-alpha",cw="one-minus-dst-alpha",hw="src-alpha-saturated",pw="constant",gw="one-minus-constant",mw="add",fw="subtract",yw="reverse-subtract",bw="min",xw="max",Tw=0,_w=15,vw="keep",Nw="zero",Sw="replace",Ew="invert",ww="increment-clamp",Aw="decrement-clamp",Rw="increment-wrap",Cw="decrement-wrap",Mw="storage",Pw="read-only-storage",Bw="write-only",Lw="read-only",Fw="read-write",Iw="non-filtering",Dw="comparison",Vw="float",Uw="unfilterable-float",Ow="depth",kw="sint",Gw="uint",zw="2d",Hw="3d",$w="2d",Ww="2d-array",qw="cube",jw="3d",Xw="all",Kw="vertex",Yw="instance",Qw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"};class Zw extends uN{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class Jw extends tN{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let eA=0;class tA extends Jw{constructor(e,t){super("StorageBuffer_"+eA++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class rA extends Tf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:ew}),this.flipYSampler=e.createSampler({minFilter:tw}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:XN,stripIndexFormat:cS},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:XN,stripIndexFormat:cS},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:nS,storeOp:sS,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:$w,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,uA=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,lA={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class dA extends yv{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(oA);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=uA.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class cA extends fv{parseFunction(e){return new dA(e)}}const hA="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},pA={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},gA={[Nr]:"repeat",[vr]:"clamp",[_r]:"mirror"},mA={vertex:hA?hA.VERTEX:1,fragment:hA?hA.FRAGMENT:2,compute:hA?hA.COMPUTE:4},fA={instance:!0,swizzleAssign:!1,storageBuffer:!0},yA={"^^":"tsl_xor"},bA={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},xA={},TA={tsl_xor:new jb("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new jb("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new jb("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new jb("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new jb("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new jb("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new jb("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new jb("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new jb("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new jb("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new jb("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new jb("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new jb("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},_A={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(TA.pow_float=new jb("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),TA.pow_vec2=new jb("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[TA.pow_float]),TA.pow_vec3=new jb("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[TA.pow_float]),TA.pow_vec4=new jb("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[TA.pow_float]),_A.pow_float="tsl_pow_float",_A.pow_vec2="tsl_pow_vec2",_A.pow_vec3="tsl_pow_vec3",_A.pow_vec4="tsl_pow_vec4");let vA="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(vA+="diagnostic( off, derivative_uniformity );\n");class NA extends tv{constructor(e,t){super(e,t,new cA),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${gA[e.wrapS]}S_${gA[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=xA[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Nr?(s.push(TA.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===vr?(s.push(TA.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===_r?(s.push(TA.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",xA[t]=r=new jb(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new au(new $u(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new au(new $u(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new au(new $u("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===I||!1===this.isSampleCompare(e)&&e.minFilter===v&&e.magFilter===v||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return!0===e.isDepthTexture&&!0===e.isArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i){return!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=yA[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(console.warn("WebGPURenderer: Atomic operations are only supported in compute shaders."),ks.READ_WRITE):ks.READ_ONLY:e.access}getStorageAccess(e,t){return pA[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new pN(i.name,i.node,o,n):new cN(i.name,i.node,o,n):"cubeTexture"===t?s=new hN(i.name,i.node,o,n):"texture3D"===t&&(s=new pN(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(mA[r]),!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Zw(`${i.name}_sampler`,i.node,o);e.setVisibility(mA[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?iN:tA)(e,o);n.setVisibility(mA[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new oN(u,o),s.setVisibility(mA[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=aA(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return bA[e]||e}isAvailable(e){let t=fA[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),fA[e]=t),t}_getWGSLMethod(e){return void 0!==TA[e]&&this._include(e),_A[e]}_include(e){const t=TA[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${vA}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class SA{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=YS:e.depth&&(t=KS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?$N:e.isLineSegments||e.isMesh&&!0===t.wireframe?WN:e.isLine?qN:e.isMesh?jN:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return FS;if(e===ce)return $S;throw new Error("Unsupported outputType")}}const EA=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&EA.set(Float16Array,["float16"]);const wA=new Map([[ze,["float16"]]]),AA=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class RA{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Uw)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=Uw:s.sampleType=Ow;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===_?s.sampleType=kw:e===T?s.sampleType=Gw:e===I&&(this.backend.hasFeature("float32-filterable")?s.sampleType=Vw:s.sampleType=Uw)}r.isSampledCubeTexture?s.viewDimension=qw:r.texture.isArrayTexture||r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=Ww:r.isSampledTexture3D&&(s.viewDimension=jw),e.texture=s}else if(r.isSampler){const s={};r.texture.isDepthTexture&&(null!==r.texture.compareFunction?s.type=Dw:t.compatibilityMode&&(s.type=Iw)),e.sampler=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount;let s=`view-${e.texture.width}-${e.texture.height}`;if(e.texture.depthOrArrayLayers>1&&(s+=`-${e.texture.depthOrArrayLayers}`),s+=`-${r}`,a=e[s],void 0===a){const i=Xw;let n;n=t.isSampledCubeTexture?qw:t.isSampledTexture3D?jw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Ww:$w,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class MA{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;s.blending===H||s.blending===k&&!1===s.transparent||(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise(e=>{l.createRenderPipelineAsync(S).then(t=>{c.pipeline=t,e()})});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===je){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:mw},r={srcFactor:i,dstFactor:n,operation:mw}};if(e.premultipliedAlpha)switch(s){case k:i(sw,ow,sw,ow);break;case Bt:i(sw,sw,sw,sw);break;case Pt:i(rw,nw,rw,sw);break;case Mt:i(uw,ow,rw,sw)}else switch(s){case k:i(aw,ow,sw,ow);break;case Bt:i(aw,sw,sw,sw);break;case Pt:console.error("THREE.WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Mt:console.error("THREE.WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=rw;break;case wt:t=sw;break;case Et:t=iw;break;case Tt:t=nw;break;case St:t=aw;break;case xt:t=ow;break;case vt:t=uw;break;case bt:t=lw;break;case _t:t=dw;break;case yt:t=cw;break;case Nt:t=hw;break;case 211:t=pw;break;case 212:t=gw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case kr:t=KN;break;case Or:t=rS;break;case Ur:t=YN;break;case Vr:t=ZN;break;case Dr:t=QN;break;case Ir:t=tS;break;case Fr:t=JN;break;case Lr:t=eS;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=vw;break;case jr:t=Nw;break;case qr:t=Sw;break;case Wr:t=Ew;break;case $r:t=ww;break;case Hr:t=Aw;break;case zr:t=Rw;break;case Gr:t=Cw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=mw;break;case ft:t=fw;break;case mt:t=yw;break;case Yr:t=bw;break;case Kr:t=xw;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?dS:cS),r.side){case qe:s.frontFace=aS,s.cullMode=lS;break;case S:s.frontFace=aS,s.cullMode=uS;break;case E:s.frontFace=aS,s.cullMode=oS;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?_w:Tw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=rS;else{const r=e.depthFunc;switch(r){case kt:t=KN;break;case Ot:t=rS;break;case Ut:t=YN;break;case Vt:t=ZN;break;case Dt:t=QN;break;case It:t=tS;break;case Ft:t=JN;break;case Lt:t=eS;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class PA extends GN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return pt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class BA extends NN{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new SA(this),this.attributeUtils=new RA(this),this.bindingUtils=new CA(this),this.pipelineUtils=new MA(this),this.textureUtils=new nA(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Qw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)});const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Qw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:iS}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea&&(u[0]=Math.min(i,a),u[1]=Math.ceil(i/a)),n.dispatchSize=u}u=n.dispatchSize}else u=i;a.dispatchWorkgroups(u[0],u[1]||1,u[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{this.pipelineUtils.setPipeline(t,u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&pt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new HN(e)));super(new t(e),e),this.library=new IA,this.isWebGPURenderer=!0}}class VA extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class UA{constructor(e,t=ln(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new bp;r.name="PostProcessing",this._quadMesh=new jy(r),this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=Xu(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=c.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}}class OA extends x{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=Y,this.minFilter=Y,this.isStorageTexture=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class kA extends ib{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class GA extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Yi()):Ii(new this.nodes[e])}}class zA extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class HA extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new GA;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new zA;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t
    - three.js - webgl RGBM texture loader example -